Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

py.test: остановить выполнение теста при конкретном условии

pytest
python
Теги: #<Tag:0x00007fedc742a498> #<Tag:0x00007fedc742a358>

(Наталья Рощина) #1

Привет! Подскажите, пожалуйста, можно ли как-то остановить тест при каком-то конкретном условии?
Например, мой тест состоит из методов

def test_basic_commission(acc_sett):
    comm  = Commission(acc_sett.get_driver())
    ord = Orders(acc_sett.get_driver())
    home_acc = HomeAccount(acc_sett.get_driver())
    empt_acc = EmptyAccount(acc_sett.get_driver())
    home_acc.widget_url()
    empt_acc.product_connected_to_campaign(campaign_name="Basic commission")
    empt_acc.find_product()
    empt_acc.fill_payment_info(params=Data())
    empt_acc.developer_shopify_login_to_buy()
    empt_acc.developer_stores_to_buy()
    empt_acc.find_store(search="klickly-payment-store")
    acc_sett.capture_payment()
    empt_acc.login_klickly("klickly-payment-store")
    comm.basic_commission_db()
    ord.order_menu_click()
    acc_sett.assert_orders()
    comm.count_basic_commission()

нужно, чтобы тест останавливался, если метод empt_acc.product_connected_to_campaign(campaign_name=“Basic commission”) возвращает пустой список?

def product_connected_to_campaign(self,campaign_name):     
campaign = list(db.campaigns.find({"name": campaign_name}))
        for i in campaign:
            product_id_list = i.get('promotions')
            if len(product_id_list) == 0:
                print("No products in campaign")
            else:
                for product_id in product_id_list:
                    print(product_id)

(zub_test) #2
def test_function():
     if not valid_config():
        pytest.skip("unsupported configuration")

https://docs.pytest.org/en/latest/skipping.html


(Sergei Chipiga) #3

Смотря, что вы имеете в виду под остановился - это может быть статус failed, skipped или passed. Как показывали выше, у пайтеста есть методы для досрочного выхода. Но вообще делать условия в тестах - это плохая идея. Условия в тесте - это способ пропустить баг. Тест обычно заточен на конкретные условия и если эти условия не произошли, то тест должен падать. Если возвращается пустой массив, хотя не должно, то это выглядит как баг.
Обычно в таких случаях создают два теста: один проверяет поведение системы, когда нет продуктов, другой проверяет поведение, когда продукты есть.

P.S. и не используйте print в тестах :slight_smile: Это функция для дебага, лучше логгер и ассерты.


(Дмитрий Мирошник) #4

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

return (product_id_list)

в конце, вернётся список продуктов в последнем кампейне. Для того, чтобы сделать из матрицы nn матрицу вида 1n2, не мешало бы в последнем цикле сделать какой-нить add.
Если Вы хотите аварийной остановки теста по условию пустого product_id_list, я бы сделал так:
1). Переписал бы метод, чтобы он линеаризировал матрицу продуктов, как я написал выше.
2). В конце сделал бы ассершен на длину product_id_list.


(Ilya Brik) #5

Good point :slight_smile:


(Наталья Рощина) #6

Да, я знаю, в этом методе я как раз хотела добавить условия для остановки теста.


(Наталья Рощина) #7

Спасибо! В данном методе я как раз и хотела добавить условие для остановки теста. На счет assert если к примеру assert len(product_id_list) != 0, если len будет 0, то тест зафейлится, а хотела, чтобы просто при этом тест останавливался без ошибок.


(Наталья Рощина) #8

Сергей, спасибо! Пробую разобраться, как при данном условии сделать тест skipped.


(Наталья Рощина) #9

Спасибо, это именно то, что мне нужно! Не знала, что skip можно делать также во время выполнения теста, использовала только в ключе @pytest.mark.skip(reason)


(Дмитрий Мирошник) #10

Эммм… Вы понимаете, что у теста логически должно быть 2 состояния: PASSED или FAILED? Состояние SKIPPED допустимо в случае, если тест не начал выполняться и был отключен заранее. Сделать самоскипаемый тест, конечно, реально, но это прямой путь к maintenance hell :slight_smile:: откровенно неочевидные выходы с неочевидным статусом позволены студентам в лабораторках, но никак не в коммерческом продукте.
Это примерно то же самое, как если бы Вы выпрыгнули из окна, есть 2 исхода: Вы разбились или Вы уцелели. А исход “я вернулась обратно в окно, долетев до 4-го этажа” - это противоречит современной физике :slight_smile:
Подумайте, какой подарок Вы оставите потомкам! :smiley: