2012-04-27 2 views
8

Я написал пакет (http://github.com/anntzer/parsedcmd), который работает как с Python2, так и с Python3. Тем не менее, мне пришлось написать отдельные (py.test) модульные тесты для Python2 и Python3 (главным образом потому, что я хочу проверить дополнительные функции Python3, в частности аргументы только для ключевого слова), поэтому у меня есть test_py2.py и test_py3.py в подпапке test , Теперь, если я забегу, скажем py.test2 mypkg, test_py2 проходит, но test_py3 не работает с SyntaxError. Аналогично, для py.test3 mypkg, test_py3 проходит, но test_py2 терпит неудачу (я мог бы заставить эту работу работать, это всего лишь проблема StringIO, переместившись на io).py.test работает Python2 и Python3

Я могу спроектировать test подпакет так, что import mypkg.test импортирует только правильную версию тестов, но, по-видимому py.test не волнует - он видит только два файла, соответствующие test_* и захватывает все тесты в обоих из них, не обращая внимания что __init__.py говорит ему импортировать.

Так что сейчас я должен делать как py.test2 mypkg/test/test_py2.py, так и py.test3 mypkg/test/test_py3.py. Есть ли способ настроить все, чтобы py.test2 mypkg и py.test3 mypkg «просто работали»?

Спасибо.

ответ

5

Если вы можете сделать ваши модули доступными для всех интерпретаторов и, если необходимо, пропустить тесты, это общее решение. В противном случае вы можете поместить следующее как «conftest.py» в тестовом каталоге:

import sys 
py3 = sys.version_info[0] >= 3 

class DummyCollector(pytest.collect.File): 
    def collect(self): 
     return [] 

def pytest_pycollect_makemodule(path, parent): 
    bn = path.basename 
    if "py3" in bn and not py3 or ("py2" in bn and py3): 
    return DummyCollector(path, parent=parent) 

Это получает подобран плагин для конкретного проекта и будет правильно игнорировать тестовый модуль с именем файла, содержащего «PY2» или " py3 "в неверной версии интерпретатора. Конечно, вы можете уточнить его, чтобы иметь явный список непосредственно в файле conftest.py вместо проверки имени файла и т. Д.

HTH, holger

0

Поместите свои тесты в разные пакеты и выполните только тесты в соответствующей упаковке. Или загрузить соответствующий модуль тест в скрипте:

import sys, unittest 

cur_version = sys.version_info() 

if cur_version[0] < 3 
    import myApp.test.test_py2 
    unittest.TestLoader().loadTestsFromModule(myApp.test.test_py2).run() 
else: 
    import myApp.test.test_py3 
    unittest.TestLoader().loadTestsFromModule(myApp.test.test_py3).run() 

или использовать файл setup.py, так что вы можете запустить

python setup.py test

и поставить логику управления версиями там:

versionedTestSuite = "parsedcmd.test.test_py2" # do something as above here 
setup(name='parsedcmd', 
     ... 
     test_suite=versionedTestSuite, 
    ) 
Смежные вопросы