2014-09-04 6 views
9

Для приложения, которое я тестирую, я хотел бы создать приспособление autouse=True, в котором обезьяны будут отправлять smtplib.SMTP.connect, если они попытаются отправить сообщение неожиданно.В каком порядке выполняются светильники pytest?

Однако в тех случаях, когда я ожидаю испытания, чтобы отправить электронную почту, я хочу использовать другой прибор каротаж этих сообщений вместо (скорее всего, с помощью smtpserver приспособления из pytest-localserver и monkeypatching метода connect использовать хост/порт вернулся с помощью этого приспособления)

Конечно, это может работать только в том случае, если устройство автоматической установки выполнено перед другим креплением (загружено как funcarg). Есть ли какой-либо конкретный порядок, в котором выполняются светильники и/или есть способ гарантировать порядок выполнения?

+2

Очень правильный вопрос, я видел светильники злоупотребляли много времени, и один из наиболее проблематичных вещей, которые Крепеж работать, перед которой один – Fruch

+0

Альтернативным трюком, который является Полезно знать, что светильники могут проверять функции тестирования для следов pytest. Это означает, что вы можете «@ mark» тестировать, что нужно сделать что-то особенное, а затем, используя объект запроса, проверить, имеет ли тестовая функция знак. Если это так, выполните другое действие в вашем приборе. – user2859458

ответ

3

IIRC вы можете полагаться на более высокоуровневые светильники, которые должны быть выполнены в первую очередь. Поэтому, если вы создали привязку для аутсорсинга с сеансом связи к monkeypatch smtplib.SMTP.connect, тогда вы можете создать приспособление с функциональным расширением, которое отменяет этот monkeypatching для одного теста, восстанавливая его впоследствии. Я предполагаю, что самый простой способ сделать это - создать свой собственный прибор smtpserver, который зависит как от оснащения disallow_smtp, так и от smtpserver от pytest-localserver, а затем обрабатывает все настройки и разрывы, необходимые для совместной работы этих двух пользователей.

Это неопределенно, так как pytest-django обрабатывает базу данных по доступу к базе данных, вы можете попробовать и посмотреть на код там, но это далеко не простой пример и имеет множество своих странных вещей.

5

У меня была эта проблема с двумя function -скрытыми автономными светильниками. Мне нужен светильник b для запуска до крепления a, но каждый раз, a бежал первым. Я подумал, возможно, это был алфавитный порядок, поэтому я переименовал a в c, и теперь начинается b. По-видимому, Pytest не документировал это. Это была просто счастливая догадка. :-)

Это для автономных светильников. Учитывая более широкие области применения (например, module, session), прибор выполняется, когда pytest сталкивается с тестом, который ему нужен. Так что если есть два теста, и в первом тесте используется session-оборудованный светильник с именем sb, а не тот, который называется sa, тогда сначала будет выполнен первый запуск sb. Когда следующий тест будет запущен, он начнет sa, предположив, что он требует sa.

+1

Может подтвердить версию py.test 2.6.4. – Nitrodist

+0

Я тоже использовал 2.6.4. – ebeezer

9

Самый простой способ управления порядком выполнения светильников - просто запросить предыдущее крепление в более позднем креплении. Таким образом, чтобы убедиться, что b запускается перед a:

@pytest.fixture(autouse=True, scope="function") 
def b(): 
    pass 

@pytest.fixture(scope="function") 
def a(b): 
    pass 
+0

Кажется, что не работает на pytest 3.0.2 (нет autouse). Пытаясь использовать capfd с другим устройством, которое создает класс, который сохраняет sys.stdout для переменной: избегая фиксации, выводит результат, пытаясь заставить capfd настраиваться первым, как это не делает. –

+0

Что вы подразумеваете под pytest 3.0.2 и «no autouse»? Этот код отлично работает для меня в pytest 3.0.2 и 3.0.3 (последний). – Barry

+0

Пожалуйста, поддержите, если ответ решит вашу проблему :) – Chronial

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