Ответ 1
Если все начинаются с test
, тогда работает только nosetest
. Нос автоматически ищет файлы, начинающиеся с "test".
В настоящее время мой код организован в следующей древовидной структуре:
src/
module1.py
module2.py
test_module1.py
test_module2.py
subpackage1/
__init__.py
moduleA.py
moduleB.py
test_moduleA.py
test_moduleB.py
Если файлы module*.py
содержат исходный код, а test_module*.py
содержит TestCase
для соответствующего модуля.
Со следующими командами я могу запускать тесты, содержащиеся в одном файле, например:
$ cd src
$ nosetests test_filesystem.py
..................
----------------------------------------------------------------------
Ran 18 tests in 0.390s
OK
Как я могу запускать все тесты? Я пробовал с помощью nosetests -m 'test_.*'
, но он не работает.
$cd src
$ nosetests -m 'test_.*'
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Спасибо
Если все начинаются с test
, тогда работает только nosetest
. Нос автоматически ищет файлы, начинающиеся с "test".
Разделяете ли вы или смешиваете тесты и модули, вероятно, дело вкуса, хотя я бы решительно выступал за то, чтобы держать их в стороне (причины установки, статистика кодов и т.д.).
Когда вы используете nosetests, убедитесь, что все каталоги с тестами являются реальными пакетами:
src/
module1.py
module2.py
subpackage1/
__init__.py
moduleA.py
moduleB.py
tests/
__init__.py
test_module1.py
test_module2.py
subpackage1/
__init__.py
test_moduleA.py
test_moduleB.py
Таким образом, вы можете просто запустить nosetests
в каталоге toplevel и все тесты будут найдены. Вы должны убедиться, что src/
находится на PYTHONPATH
, однако, в противном случае все тесты потерпят неудачу из-за отсутствия импорта.
Я не знаю о носететах, но вы можете добиться этого со стандартным модулем unittest. Вам просто нужно создать файл test_all.py
в корневом каталоге, а затем импортировать все ваши тестовые модули. В вашем случае:
import unittest
import test_module1
import test_module2
import subpackage1
if __name__ == "__main__":
allsuites = unittest.TestSuite([test_module1.suite(), \
test_module2.suite(), \
subpackage1.test_moduleA.suite(), \
subpackage1.test_moduleB.suite()])
каждый модуль должен предоставить следующую функцию (пример с модулем с двумя модульными тестами: Class1
и Class2
):
def suite():
""" This defines all the tests of a module"""
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(Class1))
suite.addTest(unittest.makeSuite(Class2))
return suite
if __name__ == '__main__':
unittest.TextTestRunner(verbosity=2).run(suite())
Это, вероятно, горячо оспариваемая тема, но я бы предложил вам отделить свои тесты от своих модулей. Настройте что-то вроде этого...
Используйте setup.py
, чтобы установить их в системный путь (или вы можете изменить переменные среды, чтобы избежать необходимости "установки" ).
foo/
module1.py
module2.py
subpackage1/
__init__.py
moduleA.py
moduleB.py
Теперь любой python script в любом месте может получить доступ к этим модулям, а не в зависимости от их поиска в локальном каталоге. Поместите свои тесты в сторону следующим образом:
tests/
test_module1.py
test_module2.py
test_subpackage1_moduleA,py
test_subpackage2_moduleB.py
Я не уверен в вашей команде nosetests
, но теперь, когда ваши тесты все находятся в одном каталоге, становится проще писать оболочку script, которая просто импортирует все остальные тесты в том же каталоге, Или, если это невозможно, вы можете по крайней мере уйти с простым циклом bash
, который получает ваши тестовые файлы один за другим:
#!/bin/bash
cd tests/
for TEST_SCRIPT in test_*.py ; do
nosetests -m $TEST_SCRIPT
done
Я дам ответ Testoob.
Запуск тестов в одном файле похож на Nose:
testoob test_foo.py
Чтобы запускать тесты во многих файлах, вы можете создавать пакеты с коллекторами Testoob (в каждом подпакете)
# src/subpackage?/__init__.py
def suite():
import testoob
return testoob.collecting.collect_from_files("test_*.py")
и
# src/alltests.py
test_modules = [
'subpackage1.suite',
'subpackage2.suite',
]
def suite():
import unittest
return unittest.TestLoader().loadTestsFromNames(test_modules)
if __name__ == "__main__":
import testoob
testoob.main(defaultTest="suite")
Я не пробовал ваш конкретный сценарий.