Как организовать тест python таким образом, чтобы я мог запускать все тесты в одной команде?

В настоящее время мой код организован в следующей древовидной структуре:

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

Спасибо

Ответы

Ответ 1

Если все начинаются с test, тогда работает только nosetest. Нос автоматически ищет файлы, начинающиеся с "test".

Ответ 2

Разделяете ли вы или смешиваете тесты и модули, вероятно, дело вкуса, хотя я бы решительно выступал за то, чтобы держать их в стороне (причины установки, статистика кодов и т.д.).

Когда вы используете 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, однако, в противном случае все тесты потерпят неудачу из-за отсутствия импорта.

Ответ 3

Я не знаю о носететах, но вы можете добиться этого со стандартным модулем 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())

Ответ 4

Это, вероятно, горячо оспариваемая тема, но я бы предложил вам отделить свои тесты от своих модулей. Настройте что-то вроде этого...

Используйте 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

Ответ 5

Я дам ответ 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")

Я не пробовал ваш конкретный сценарий.