Бігун тесту Django не знаходить тестів


78

Я новачок як у Python, так і в Django, і я вчусь, створюючи сайт з управління дієтами, але я був повністю переможений, запустивши свої модульні тести. Усі знайдені мною документи та блоги говорять, що поки це можна виявити за допомогою tests.py, tests.py знаходиться в тій самій папці, що і models.py, а також підкласи вашого тестового класу TestCase, це все повинно бути отримано автоматично. Це не працює для мене, коли я запускаю, manage.py test <myapp>він не знаходить жодних тестів.

Я розпочав з усіх своїх тестів у власному пакеті, але спростив їх до всіх тестів, які просто перебувають у моєму файлі tests.py. Поточний test.py виглядає так:

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')   

Я спробував це, також підкласуючи клас Django TestCase, але це теж не спрацювало. Я використовую Django 1.1.1, Python 2.6 і запускаю Snow Leopard.

Я впевнений, мені не вистачає чогось дуже елементарного та очевидного, але я просто не можу зрозуміти, що. Будь-які ідеї?

Редагувати: Просто швидке оновлення після коментаря

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

Щоб отримати тести для запуску, я біжу manage.py test pyDietTracker


Яку команду ви виконуєте, щоб їх виконати? Як ти settingsвиглядаєш? Чи є ця програма у списку INSTALLED_APPS?
S.Lott

Я оновив запитання за допомогою INSTALLED_APPS, чи існує інша частина налаштувань, яка є релевантною? Дякую

Які повідомлення ви насправді отримуєте?
S.Lott

Я не отримую повідомлення про помилку, в ньому просто написано: 0 тестів. Я далеко від банкомату комп’ютера, але коли я намагаюся безпосередньо назвати клас тесту, я отримую помилку, яка відповідає невідповідному тестовому випадку. Я опублікую це саме тоді, коли повернусь.

@ L2Type: Ви не можете легко назвати клас TestCase безпосередньо. Ви називаєте додаток, бігун Django робить це для виявлення, заглядаючи в models.py та tests.py
S.Lott

Відповіді:


167

У мене була та сама проблема, але моя проблема була іншою.

Я отримував Ran 0 tests, як OP.

Але тепер з'ясовується , що методи випробувань всередині тестового класу повинен починатися з ключовим словом testдля запуску .

Приклад:

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'

Також файли з тестами повинні починатися з testключового слова .


14
якщо це все ще не працює, перевірте, чи ім'я файлу відповідає такому шаблону: test*.pyОсь як django вибирає файли тестового костюма. django doc
linqu

Для інших читачів також є зміна використовувати Django's TestCase замість unittest.TestCase
carlosayam

90

Якщо ви використовуєте yourapp/testsпакет / стиль для unittests, переконайтеся, що __init__.pyу вашій testsпапці є (оскільки саме це робить його модулем Python!).


