AttributeError: objek 'module' tidak memiliki atribut 'tes'

101

Saya menjalankan perintah ini:

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

dan itu menyebabkan kesalahan ini:

AttributeError: objek 'module' tidak memiliki atribut 'tes'

Di bawah ini adalah struktur direktori saya. Saya juga menambahkan app1 ke konfigurasi aplikasi yang saya instal.

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'

Struktur direktori:

masukkan deskripsi gambar di sini

Chris
sumber

Jawaban:

182

Saya akhirnya menemukannya untuk mengatasi masalah lain. Masalahnya adalah pengujian saya tidak dapat menemukan impor.

Sepertinya Anda mendapatkan kesalahan di atas jika pengujian Anda gagal untuk diimpor. Ini masuk akal karena rangkaian pengujian tidak dapat mengimpor pengujian yang rusak. Setidaknya saya pikir inilah yang terjadi karena saya memperbaiki impor dalam file pengujian saya dan cukup yakin itu mulai bekerja.

Untuk memvalidasi kasus uji Anda, coba impor file kasus uji di konsol python.

Contoh:

from project.apps.app1.tests import *
Chris
sumber
Asumsi buruk dalam pesan itu.
AdamC
1
Ini juga dapat dilakukan dari baris perintah, menghilangkan kebutuhan untuk membuka shell Python:python -c "from project.apps.app1.tests import *"
Hakan B.
1
+1 menyelamatkan saya dari pesan kesalahan yang membingungkan. Satu-satunya masalah dengan saran Anda adalah Anda mengimpor bintang kematian . Oke di konsol untuk eksperimen, tetapi dalam kode, selalu impor hanya nama yang diperlukan.
Peter M. - singkatan dari Monica
Daripada takut menggunakan " bintang kematian ", tidak bisakah Anda bercanda menggunakan __all__variabel di setiap file? Dan tentukan daftar nama kelas, fungsi, dan variabel yang akan diekspor saat menggunakan from package_name.module import *? Saya beruntung dengan pola ini. Saya mengerti bahwa perlu lebih banyak waktu untuk menulis __all__sedikit di bagian atas setiap file. Tapi mengimpor menggunakan " bintang kematian " tampaknya bekerja dengan baik.
MikeyE
Saya baru saja mengalami masalah ini dan benar-benar bingung. Terima kasih atas jawabannya. Python tidak melakukan hal yang benar di sini. Ini membutuhkan pesan yang lebih jelas. Karena itu, saya berasumsi "... import *" Anda hanya untuk memeriksa tes, tidak dimaksudkan untuk menjadi bagian dari pelari tes ... Saya pikir yang terakhir tidak pantas.
rfportilla
35

Menggunakan:

./manage.py shell

diikuti oleh

import myapp.tests

untuk menemukan sifat kesalahan impor.

Steve Bradshaw
sumber
Saya menghargai upaya tersebut, dan tampaknya ini berhasil bagi banyak orang. Tapi, ketika saya membuka shell interaktif python menggunakan ./manage.py shellmaka salah satu import myapp.testsatau from myapp.tests import *keduanya bekerja tanpa kesalahan. Tapi, saya masih mendapatkan kesalahan yang dijelaskan oleh OP.
MikeyE
21

Untuk kasus saya, saya perlu membuat __init__.py kosong di app/testsfolder saya

tmin
sumber
6

Contoh Steve Bradshaw di atas berfungsi untuk kesalahan impor (terima kasih Steve).

Jenis kesalahan lainnya (misalnya ValueError) juga dapat menyebabkan

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

untuk melihat apa kesalahan ini

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

Saya mengalami kesalahan yang sama dengan Chris. Saya telah menghapus model lama, lalu menjalankan tests.py, tetapi file lain (views.py) masih mencoba mengimpor model yang dihapus.

Ketika saya mengeluarkan pernyataan impor yang sekarang sudah usang, masalah terselesaikan.

Doug Murphy
sumber
3

Pastikan bahwa semua modul yang Anda gunakan di skrip Anda tidak rusak. Maksud saya, periksa ejaan dalam pernyataan impor Anda.

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

Anda dapat menguji modul Anda dengan menjalankan pernyataan import di konsol interaktif 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
Lukasz Dynowski
sumber
2

Saya mengatasi kesalahan "AttributeError: modul 'utils' tidak memiliki atribut 'name_of_my_function'" dengan memperbaiki referensi impor melingkar. File saya manage.py dan utils.py masing-masing memiliki pernyataan import yang menunjuk satu sama lain.

Rudyt
sumber
1

Menurut dokumen django Ketika Anda menjalankan pengujian Anda , perilaku default dari utilitas pengujian adalah menemukan semua kasus pengujian (yaitu, subkelas dari unittest.TestCase ) dalam file apa pun yang namanya dimulai dengan pengujian, secara otomatis membangun rangkaian pengujian dari kasus uji tersebut, dan jalankan suite tersebut.

jadi coba ini: python manage.py test tests.py

Kasravnd
sumber
1

Mendapat kesalahan yang sama, tetapi memeriksa semua daftar alasan di sini, tidak memperbaiki masalah saya.

Akhirnya ketahuilah bahwa, alasannya adalah nama salah satu metode yang diimpor tetapi belum digunakan tidak benar. Meskipun itu adalah kesalahan bodoh, itu terjadi.

zhihong
sumber
1

Saya mengalami kesalahan yang sama. Ternyata itu karena saya menamai modul saya common.py, namun sudah ada beberapa modul common.py lainnya. Yang harus saya lakukan adalah mengganti nama modul saya.

Davide Andrea
sumber
0

Saya mengalami kesalahan serupa saat menulis unittest.TestCase. Ketika saya mengetik ulang definisi metode yang sama sebagaimana adanya, sepertinya berhasil!

Satu-satunya perubahan yang saya perhatikan di PyCharm adalah pop-up ikon 'timpa' untuk kedua kalinya, karena metode penyiapan (sendiri) perlu mengganti metode asli yang ditentukan dalam TestCase.

masukkan deskripsi gambar di sini

dpsahoo
sumber