AttributeError: "modül" nesnesinin "testler" özniteliği yok


101

Bu komutu çalıştırıyorum:

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

ve şu hataya neden olur:

AttributeError: "modül" nesnesinin "testler" özniteliği yok

Aşağıda dizin yapım var. Ayrıca yüklü uygulamalar yapılandırmama app1 ekledim.

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'

Dizin yapısı:

görüntü açıklamasını buraya girin

Yanıtlar:


182

Sonunda başka bir sorun üzerinde çalışırken anladım. Sorun, testimin bir ithalat bulamamasıydı.

Testiniz içe aktarılamazsa yukarıdaki hatayı alıyorsunuz. Bu mantıklıdır çünkü test paketi bozuk bir testi içe aktaramaz. En azından test dosyamdaki içe aktarımı düzelttiğim ve kesinlikle çalışmaya başladığından emin olduğum için olan şeyin bu olduğunu düşünüyorum.

Test olayınızı doğrulamak için test durumu dosyasını python konsoluna aktarmayı deneyin.

Misal:

from project.apps.app1.tests import *

Bu mesajda kötü varsayım.
AdamC

1
Bu komut satırından da yapılabilir ve Python kabuğu açma ihtiyacını ortadan kaldırır:python -c "from project.apps.app1.tests import *"
Hakan B.

1
+1 beni kafa karıştırıcı hata mesajından kurtardı. Önerinizle ilgili tek sorun, ölüm yıldızını ithal etmiş olmanız . Tamam, deneyler için konsolda, ancak kodda, her zaman yalnızca gereken adları içe aktarın.
Peter M. - Monica'yı temsil eder

" Ölüm yıldızı " nın kullanımından korkmak yerine, __all__her dosyadaki değişkeni kullanamaz mısın? Kullanırken Ve ihracat için sınıf isimleri, fonksiyonlar ve değişkenlerin listesini belirtin from package_name.module import *? Bu kalıpta bol şansım oldu. __all__Her dosyanın en üstüne yazmanın biraz daha zaman aldığını anlıyorum . Ancak " ölüm yıldızı " kullanarak içe aktarmak güzel bir iş gibi görünüyor.
MikeyE

Bu sorunu yeni yaşadım ve gerçekten kafam karıştı. Cevap için teşekkürler. Python burada doğru şeyi yapmıyor. Daha net bir mesaja ihtiyacı var. Bununla birlikte, sizin "... içeriğinizin *" sadece testleri kontrol etmek için olduğunu varsayıyorum, test koşucusunun bir parçası olması amaçlanmadı ... Sanırım ikincisi uygunsuz olurdu.
rfportilla

35

Kullanım:

./manage.py shell

bunu takiben

import myapp.tests

ithalat hatasının doğasını bulmak için.


Çabayı takdir ediyorum ve bu birçok insan için işe yaramış gibi görünüyor. Ancak, kullanarak bir python etkileşimli kabuğu açtığımda ./manage.py shell, ikisinden biri import myapp.testsveya from myapp.tests import *her ikisi de hatasız çalıştı. Ancak yine de OP tarafından açıklanan hatayı alıyorum.
MikeyE

21

Durumum için , app/testsklasörümde boş bir __init__.py oluşturmam gerekiyor


6

Steve Bradshaw'ın yukarıdaki örneği içe aktarma hataları için çalışıyor (teşekkürler Steve).

Diğer türden hatalar (örn. ValueError) da

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

bu hataların ne olduğunu görmek için

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

4

Chris ile aynı hatayı aldım. Eski bir modeli sildim, ardından tests.py'yi çalıştırdım, ancak başka bir dosya (views.py) hala silinen modeli içe aktarmaya çalışıyordu.

Artık kullanılmayan import ifadesini çıkardığımda sorun çözüldü.


3

Komut dosyanızda kullandığınız tüm modüllerin bozuk olmadığından emin olun. Bununla ithalat ifadelerinizde yazım denetimi yapmayı kastediyorum.

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

Djano'nun etkileşimli konsolunda içe aktarma ifadelerini çalıştırarak modüllerinizi test edebilirsiniz.

$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

Döngüsel bir içe aktarma referansını düzelterek "AttributeError:" utils "modülünün" name_of_my_function "özniteliği yok" hatasını çözdüm. Dosyalarımın manage.py ve utils.py dosyalarının her birinde birbirine işaret eden bir içe aktarma ifadesi vardı.



1

Aynı hatayı aldım, ancak buradaki tüm nedenler listesini kontrol ettim, sorunumu çözmedi.

Son olarak şunu anlayın, bunun nedeni, içe aktarılan ancak henüz kullanılmayan bir yöntemin adının doğru olmamasıdır. Aptalca bir hata olsa da olur.


1

Ben de aynı hatayı aldım. Modülümü common.py olarak adlandırdığım için ortaya çıktı, ancak zaten başka bir common.py modülü vardı. Tek yapmam gereken modülümü yeniden adlandırmaktı.


0

Unittest.TestCase yazarken benzer bir hatayla karşılaştım. Aynı yöntem tanımını olduğu gibi yeniden yazdığımda işe yarıyor gibiydi!

PyCharm'da fark ettiğim tek değişiklik, kurulum (kendi kendine) yönteminin TestCase'de tanımlanan orijinal yöntemi geçersiz kılması gerektiğinden, 2. kez 'geçersiz kılma' simgesi pop-up'ıydı.

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.