Người chạy thử nghiệm Django không tìm thấy bài kiểm tra


78

Tôi mới làm quen với cả Python và Django và tôi đang học bằng cách tạo một trang web quản lý chế độ ăn uống nhưng tôi đã bị đánh bại hoàn toàn khi chạy các bài kiểm tra đơn vị của mình. Tất cả các tài liệu và blog mà tôi tìm thấy đều nói rằng miễn là nó có thể phát hiện được từ tests.py, tests.py nằm trong cùng thư mục với models.py và lớp con thử nghiệm của bạn TestCase, tất cả sẽ được chọn tự động. Điều này không hiệu quả với tôi, khi tôi chạy manage.py test <myapp>nó không tìm thấy bất kỳ kiểm tra nào.

Tôi đã bắt đầu với tất cả các thử nghiệm của mình trong gói riêng của họ nhưng đã đơn giản hóa nó xuống tất cả các thử nghiệm chỉ nằm trong tệp tests.py của tôi. Các tests.py hiện tại trông giống như:

import unittest
from pyDietTracker.models import Weight
from pyDietTracker.weight.DisplayDataAdapters import DisplayWeight

class TestDisplayWeight(unittest.TestCase):

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def testGetWeightInStone_KG_Correctly_Converted(self):
        weight = Weight()
        weight.weight = 99.8

        testAdapter = DisplayWeight(weight)
        self.assertEquals(testAdapter.GetWeightInStone(), '15 st 10 lb')   

Tôi đã thử nó bằng cách phân lớp con của lớp Django TestCase nhưng điều này cũng không hoạt động. Tôi đang sử dụng Django 1.1.1, Python 2.6 và tôi đang chạy Snow Leopard.

Tôi chắc chắn rằng tôi đang thiếu một cái gì đó rất cơ bản và rõ ràng nhưng tôi chỉ không thể tìm ra cái gì. Có ý kiến ​​gì không?

Chỉnh sửa: Chỉ là một bản cập nhật nhanh sau khi nhận xét

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'pyDietTracker',
 )

Để chạy các bài kiểm tra, tôi đang chạy manage.py test pyDietTracker


Bạn đang chạy lệnh nào để thực thi những lệnh này? Bạn settingstrông như thế nào? Ứng dụng này có trong danh sách INSTALLED_APPS không?
S.Lott

Tôi đã cập nhật câu hỏi với INSTALLED_APPS của mình, có phần cài đặt nào khác có liên quan không? Cảm ơn

Bạn thực sự nhận được tin nhắn nào?
S.Lott

Tôi không nhận được thông báo lỗi, nó chỉ cho biết 0 kiểm tra chạy. Tôi đang ở xa máy tính atm nhưng khi tôi cố gắng đặt tên trực tiếp cho lớp kiểm tra, tôi gặp lỗi dọc theo dòng của trường hợp kiểm tra không phù hợp. Tôi sẽ đăng nó lên chính xác khi tôi trở lại.

@ L2Type: Bạn không thể dễ dàng đặt tên trực tiếp cho lớp TestCase. Bạn đặt tên cho ứng dụng, các Á hậu Django làm nó điều khám phá bằng cách nhìn vào models.py và tests.py
S. Lott

Câu trả lời:


167

Tôi đã có cùng một vấn đề nhưng vấn đề của tôi khác nhau.

Tôi đã nhận được Ran 0 tests, với tư cách là OP.

Nhưng hóa ra các phương pháp thử nghiệm bên trong lớp thử nghiệm của bạn phải bắt đầu bằng từ khóa testđể chạy .

Thí dụ:

from django.test import TestCase


