AttributeError: ออบเจ็กต์ 'module' ไม่มีแอตทริบิวต์ 'testing'


101

ฉันใช้คำสั่งนี้:

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

และทำให้เกิดข้อผิดพลาดนี้:

AttributeError: ออบเจ็กต์ 'module' ไม่มีแอตทริบิวต์ 'testing'

ด้านล่างนี้คือโครงสร้างไดเร็กทอรีของฉัน ฉันได้เพิ่ม app1 ลงในการกำหนดค่าแอปที่ติดตั้งแล้วด้วย

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'

โครงสร้างไดเรกทอรี:

ป้อนคำอธิบายภาพที่นี่

คำตอบ:


182

ในที่สุดฉันก็พบว่ามันสามารถแก้ปัญหาอื่นได้ ปัญหาคือการทดสอบของฉันไม่พบการนำเข้า

ดูเหมือนว่าคุณจะได้รับข้อผิดพลาดข้างต้นหากการนำเข้าการทดสอบของคุณล้มเหลว สิ่งนี้สมเหตุสมผลเนื่องจากชุดทดสอบไม่สามารถนำเข้าการทดสอบที่เสียได้ อย่างน้อยฉันคิดว่านี่คือสิ่งที่เกิดขึ้นเพราะฉันแก้ไขการนำเข้าภายในไฟล์ทดสอบของฉันและแน่ใจว่ามันเริ่มทำงาน

ในการตรวจสอบกรณีทดสอบของคุณให้ลองนำเข้าไฟล์กรณีทดสอบใน python console

ตัวอย่าง:

from project.apps.app1.tests import *

ข้อสันนิษฐานที่ไม่ถูกต้องในข้อความนั้น
AdamC

1
นอกจากนี้ยังสามารถทำได้จากบรรทัดคำสั่งโดยไม่จำเป็นต้องเปิด Python shell:python -c "from project.apps.app1.tests import *"
Hakan B.

1
+1 ช่วยฉันจากข้อความแสดงข้อผิดพลาดที่ทำให้สับสน ปัญหาเฉพาะกับคำแนะนำของคุณคือการที่คุณนำเข้าการตายของดาว ตกลงในคอนโซลสำหรับการทดสอบ แต่ในโค้ดให้นำเข้าเฉพาะชื่อที่จำเป็นเสมอ
Peter M. - ย่อมาจาก Monica

แทนที่จะกลัวการใช้ " death star " คุณไม่สามารถใช้__all__ตัวแปรในแต่ละไฟล์ได้หรือไม่? และระบุรายชื่อคลาสฟังก์ชันและตัวแปรที่จะเอ็กซ์พอร์ตเมื่อใช้งานfrom package_name.module import *? ฉันโชคดีกับรูปแบบนี้ ฉันเข้าใจว่าต้องใช้เวลามากกว่านี้เล็กน้อยในการเขียน__all__บิตที่ด้านบนของแต่ละไฟล์ แต่การนำเข้าโดยใช้ " ดาวมรณะ " ดูเหมือนจะทำงานได้ดี
MikeyE

ฉันเพิ่งมีปัญหานี้และรู้สึกสับสนจริงๆ ขอบคุณสำหรับคำตอบ. Python ไม่ได้ทำสิ่งที่ถูกต้องที่นี่ ต้องการข้อความที่ชัดเจนกว่านี้ ตามที่กล่าวไว้ฉันถือว่า "... นำเข้า *" ของคุณเป็นเพียงการตรวจสอบการทดสอบไม่ได้หมายความว่าเป็นส่วนหนึ่งของนักวิ่งทดสอบ ... ฉันคิดว่าอย่างหลังจะไม่เหมาะสม
rfportilla

35

ใช้:

./manage.py shell

ติดตามโดย

import myapp.tests

เพื่อค้นหาลักษณะของข้อผิดพลาดในการนำเข้า


ฉันขอขอบคุณในความพยายามนี้และดูเหมือนว่าสิ่งนี้จะได้ผลกับหลาย ๆ คน แต่เมื่อฉันเปิดเชลล์แบบโต้ตอบ python โดยใช้./manage.py shellแล้วก็ทำงานอย่างใดอย่างหนึ่งimport myapp.testsหรือfrom myapp.tests import *ทั้งสองอย่างโดยไม่มีข้อผิดพลาด แต่ฉันยังคงได้รับข้อผิดพลาดที่อธิบายโดย OP
MikeyE

