AttributeError: obiekt „module” nie ma atrybutu „testy”

101

Uruchamiam to polecenie:

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

i powoduje ten błąd:

AttributeError: obiekt „module” nie ma atrybutu „testy”

Poniżej znajduje się moja struktura katalogów. Dodałem również app1 do mojej zainstalowanej konfiguracji aplikacji.

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'

Struktura katalogów:

wprowadź opis obrazu tutaj

Chris
źródło

Odpowiedzi:

182

W końcu to rozgryzłem, pracując nad innym problemem. Problem polegał na tym, że mój test nie mógł znaleźć importu.

Wygląda na to, że pojawia się powyższy błąd, jeśli test nie powiedzie się. Ma to sens, ponieważ zestaw testów nie może zaimportować uszkodzonego testu. Przynajmniej myślę, że tak się dzieje, ponieważ naprawiłem import w moim pliku testowym i na pewno zaczął działać.

Aby zweryfikować swój przypadek testowy, po prostu spróbuj zaimportować plik przypadku testowego w konsoli Pythona.

Przykład:

from project.apps.app1.tests import *
Chris
źródło
Złe założenie w tej wiadomości.
AdamC
1
Można to również zrobić z wiersza poleceń, eliminując potrzebę otwierania powłoki Pythona:python -c "from project.apps.app1.tests import *"
Hakan B.
1
+1 uratowało mnie przed mylącym komunikatem o błędzie. Jedyny problem z twoją sugestią polega na tym, że zaimportowałeś gwiazdę śmierci . OK w konsoli do eksperymentów, ale w kodzie zawsze importuj tylko potrzebne nazwy.
Peter M. - oznacza Monikę
Zamiast bać się użycia „ gwiazdy śmierci ”, czy nie możesz po prostu użyć __all__zmiennej w każdym pliku? I określ listę nazw klas, funkcji i zmiennych do wyeksportowania podczas używania from package_name.module import *? Miałem szczęście z tym wzorem. Rozumiem, że zapisanie __all__bitu na początku każdego pliku zajmuje trochę więcej czasu . Ale importowanie przy użyciu „ gwiazdy śmierci ” wydaje się działać dobrze.
MikeyE
Właśnie miałem ten problem i byłem naprawdę zdezorientowany. Dziękuję za odpowiedź. Python nie robi tutaj właściwej rzeczy. Potrzebuje jaśniejszego komunikatu. Biorąc to pod uwagę, zakładam, że twój "... import *" służy tylko do sprawdzenia testów, a nie do bycia częścią programu uruchamiającego testy ... Myślę, że to drugie byłoby nieodpowiednie.
rfportilla
35

Posługiwać się:

./manage.py shell

śledzony przez

import myapp.tests

aby znaleźć charakter błędu importu.

Steve Bradshaw
źródło
Doceniam wysiłek i wygląda na to, że zadziałało to na wielu ludzi. Ale kiedy otworzyłem interaktywną powłokę Pythona za pomocą, ./manage.py shellwtedy jeden import myapp.testslub from myapp.tests import *oba działały bez błędów. Ale nadal pojawia się błąd opisany przez OP.
MikeyE
21

W moim przypadku muszę utworzyć pusty plik __init__.py w moim app/testsfolderze

tmin
źródło
6

Powyższy przykład Steve'a Bradshawa działa w przypadku błędów importu (dzięki Steve).

Inne rodzaje błędów (np. ValueError) również mogą powodować

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

żeby zobaczyć, jakie to błędy

./manage.py shell
from myapp.tests import SomeTestCase
t = SomeTestCase()
lukeaus
źródło
4

Miałem ten sam błąd co Chris. Usunąłem stary model, a następnie uruchomiłem tests.py, ale inny plik (views.py) nadal próbował zaimportować usunięty model.

Kiedy wyciągnąłem przestarzałą instrukcję importu, problem został rozwiązany.

Doug Murphy
źródło
3

Upewnij się, że wszystkie moduły, których używasz w swoim skrypcie, nie są uszkodzone. Rozumiem przez to sprawdzanie pisowni w instrukcjach importu.

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

Możesz przetestować swoje moduły, wykonując instrukcje importu w interaktywnej konsoli 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
Łukasz Dynowski
źródło
2

Rozwiązałem błąd „AttributeError: moduł 'utils' nie ma atrybutu 'name_of_my_function'”, naprawiając cykliczne odniesienie do importu. Moje pliki manage.py i utils.py miały instrukcję importu wskazującą na siebie.

rudyt
źródło
1

Zgodnie z dokumentem django Kiedy uruchamiasz testy , domyślnym zachowaniem narzędzia testowego jest znalezienie wszystkich przypadków testowych (czyli podklas unittest.TestCase ) w dowolnym pliku, którego nazwa zaczyna się od test, automatycznie tworzy zestaw testów z te przypadki testowe i uruchom ten pakiet.

więc spróbuj tego: python manage.py test tests.py

Kasravnd
źródło
1

Mam ten sam błąd, ale sprawdziłem tutaj listę wszystkich powodów, nie rozwiązałem mojego problemu.

W końcu zrozum, że powodem jest to, że nazwa jednej metody, która importowała, ale jeszcze nie była używana, jest nieprawidłowa. Choć jest to głupi błąd, zdarza się.

zhihong
źródło
1

Miałem ten sam błąd. Okazało się, że to dlatego, że nazwałem swój moduł common.py, ale istniał już inny moduł common.py. Wszystko, co musiałem zrobić, to zmienić nazwę mojego modułu.

Davide Andrea
źródło
0

Miałem podobny błąd podczas pisania unittest.TestCase. Kiedy przepisałem tę samą definicję metody, jak jest, wydawało się, że działa!

Jedyną zmianą, jaką zauważyłem w PyCharm, była wyskakująca ikona „override” po raz drugi, ponieważ metoda konfiguracji (własna) musi zastąpić oryginalną metodę zdefiniowaną w TestCase.

wprowadź opis obrazu tutaj

dpsahoo
źródło