Как организовать тест 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содержит TestCaseS для соответствующего модуля.

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

$ 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

Спасибо

14.12.2008 16:52:50
5 ОТВЕТОВ
РЕШЕНИЕ

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

8
16.12.2008 23:28:39
Я нашел проблему, тесты носа пропускают, потому что они исполняемые файлы. Я исправил сброс бита разрешения исполняемого файла и удаление свойства svn: execute от свойства subversion.
Andrea Francia 17.12.2008 19:34:58
Опция --exe предотвратит пропуски исполняемых файлов в тестах носа.
Jesse Merriman 28.09.2011 00:50:26
Вероятно, стоит подумать о переходе nose2вместо nosetest. nose2.readthedocs.io/en/latest/getting_started.html
pds 8.06.2017 08:45:32

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

Используйте 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
2
14.12.2008 17:37:18
Я бы предложил отразить структуру пакета программы в каталоге test. В противном случае тестовый каталог станет беспорядочным при расширении программы.
deamon 17.03.2011 21:45:53

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

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

0
14.12.2008 18:32:47

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

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

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

12
14.12.2008 18:41:31

Я не знаю о тестах на нос, но вы можете добиться этого с помощью стандартного модуля 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
15.12.2008 08:15:09
Это то, что я искал, за исключением того, что я думаю, что вы должны опускать ()после каждого имени пакета (по крайней мере в Python 2.6.5).
Trevor Burnham 21.06.2010 19:55:55
В Python 2.7 есть способ автоматического поиска тестовых модулей / пакетов, который проще поддерживать, чем не забывать явно добавлять их в test_all.py. См. Docs.python.org/library/unittest.html#test-discovery
Eric Smith 28.10.2011 15:54:49