Python unittest и обнаружение тестов

#python #unit-testing #python-2.7

#python #модульное тестирование #python-2.7

Вопрос:

Что именно мне нужно сделать, чтобы заставить python unittest работать? Я проверил официальную документацию, вопросы SO и даже пытался использовать nose , но пока ничего не получалось. Что я делаю не так?

 bash:~/path/to/project/src/tests$ ls -l
total 8
-rw-r--r-- 1 myuser myuser 342 Out 11 11:51 echo_test.py
-rw-r--r-- 1 myuser myuser  71 Out 11 11:28 __init__.py
bash:~/path/to/project/src/tests$ python -m unittest -v echo_test

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

OK
bash:~/path/to/project/src/tests$ python -m unittest discover

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

OK
bash:~/path/to/project/src/tests$ cat echo_test.py
import unittest

class EchoTest(unittest.TestCase):  
    def fooTest(self):
        self.assertTrue(1==1)

    def barTest(self):
        self.assertTrue(1==2)

#suite = unittest.TestLoader().loadTestsFromTestCase(TestEcho)
#unittest.TextTestRunner(verbosity=2).run(suite)

if __name__ == '__main__':
    unittest.main()
  

Как вы можете видеть, тесты просто не выполняются, и я понятия не имею, почему (поскольку я не программист на python).
Просто для информации, я использую python 2.7, и __init__.py это пустой файл.
Есть мысли?

Ответ №1:

Вам нужно переименовать методы, чтобы они начинались со слова «тест».

Как видно на http://docs.python.org/library/unittest.html :

Тестовый набор создается с помощью подкласса unittest.TestCase. Три отдельных теста определяются с помощью методов, имена которых начинаются с букв test . Это соглашение об именовании информирует тестировщика о том, какие методы представляют тесты.

Ответ №2:

Я хотел бы упомянуть, что вы НЕ МОЖЕТЕ запустить модульный тест python, как если бы это был исполняемый файл python. Например, это была моя проблема:

 python -m unittest ./TestMyPythonModule.py

... (stack trace) ...
ValueError: Empty module name
  

Сбой.

Однако это работает:

 python -m unittest TestMyPythonModule
  

Поначалу это легко не заметить.

Комментарии:

1. просто чтобы добавить сюда свои центы. если тестовый модуль TestMyPythonModule.py находится в папке tests , правильная команда python -m unittest tests.TestMyPythonModule . Иногда встроенные терминалы в IDE автозаполняют его python -m unittest .testsTestMyPythonModule , но это выдает Empty module name ошибку.

Ответ №3:

unittest.main() запустит все функции, которые начинаются с «test». Поэтому вам следует переименовать свои функции

 class EchoTest(unittest.TestCase):  
    def testfoo(self):
        self.assertTrue(1==1)

    def testbar(self):
        self.assertTrue(1==2)
  

Комментарии:

1. Это сработало для меня. Еще одна вещь, которую я должен был сделать, чтобы заставить discovery работать (вместо вызова unittest.main()), — это переименовать файл из name_test.py чтобы test_name.py

Ответ №4:

Тестовые функции должны начинаться с имени test , так fooTest и должно быть testFoo . Смотрите Документы здесь

Кроме того, нет необходимости в __init__.py файле, предполагая, что это единственные два файла в вашем tests каталоге.