Найти - Пользователи
Полная версия: Вкл/Выкл vcrpy через переменныe окружения
Начало » Python для экспертов » Вкл/Выкл vcrpy через переменныe окружения
1
Master_Sergius
Здравствуйте,

Есть некий сервис и набор тестов (почти интегрейшн), записаны кассеты с запросами/ответами вместо реальных http запросов. Используется библиотека pytest-recording, а та в свою очередь использует vcrpy.
Тесты, которые надо запускать с vcr, маркируются декоратором @pytest.mark.vcr. Реальные урлы и ключи можно передать через переменные окружения. А вот можно ли как-то выключать vcr через переменную окружения, чтобы выполнялись реальные запросы когда нужно? (при этом vcr не должен записывать новые кассеты, то есть как бы флаг для его отключения). Естественно, хочется сделать с минимальными изменениями кода тестов
py.user.next
Master_Sergius
Естественно, хочется сделать с минимальными изменениями кода тестов
С нулевыми изменениями кода тестов это можно сделать, создав дополнительную систему.

Чтобы выполнить запросы с кассетами, ты запускаешь обёртку, которая по умолчанию напрямую запускает эти тесты.
Чтобы выполнить запросы без кассет, ты запускаешь обёртку с параметром, которая из-за этого параметра запускает не эти тесты, а их копии с отключенным vcr.
А эти копии тестов генерируются из текущих тестов при каждом запуске обёртки с параметром.

То есть ты не меняешь тесты вообще, а запускаешь их через обёртку, которая при заданном параметре переключается на совершенно другую систему запуска совершенно других тестов, которые создаются из существующих тестов.
Master_Sergius
Немного не понял: надо еще продублировать тесты? Чтобы были одна копия с этим маркером vcr, а другая - без? Или как?
py.user.next
Master_Sergius
Немного не понял: надо еще продублировать тесты? Чтобы были одна копия с этим маркером vcr, а другая - без?
Да. Только эти тесты с vcr ты сам пишешь руками, а клоны без vcr генерируются из исходных тестов сами через транслятор и кладутся рядом, а потом запускаются. При каждом запуске они будут создаваться (это чтобы они не устаревали). Транслятор ты создаёшь, естественно.

Можешь поискать опцию. Может быть, она там есть. Я посмотрел поверхностно доки, не нашёл ничего там на первый взгляд. Оно и так там на соплях всё сделано, а ты ещё хочешь полный набор опций.

Но общий подход такой.
Например, тебе нужна какая-то опция, а её там нет. Ты будешь сидеть без этой функциональности? Не, ты просто берёшь и делаешь это себе. Это и есть программирование - создание чего-то из ничего, из пустоты. Тулинг.

Естественно, то, что там уже есть, ты не трогаешь и не меняешь, тем более эту систему, которая предоставляет возможность записывать сетевые запросы. При обновлении самой системы у тебя просто всё, что ты наменяешь там, сотрётся. Поэтому ты делаешь стороннюю систему, которая прикрепляется сбоку к тому, что уже есть, и делает что-то допольнительное.
Master_Sergius
Ладно, допустим. А можно как-то отключить ту vcr fixture, ну вот она стоит autouse=True в самой библиотеке, которая ставится через pip и, соответственно, код библиотеки изменить я не могу?
Master_Sergius
Наверное, autouse fixture нельзя отключить, по крайне мере, я не нашел как. Зато нашел другое решение - использовать плагин pytest-vcr вместо pytest-recoding: фактически все то же самое, зато есть флаг –disable-vcr, делает то, что мне нужно. Вопрос можно считать закрытым. Спасибо.

И еще одно, оказывается, фикстуры можно переопределять )
kelseyradley
По крайней мере, я не нашел способа отключить навесное, самодействующее устройство. Нашел альтернативное решение — использовать плагин pytest-vcr вместо pytest-recoding. На самом деле это то же самое, но есть флаг —disable-vcr, который выполняет мои требования. Проблема может быть решена. Спасибо.

Кроме того, оказывается, что фикстуры могут быть переопределены. 
tunnel rush 
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB