Каков наилучший возможный способ поддержки нескольких логических комбинаций для теста в pytest?

#python #python-3.x #api #testing #pytest

#python #python-3.x #API #тестирование #pytest

Вопрос:

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

Например, мой код может выглядеть примерно так:

 @pytest.mark.parametrize("is_flag_1,is_flag_2,is_flag_3", [(True, False), (True, False), (True, False)])
def test_something(self, is_flag_1, is_flag_2, is_flag_3):
        print(is_flag_1, is_flag_2, is_flag_3)
  

И затем это может сгенерировать 8 возможных комбинаций, таких как:

  1. Ложь, ложь, ложь
  2. False, False, True
  3. False, True, False и так далее, пока True, True, True

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

Ответ №1:

Да, вы можете просто параметризовать флаги отдельно:

 import pytest

@pytest.mark.parametrize("is_flag_1", [True, False])
@pytest.mark.parametrize("is_flag_2", [True, False])
@pytest.mark.parametrize("is_flag_3", [True, False])
def test_something(is_flag_1, is_flag_2, is_flag_3):
    print(is_flag_1, is_flag_2, is_flag_3)
  

python -m pytest -vv приводит к чему-то вроде:

 ================================================= test session starts =================================================
...
collected 8 items

parametrize_bool.py::test_something[True-True-True] PASSED                                                    [ 12%]
parametrize_bool.py::test_something[True-True-False] PASSED                                                   [ 25%]
parametrize_bool.py::test_something[True-False-True] PASSED                                                   [ 37%]
parametrize_bool.py::test_something[True-False-False] PASSED                                                  [ 50%]
parametrize_bool.py::test_something[False-True-True] PASSED                                                   [ 62%]
parametrize_bool.py::test_something[False-True-False] PASSED                                                  [ 75%]
parametrize_bool.py::test_something[False-False-True] PASSED                                                  [ 87%]
parametrize_bool.py::test_something[False-False-False] PASSED                                                 [100%]

================================================== 8 passed in 0.35s ==================================================