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

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

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)
def test_function():
     if not valid_config():
        pytest.skip("unsupported configuration")

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

4 лайка

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

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

4 лайка

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

return (product_id_list)

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

Good point :slight_smile:

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

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

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

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

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

2 лайка