21

สำหรับกรณีของฉันฉันต้องสร้าง__init__.py ว่างในapp/testsโฟลเดอร์ของฉัน


6

ตัวอย่างของ Steve Bradshaw ด้านบนใช้สำหรับข้อผิดพลาดในการนำเข้า (ขอบคุณ Steve)

ข้อผิดพลาดประเภทอื่น ๆ (เช่น ValueError) อาจทำให้เกิด

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

เพื่อดูว่าข้อผิดพลาดเหล่านี้คืออะไร

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

4

ฉันมีข้อผิดพลาดเช่นเดียวกับคริส ฉันได้ลบโมเดลเก่าแล้วเรียกใช้ tests.py แต่ไฟล์อื่น (views.py) ยังคงพยายามนำเข้าโมเดลที่ถูกลบ

เมื่อฉันนำคำสั่งนำเข้าที่ล้าสมัยแล้วปัญหาได้รับการแก้ไข


3

ตรวจสอบให้แน่ใจว่าโมดูลทั้งหมดที่คุณใช้ในสคริปต์ของคุณไม่เสีย ด้วยเหตุนี้ฉันหมายถึงตรวจสอบการสะกดในคำสั่งนำเข้าของคุณ

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

คุณสามารถทดสอบโมดูลของคุณได้โดยดำเนินการคำสั่งการนำเข้าในคอนโซลแบบโต้ตอบของ 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

ฉันแก้ไขข้อผิดพลาด "AttributeError: module 'utils' has no attribute 'name_of_my_function'" โดยแก้ไขการอ้างอิงการนำเข้าแบบวงกลม ไฟล์ของฉัน Manage.py และ utils.py แต่ละไฟล์มีคำสั่งนำเข้าที่ชี้ไปที่กันและกัน


1

ตามเอกสาร django เมื่อคุณเรียกใช้การทดสอบพฤติกรรมเริ่มต้นของยูทิลิตี้ทดสอบคือการค้นหากรณีทดสอบทั้งหมด (นั่นคือคลาสย่อยของunittest.TestCase ) ในไฟล์ใด ๆ ที่มีชื่อขึ้นต้นด้วยการทดสอบสร้างชุดทดสอบโดยอัตโนมัติจาก กรณีทดสอบเหล่านั้นและเรียกใช้ชุดโปรแกรมนั้น

ลองสิ่งนี้: python manage.py test tests.py


1

มีข้อผิดพลาดเดียวกัน แต่ตรวจสอบรายการเหตุผลทั้งหมดที่นี่ไม่สามารถแก้ไขปัญหาของฉันได้

ในที่สุดก็พบว่าสาเหตุก็คือชื่อของวิธีการหนึ่งที่นำเข้า แต่ยังไม่ได้ใช้นั้นไม่ถูกต้อง แม้ว่าจะเป็นข้อผิดพลาดโง่ ๆ แต่ก็เกิดขึ้น


1

ฉันมีข้อผิดพลาดเดียวกัน มันกลายเป็นเพราะฉันตั้งชื่อโมดูลของฉันว่า common.py แต่ก็มีโมดูล common.py อื่น ๆ อยู่แล้ว สิ่งที่ฉันต้องทำคือเปลี่ยนชื่อโมดูลของฉัน


0

ฉันพบข้อผิดพลาดที่คล้ายกันขณะเขียน Unittest.TestCase เมื่อฉันพิมพ์คำจำกัดความของวิธีการเดียวกันอีกครั้งดูเหมือนว่าจะได้ผล!

การเปลี่ยนแปลงเดียวที่ฉันสังเกตเห็นใน PyCharm คือไอคอน 'แทนที่' ป๊อปอัปครั้งที่ 2 เนื่องจากวิธีการตั้งค่า (ด้วยตนเอง) จำเป็นต้องแทนที่วิธีการดั้งเดิมที่กำหนดไว้ใน TestCase

ป้อนคำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.