Так! Якщо ви використовуєте власну папку для потрібного додатка для запуску тестів (наприклад: my_apps/app_name/", то вам слід створити __init__.pyфайл у my_apps/.

31

Я можу запустити тест для певних програм, наприклад

python project/manage.py test app_name

але коли я біжу

python project/manage.py test

Знайдено 0 тестів

З'ясуйте, що мені потрібно запустити це в тому ж каталозі, що і manage.py

отже рішення буде, cd до каталогу проекту та запустіть

python manage.py test


2
Це мені допомогло, дякую. Здається, програма запуску тестів виявляє поточний робочий каталог, який сам повинен бути пакетом Python ( docs.djangoproject.com/en/dev/topics/testing/overview/… ). Крім того, ви можете викликати такі тестиpython project/manage.py test project/
Rubick

15

У моєму випадку в самій папці програми бракувало файлу __init__.py. Це призводить до поведінки, з якою буде запущено тест, python manage.py test project.app_nameале не з ним python manage.py test.

project/
  app_name/
    __init__.py   # this was missing

1
Дякую! Ви допомогли мені знайти мою проблему, яка полягала в тому, що я створив папку "тести" для зберігання моїх тестових сценаріїв, але забув додати файл init .py
Маленький мозок

Те ж саме тут: у мене було project/apps/core, без __init__.pyвходу project/apps.
abcdn

Дякуємо за публікацію - я створив testsпідпапку, але забув включити __init__.pyпід цим напрямком. Додавши це, це зробило трюк!
Ezra_Bender

Дякую. Боровся з цією проблемою дуже довго. Нарешті додавання __init__.pyдо програми працювало. Спочатку я просто перевіряв __init__.pyпапку тестів.
Pooja


12

У моєму випадку я набрав defзамість class. Замість

class TestDisplayWeight(TestCase): # correct!

я мав

def TestDisplayWeight(TestCase): # wrong!

11

Опрацювали.

Виявляється, я це зробив, django-admin.py startproject pyDietTrackerале ні python manage.py startapp myApp. Повернувшись назад і зробивши це, він справді працював, як зафіксовано. Здається, мені потрібно багато чому навчитися про читання та різницю між сайтом та додатком у Django.

Дякуємо за допомогу С.Лотт та Еміль Стенстрем. Я хотів би прийняти обидві ваші відповіді, бо їм обом дуже допомогли.

Найважливіші тести уроків працюють лише на рівні програми, а не на рівні сайту


10

Це також може статися, коли ви використовуєте testsмодуль замість tests.py. У цьому випадку вам потрібно імпортувати всі тестові класи в __init__.pyмодуль тестування, наприклад

tests/
    __init__.py
    somemodule.py

У ваш __init__.pyтепер вам потрібно імпортувати наступне somemodule:

from .somemodule import *

1
це була моя проблема і вирішила її завдяки вам. з повагою!
dhargan

2
Це може спрацювати, але я не думаю, що це правильне виправлення, оскільки у мене є інший проект python, який не вимагає цього імпорту для запуску тестів.
Метт

Це теж була моя проблема. Дуже дякую!
dnsiv

Я використовую сценарії для запуску тестів. Через кілька місяців і новий комп’ютер пізніше тести несподівано зірвались. Це виправило це. Не уявляю, в чому різниця. Можливо інша версія python. Можливо, новіший Джанго ...
Кріс,

4

Ось ще один, який я щойно мав: перевірте, чи не виконуються ваші тестові файли. Мій віртуальний ящик автоматично змонтував їх як виконувані файли, тому тестове виявлення пропустило їх повністю. Мені довелося додавати їх у відповідні __init__.pyфайли, перш ніж хтось повідомив мені, в чому проблема, навколо, але тепер вони видалені, не виконуються і все _ просто_ працює.


4

в моєму випадку я пропускаю запуск імені моїх функцій з test_, а при запуску тесту з:

python manage.py test myapp

результат був:

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'...

здається, Django не може розпізнати мої тести!

тоді я зміню файл myproject / myapp / test.py таким чином:

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

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

після цього результат:

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

У мене це сталося, коли у мене був файл test.py та тест / підкаталог у тому ж каталозі програми Django. Я здогадуюсь, що я плутаю python або тест-драйвер, чи шукаю я тестовий модуль (у test.py) або тестовий пакет (у test / subdir).



1

Якщо ви намагаєтеся запустити тест у головному додатку, наприклад my_app / my_app /, переконайтеся, що встановлено таке:

  1. Назва програми вказана в INSTALLED_APPS всередині settings.py
  2. Переконайтеся, що ви DATABASES['default']всерединіsettings.py частина встановлена ​​належним чином
  3. У додатку є models.py(навіть якщо ви його не використовуєте, для його перебування потрібно принаймні порожній)

4
Якщо ви використовуєте папку '' tests '', не забудьте помістити туди файл '' _ init _.py ''.
xbello

1

Подивитися Https://docs.djangoproject.com/en/1.11/topics/testing/overview/

Найпоширеніша причина не запущених тестів полягає в тому, що ваші налаштування неправильні, а ваш модуль не в INSTALLED_APPS.

Ми використовуємо django.test.TestCaseзамість unittest.TestCase. Він маєClient пов’язаний.

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


Дякую, я перейшов сторінку, і мій модуль знаходиться в INSTALLED_APPS

Методи тестування у вашому тестовому класі повинні починатися з тестування ключових слів.
hassanzadeh.sd

0

У тому ж файлі я мав два тестові класи з тим самим ІМ'ЄМ , і, звичайно, це перешкоджало запуску всіх тестів.


0

Я створив метод, викликаний runу моєму тестовому класі, що виявилося дуже поганою ідеєю. Python бачив, що я хотів запустити тести, але не зміг. Ця проблема дещо інша, але результат однаковий - здавалося, що тести неможливо знайти.

Зверніть увагу, що відображалося таке повідомлення: You want to run the existing test: <unittest.runner.TextTestResult run=0 errors=0 failures=0>


0

Біжи --helpі шукай багатослів’я. Поверніть його до макс.

Я запустив manage.py test --verboseі знайшов цей вивід налагодження прямо вгорі:

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

О дивіться! Я встановив і забув nosetests. І це говорить --verbosity=2. Я зрозумів, що 3 - це максимум, і запустивши його з 3, я знайшов багато таких:

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

Це дало мені правильний підказку. Це справді має проблеми з файлами, які мають x-біт. Однак мене викинули з доріжки, оскільки він провів ДЕЯКІ випробування - хоча прямо заявив, що їх пропустить. Зміна бітів неможлива, оскільки я запускаю тести у віртуальній машині, спільно використовуючи свій Windows NTFS-диск. Тож додавання --exeвиправило.


0

Була та сама проблема, і це тому, що в моєму імені файлу було -позначено символом. Моє ім'я файлу було route-tests.pyі змінено наroute_tests.py


0

Якщо ця помилка виникла після оновлення до Django 3, можливо, -kпараметр змінив значення із:

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

до

-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.

Так просто замінити -kз , --keepdbщоб змусити його працювати знову.


0

Механізм Django здійснює пошук файлів і папок із test_префіксом (усередині testsпапки). У моєму випадку це було просте рішення.

Отже, переконайтеся, що назва файлу / папки починається з нього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.