class FooTest(TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def this_wont_run(self):
        print 'Fail'

    def test_this_will(self):
        print 'Win'

Ngoài ra, các tệp có bài kiểm tra của bạn phải bắt đầu bằng testtừ khóa .


14
nếu nó vẫn không hoạt động, hãy kiểm tra xem tên tệp có khớp với mẫu này không: test*.pyĐây là cách django chọn tệp phù hợp thử nghiệm. django doc
linqu

Đối với những độc giả khác, cũng có một sự thay đổi để sử dụng TestCase của Django thay vì
Unittest.TestCase

89

Nếu bạn đang sử dụng một yourapp/testsgói / kiểu cho các đơn vị, hãy đảm bảo có một gói __init__.pytrong teststhư mục của bạn (vì đó là điều khiến nó trở thành một mô-đun Python!).


Đúng! Nếu bạn sử dụng thư mục tùy chỉnh cho ứng dụng mong muốn để chạy thử nghiệm (ví dụ: my_apps/app_name/", thì bạn nên tạo __init__.pytệp trong my_apps/.

31

Tôi có thể chạy thử nghiệm cho các ứng dụng cụ thể, ví dụ:

python project/manage.py test app_name

nhưng khi tôi chạy

python project/manage.py test

0 bài kiểm tra được tìm thấy

Tìm ra tôi cần chạy nó trong cùng một thư mục với management.py

vì vậy giải pháp sẽ là, cd vào thư mục dự án và chạy

python manage.py test

Điều tương tự cũng xảy ra với tôi ( github.com/agconti/cookiecutter-django-rest/blob/master/... )
Julien Lê Coupanec

2
Điều này đã giúp tôi, cảm ơn. Có vẻ như người chạy thử nghiệm phát hiện ra thư mục làm việc hiện tại, bản thân nó phải là một gói Python ( docs.djangoproject.com/en/dev/topics/testing/overview/… ). Ngoài ra, bạn có thể gọi các bài kiểm tra như thế nàypython project/manage.py test project/
rubick

15

Trong trường hợp của tôi, chính thư mục ứng dụng bị thiếu __init__.py. Điều này dẫn đến hành vi mà thử nghiệm sẽ được chạy python manage.py test project.app_namenhưng không chạy với python manage.py test.

project/
  app_name/
    __init__.py   # this was missing

1
Cảm ơn! Bạn đã giúp tôi tìm ra vấn đề của mình đó là tôi đã tạo một thư mục 'tests' để chứa các tập lệnh thử nghiệm của mình, nhưng lại quên thêm tệp init .py
Little Brain

Điều tương tự ở đây: Tôi đã project/apps/core, không có __init__.pytrong project/apps.
abcdn

Cảm ơn bạn đã đăng bài này - Tôi đã tạo một teststhư mục con nhưng quên đưa vào __init__.pybên dưới hướng đó. Thêm nó đã làm thủ thuật!
Ezra_Bender

Cảm ơn. Vật lộn với vấn đề này rất lâu. Cuối cùng, thêm __init__.pyvào ứng dụng đã hoạt động. Ban đầu tôi chỉ kiểm tra __init__.pytrong thư mục kiểm tra.
Pooja


12

Trong trường hợp của tôi, tôi đã gõ defthay vì class. Thay vì

class TestDisplayWeight(TestCase): # correct!

Tôi đã có

def TestDisplayWeight(TestCase): # wrong!

11

Làm việc đó ra.

Hóa ra tôi đã làm django-admin.py startproject pyDietTrackernhưng khôngpython manage.py startapp myApp . Sau khi quay lại và làm điều này, nó đã hoạt động như được ghi lại. Có vẻ như tôi có rất nhiều điều để tìm hiểu về cách đọc và sự khác biệt giữa một trang web và một ứng dụng trong Django.

Cảm ơn sự giúp đỡ của bạn S.Lott và Emil Stenström. Tôi ước tôi có thể chấp nhận cả hai câu trả lời của bạn vì cả hai đều được giúp đỡ rất nhiều.

Bài học quan trọng nhất Kiểm tra chỉ hoạt động ở cấp ứng dụng chứ không phải cấp trang web


10

Điều này cũng có thể xảy ra khi bạn đang sử dụng một testsmô-đun thay vì a tests.py. Trong trường hợp này, bạn cần nhập tất cả các lớp kiểm tra vào __init__.pymô-đun kiểm tra của mình, ví dụ:

tests/
    __init__.py
    somemodule.py

Trong của __init__.pybạn bây giờ, bạn cần phải nhập somemodulenhư thế này:

from .somemodule import *

1
đây là vấn đề của tôi và đã khắc phục nó nhờ bạn. Trân trọng!
dhargan

2
Điều này có thể hoạt động nhưng tôi không nghĩ đó là bản sửa lỗi phù hợp vì tôi có một dự án python khác không yêu cầu nhập này để chạy thử nghiệm.
Matt

Đó cũng là vấn đề của tôi. Cảm ơn rât nhiều!
dnsiv

Tôi đang sử dụng các tập lệnh để chạy thử nghiệm của mình. Một vài tháng và một máy tính mới sau đó, các bài kiểm tra bất ngờ bị phá vỡ. Điều này đã sửa nó. Không biết sự khác biệt là gì. Có thể là một phiên bản python khác. Có thể là một Django mới hơn ...
Chris

4

Đây là một cái khác mà tôi vừa có: Kiểm tra xem các tệp thử nghiệm của bạn không thực thi được hay không. Virtualbox của tôi đã tự động gắn chúng dưới dạng tệp thực thi để kiểm tra phát hiện ra chúng đã bỏ sót hoàn toàn. Tôi đã phải thêm chúng vào các __init__.pytệp liên quan trước khi ai đó cho tôi biết vấn đề xảy ra như thế nào, nhưng bây giờ chúng đã bị xóa, không thể thực thi và mọi thứ _just_works.


4

trong trường hợp của tôi, tôi bỏ lỡ việc bắt đầu tên hàm của mình với test_ và khi chạy thử nghiệm của tôi với:

python manage.py test myapp

kết quả là:

Creating test database for alias 'default'...
System check identified no issues (0 silenced).

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK
Destroying test database for alias 'default'...

Có vẻ như Django không thể nhận ra các bài kiểm tra của tôi!

sau đó tôi thay đổi tệp myproject / myapp / test.py như sau:

from django.test import TestCase
# Create your tests here.
class apitest(TestCase):

    def test_email(self):
        pass
    def test_secend(self):
        pass

sau đó kết quả là:

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
..
----------------------------------------------------------------------
Ran 2 tests in 2.048s

OK
Destroying test database for alias 'default'...

3

Điều này đã xảy ra khi tôi có tệp test.py và thử nghiệm / thư mục con, trong cùng một thư mục ứng dụng Django. Tôi đoán tôi đang nhầm lẫn với python hoặc trình chạy thử nghiệm cho dù tôi đang tìm kiếm một mô-đun thử nghiệm (trong test.py) hay một gói thử nghiệm (trong thử nghiệm / subir).


2

Sử dụng cú pháp này

python manage.py test

thay vì ./manage.py testgiải quyết vấn đề này cho tôi.


1

Nếu bạn đang cố gắng chạy thử nghiệm trong ứng dụng chính của mình, chẳng hạn như my_app / my_app /, hãy đảm bảo rằng bạn đã chọn những điều sau:

  1. Tên ứng dụng được liệt kê trong INSTALLED_APPS bên trong settings.py
  2. Đảm bảo DATABASES['default']bên trong của bạn settings.pyđược đặt đúng cách
  3. Ứng dụng có một models.py(ngay cả khi bạn không sử dụng, ít nhất phải có một ứng dụng trống)

4
Nếu bạn sử dụng thư mục '' tests '', hãy nhớ đặt tệp '' _ init _.py '' ở đó.
xbello

1

Xem https://docs.djangoproject.com/en/1.11/topics/testing/overview/

Lý do phổ biến nhất khiến các thử nghiệm không chạy là cài đặt của bạn không đúng và mô-đun của bạn không ở trong INSTALLED_APPS.

Chúng tôi sử dụng django.test.TestCasethay vì unittest.TestCase. Nó có Clientgói trong.

https://docs.djangoproject.com/en/1.11/topics/testing/tools/#django.test.TestCase


Cảm ơn, tôi đã qua trang và mô-đun của tôi là trong INSTALLED_APPS

các phương pháp kiểm tra bên trong lớp kiểm tra của bạn phải bắt đầu với kiểm tra từ khóa để chạy.
hassanzadeh.sd

0

Trong cùng một tệp, tôi có hai lớp thử nghiệm có TÊN CÙNG và tất nhiên điều này đã ngăn tất cả các thử nghiệm chạy.


0

Tôi đã tạo ra một phương thức được gọi là runtrong lớp thử nghiệm của mình, điều này hóa ra là một ý tưởng rất tồi. Python có thể thấy rằng tôi muốn chạy thử nghiệm, nhưng không thể. Vấn đề này hơi khác một chút, nhưng kết quả thì giống nhau - nó làm cho có vẻ như không thể tìm thấy các bài kiểm tra.

Lưu ý rằng thông báo sau đã được hiển thị: You want to run the existing test: <unittest.runner.TextTestResult run=0 errors=0 failures=0>


0

Chạy --help và tìm kiếm chi tiết. Điều chỉnh nó đến mức tối đa.

Tôi đã chạy manage.py test --verbosevà tìm thấy đầu ra gỡ lỗi này ngay trên cùng:

>nosetests --with-spec --spec-color --verbose --verbosity=2.

Ôi nhìn kìa! Tôi đã cài đặt và quên mất nosetests. Và nó nói --verbosity=2. Tôi đã tìm ra rằng 3 là tối đa và chạy nó với 3, tôi tìm thấy rất nhiều trong số này:

nose.selector: INFO: /media/sf_C_DRIVE/Users/me/git/django/app/tests/test_processors.py is executable; skipped

Điều đó đã cho tôi gợi ý đúng. Nó thực sự có vấn đề với các tệp có bộ x-bit. Tuy nhiên, tôi đã bị loại khỏi đường đua vì nó đã chạy MỘT SỐ bài kiểm tra - mặc dù nó đã nói rõ ràng rằng nó sẽ bỏ qua chúng. Không thể thay đổi các bit vì tôi chạy thử nghiệm trong máy ảo, chia sẻ đĩa Windows NTFS của mình. Vì vậy, thêm đã --exesửa nó.


0

Gặp vấn đề tương tự và đó là do tên tệp của tôi có ký tự -trong tên của nó. Tên tệp của tôi đã được route-tests.pyvà đã thay đổi thànhroute_tests.py


0

Nếu bạn gặp phải lỗi này sau khi nâng cấp lên Django 3, có thể là do -ktham số đã thay đổi ý nghĩa từ:

-k, --keepdb          Preserves the test DB between runs.

đến

-k TEST_NAME_PATTERNS   Only run test methods and classes that match the pattern or substring. Can be used multiple times. Same as unittest -k option.

Vì vậy, chỉ cần thay thế -kbằng --keepdbđể làm cho nó hoạt động trở lại.


0

Công cụ Django tìm kiếm các tệp và thư mục với test_tiền tố (bên trong teststhư mục). Trong trường hợp của tôi, đó là giải pháp đơn giản.

Vì vậy, hãy đảm bảo kiểm tra tên tệp / thư mục bắt đầu với nó.

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.