2016-06-30 2 views
3

Мы определили все наши пользовательские утверждения в отдельном файле python, который не является тестовым модулем.Как утверждать, что pytest rewrite утверждать в не-тестовых модулях

Например: custom_asserts.py

class CustomAsserts(object): 
    def silly_assert(self, foo, bar): 
     assert foo == bar , 'some error message' 

Если мы используем assert непосредственно в тестах, мы получим дополнительную информацию о AssertionError, что очень полезно.

Выход непосредственно использовать утверждают в тестах:

>  assert 'foo' == 'bar', 'some error message' 
E  AssertionError: some error message 
E  assert 'foo' == 'bar' 
E   - foo 
E   + bar 

Но мы обнаружили, что если мы вызываем метод утверждения мы определили в отдельном модуле, дополнительная информация не будет отображаться.

from custom_asserts import CustomAsserts 
asserts = CustomAsserts() 
def test_silly(): 
    asserts.silly_assert('foo', 'bar') 

Output после запуска теста:

>  assert 'foo' == 'bar', 'some error message' 
E  AssertionError: some error message 

И мы также нашли это pytest документы: Advanced assertion introspection

pytest только переписывает тестовые модули, непосредственно обнаруженные его процессом сбора тест , поэтому утверждает, что модули поддержки, которые не являются , сами тестовые модули не будут перезаписаны.

Итак, мой вопрос в том, есть ли способ позволить pytest сделать то же самое утверждение, переписывая другие модули, как и тестовые модули? Или есть какой-то хакерский способ добиться этого?

ответ

4

Обновление:

Pytest 3.0 введен новый метод register_assert_rewrite реализовать эту точную функцию. Если вы используете pytest 3.0 или новее, попробуйте это. register_assert_rewrite

Оригинальный ответ:

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

Трюк заключается в том, как собирать тестовые модули pytest. Мы можем определить python_files в pytest.ini, чтобы pytest рассмотрел больше модулей в качестве тестовых модулей.

Например, в моем случае, все мои пользовательские утверждает модуль заканчивается «утверждает», так что мой pytest.ini является:

[pytest] 
python_files = *asserts.py test_*.py *_test.py 

Еще одна сложная вещь в conftest.py. Кажется, нам нужно избежать импорта модуля утверждений в conftest.py. Мое предположение заключается в том, что похоже на то, что технология pytest использует для перезаписи assert, фактически переписывает файл .pyc, а так как conftest.py загружается перед сбором, если мы импортируем модуль утверждений, то .pyc модуля будет сгенерирован перед сбором, что может сделать pytest неспособным снова переписать файл .pyc.

Так что в моем conftest.ру, я должен делать вещи, как:

@pytest.fixture(autouse=Ture) 
def setup_asserts(request): 
    from custom_asserts import CustomAsserts 
    request.instance.asserts = CustomAsserts() 

И я буду получать дополнительную информацию об ошибке, как и с помощью ключевого слова assert непосредственно в тестовом скрипте.

+0

[Ответ на ваш вопрос в порядке, даже рекомендуется!] (Http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/) Веб-интерфейс даже предполагает, что вы можете написать свой вопрос и сразу же ответить на него, как метод документирования и обмена чем-то важным, который вы обнаружили при разработке программного обеспечения. – clacke

Смежные вопросы