Как организовать тест Python таким образом, чтобы я мог выполнять все тесты в одной команде? - PullRequest
14 голосов
/ 14 декабря 2008

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

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 s для соответствующего модуля.

С помощью следующих команд я могу запустить тесты, содержащиеся в одном файле, например:

$ 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

Спасибо

Ответы [ 5 ]

12 голосов
/ 14 декабря 2008

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

Когда вы используете тесты носа, убедитесь, что все каталоги с тестами являются реальными пакетами:

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 в каталоге верхнего уровня, и все тесты будут найдены. Необходимо убедиться, что src/ находится на PYTHONPATH, однако в противном случае все тесты не пройдут из-за отсутствия импорта.

8 голосов
/ 17 декабря 2008

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

4 голосов
/ 15 декабря 2008

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

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

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

foo/
    module1.py
    module2.py
    subpackage1/
        __init__.py
        moduleA.py
        moduleB.py

Теперь любой скрипт Python в любом месте может получить доступ к этим модулям, вместо того, чтобы искать их в локальном каталоге. Отложите все свои тесты в сторону, как это:

tests/
    test_module1.py
    test_module2.py
    test_subpackage1_moduleA,py
    test_subpackage2_moduleB.py

Я не уверен насчет вашей команды nosetests, но теперь, когда все ваши тесты находятся в одном каталоге, стало намного проще написать скрипт-обертку, который просто импортирует все остальные тесты в тот же каталог. Или, если это невозможно, вы можете, по крайней мере, обойтись простым циклом bash, который получает ваши тестовые файлы один за другим:

#!/bin/bash
cd tests/
for TEST_SCRIPT in test_*.py ; do
    nosetests -m $TEST_SCRIPT
done
0 голосов
/ 14 декабря 2008

Я дам 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")

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...