AttributeError: Đối tượng 'module' không có thuộc tính 'tests'


101

Tôi đang chạy lệnh này:

python manage.py test project.apps.app1.tests

và nó gây ra lỗi này:

AttributeError: Đối tượng 'module' không có thuộc tính 'tests'

Dưới đây là cấu trúc thư mục của tôi. Tôi cũng đã thêm app1 vào cấu hình ứng dụng đã cài đặt của mình.

Traceback (most recent call last):
    File "manage.py", line 10, in <module> execute_from_command_line(sys.argv)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 50, in run_from_argv
    super(Command, self).run_from_argv(argv)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 71, in execute
    super(Command, self).execute(*args, **options)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 88, in handle
    failures = test_runner.run_tests(test_labels)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/test/runner.py", line 146, in run_tests
    suite = self.build_suite(test_labels, extra_tests)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/test/runner.py", line 66, in build_suite
    tests = self.test_loader.loadTestsFromName(label)
    File "/usr/lib/python2.7/unittest/loader.py", line 100, in loadTestsFromName
    parent, obj = obj, getattr(obj, part)
    AttributeError: 'module' object has no attribute 'tests'

Cấu trúc thư mục:

nhập mô tả hình ảnh ở đây

Câu trả lời:


182

Cuối cùng tôi đã tìm ra nó để giải quyết một vấn đề khác. Vấn đề là thử nghiệm của tôi không thể tìm thấy một lần nhập.

Có vẻ như bạn gặp lỗi ở trên nếu thử nghiệm của bạn không nhập được. Điều này có ý nghĩa vì bộ thử nghiệm không thể nhập thử nghiệm bị hỏng. Ít nhất tôi nghĩ đây là những gì đang diễn ra vì tôi đã sửa lỗi nhập trong tệp thử nghiệm của mình và đủ chắc chắn rằng nó đã bắt đầu hoạt động.

Để xác thực trường hợp thử nghiệm của bạn, chỉ cần thử nhập tệp trường hợp thử nghiệm trong bảng điều khiển python.

Thí dụ:

from project.apps.app1.tests import *

Giả định xấu trong tin nhắn đó.
AdamC

1
Điều này cũng có thể được thực hiện từ dòng lệnh, loại bỏ sự cần thiết phải mở trình bao Python:python -c "from project.apps.app1.tests import *"
Hakan B.

1
+1 đã cứu tôi khỏi thông báo lỗi khó hiểu. Vấn đề duy nhất với gợi ý của bạn là bạn đã nhập Death star . OK trong bảng điều khiển cho thử nghiệm, nhưng trong mã, luôn chỉ nhập những tên cần thiết.
Peter M. - là viết tắt của Monica

Thay vì sợ sử dụng " ngôi sao chết chóc ", bạn không thể sử dụng __all__biến trong mỗi tệp? Và chỉ định danh sách tên lớp, hàm, biến cần xuất khi sử dụng from package_name.module import *? Tôi đã gặp may mắn với mẫu này. Tôi hiểu rằng cần thêm một chút thời gian để viết lên __all__phần đầu của mỗi tệp. Nhưng nhập bằng cách sử dụng " death star " có vẻ hoạt động tốt.
MikeyE

Tôi vừa gặp vấn đề này và thực sự bối rối. Cảm ơn vì câu trả lời. Python không làm đúng ở đây. Nó cần một thông điệp rõ ràng hơn. Nói như vậy, tôi cho rằng "... nhập *" của bạn chỉ là để kiểm tra các bài kiểm tra, không có nghĩa là một phần của người chạy kiểm tra ... Tôi nghĩ cái sau sẽ không phù hợp.
rfportilla

35

Sử dụng:

./manage.py shell

theo dõi bởi

import myapp.tests

để tìm bản chất của lỗi nhập.


Tôi đánh giá cao nỗ lực và có vẻ như điều này đã hiệu quả với nhiều người. Tuy nhiên, khi tôi mở một trình bao tương tác python ./manage.py shellthì một trong hai import myapp.testshoặc from myapp.tests import *cả hai đều hoạt động mà không có lỗi. Tuy nhiên, tôi vẫn gặp lỗi được mô tả bởi OP.
MikeyE

21

Đối với trường hợp của tôi, tôi cần tạo __init__.py trống trong app/teststhư mục của mình


6

Ví dụ của Steve Bradshaw ở trên phù hợp với các lỗi nhập (cảm ơn Steve).

Các loại lỗi khác (ví dụ: ValueError) cũng có thể gây ra

AttributeError: 'module' object has no attribute 'tests'

để xem những lỗi này là gì

./manage.py shell
from myapp.tests import SomeTestCase
t = SomeTestCase()

4

Tôi đã có lỗi tương tự như Chris. Tôi đã xóa một mô hình cũ, sau đó chạy tests.py, nhưng một tệp khác (views.py) vẫn đang cố gắng nhập mô hình đã xoá.

Khi tôi lấy ra báo cáo nhập hiện đã lỗi thời, vấn đề đã được giải quyết.


3

Đảm bảo rằng tất cả các mô-đun bạn đang sử dụng trong tập lệnh của mình không bị hỏng. Điều này có nghĩa là tôi kiểm tra chính tả trong các câu lệnh nhập của bạn.

# invalid import
from app.model.notification import Notification
# valid import
from app.models.notification import Notification

Bạn có thể kiểm tra các mô-đun của mình bằng cách thực hiện các câu lệnh nhập trong bảng điều khiển tương tác của djano.

$root@13faefes8: python manage.py shell
Type "help", "copyright", "credits" or "license" for more information (InteractiveConsole)
>>> from app.model.notification import Notification
Traceback (most recent call last): 
   File "<console>", line 1, in <module>
ImportError: No module named model.notification

2

Tôi đã giải quyết lỗi "AttributeError: module 'utils' không có thuộc tính 'name_of_my_osystem'" bằng cách sửa một tham chiếu nhập vòng tròn. Các tệp của tôi management.py và utils.py đều có một câu lệnh nhập trỏ vào nhau.


1

Theo tài liệu django Khi bạn chạy các thử nghiệm của mình , hành vi mặc định của tiện ích thử nghiệm là tìm tất cả các trường hợp thử nghiệm (nghĩa là, các lớp con của unittest.TestCase ) trong bất kỳ tệp nào có tên bắt đầu bằng thử nghiệm, tự động xây dựng một bộ thử nghiệm từ các trường hợp thử nghiệm đó và chạy bộ phần mềm đó.

vì vậy hãy thử điều này: python manage.py test tests.py


1

Gặp lỗi tương tự, nhưng đã kiểm tra tất cả danh sách lý do ở đây, không khắc phục được sự cố của tôi.

Cuối cùng tìm ra rằng, nguyên nhân là do tên của một phương thức đã nhập nhưng chưa được sử dụng chưa đúng. Mặc dù đó là một lỗi ngu ngốc nhưng nó vẫn xảy ra.


1

Tôi đã có những lỗi giống nhau. Hóa ra là do tôi đặt tên mô-đun của mình là common.py, nhưng đã có một số mô-đun common.py khác. Tất cả những gì tôi phải làm là đổi tên mô-đun của mình.


0

Tôi đã gặp lỗi tương tự khi viết một unittest.TestCase. Khi tôi gõ lại định nghĩa phương thức tương tự như hiện tại, nó dường như hoạt động!

Thay đổi duy nhất tôi nhận thấy trên PyCharm là biểu tượng 'ghi đè' bật lên lần thứ hai, vì phương thức thiết lập (self) cần ghi đè phương thức ban đầu được xác định trong TestCase.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.