2016-06-24 1 views
1

매개 변수 목록이있는 시나리오가 있습니다. 이 매개 변수는 각각 다른 매개 변수 목록을 생성 할 수 있으며 두 매개 변수를 기반으로 테스트를 매개 변수화합니다.pytest 한 매개 변수가 다른 매개 변수에 의해 생성 될 때 두 수준의 매개 변수화

매개 변수화를 사용하여 아래에서 for loop으로 수행중인 것과 비슷한 점이 있습니다. 또한 test_1test_2은 모든 매개 변수 집합에 대해 함께 실행해야합니다.

도움말이 있습니까?

param1 = [<some_list>] 
#param2 = [<some_list_Generated_based_on_Param1>] 

for arg1 in param1: 
    param2 = get_param2(arg1) 
    for arg2 in param2 
     def test_1(): 
      ... 
      pass 
     def test_2(): 
      ... 
      pass 

답변

0

직접 달성 할 수있는 방법이 있는지 의문입니다. 그러나 pytest 플러그인 pytest_generate_tests을 확장하면됩니다.

다른 parametrize 질문에 대한 답변입니다. using fixture return value as value in mark.parametrize()

여기 내 해결책이 있습니다.

  1. 두 단계의 매개 변수화를 수행하려는 테스트를 표시하십시오.
  2. 두 단계의 매개 변수화를 수행하려는 테스트를 가져 와서 첫 번째 수준의 매개 변수화를 얻습니다.
  3. 첫 번째 수준의 매개 변수화를 기반으로 두 번째 수준을 생성합니다.
  4. 테스트 케이스를 사용하여 두 번째 레벨 매개 변수 만 사용하도록 지정하거나 요구 사항에 따라 둘 다 사용하십시오.

예 시험 :

import pytest 

@pytest.mark.two_level_parametrization 
@pytest.mark.parametrize("first_level", [1, 2, 3]) 
def test_two_level_parametrization(second_level): 
    print(second_level) 

Conftest.py :

import pytest 

def pytest_generate_tests(metafunc): 
    if hasattr(metafunc.function, 'two_level_parametrization'): 
     # You may need more marker or add if statement based on the arg of parametrize if you want to implement multiple two-level paremetrize 
     first_parametrize = metafunc.function.parametrize 
     metafunc.function.parametrize = [calculate_second_parametrize(first_parametrize)] 

     # # If you want to keep first level parametrization: 
     # metafunc.function.parametrize = [first_parametrize, calculate_second_parametrize(first_parametrize)] 

def calculate_second_parametrize(first_parametrize): 
    # Define your own method here to generate the parametrize object you need. 

    input_params = first_parametrize.args[1] 
    output_params = input_params + [-1 * num for num in input_params] 
    return pytest.mark.parametrize('second_level', output_params) 

출력 :

test_01.py::test_two_level_parametrization[1] 1 
PASSED 
test_01.py::test_two_level_parametrization[2] 2 
PASSED 
test_01.py::test_two_level_parametrization[3] 3 
PASSED 
test_01.py::test_two_level_parametrization[-1] -1 
PASSED 
test_01.py::test_two_level_parametrization[-2] -2 
PASSED 
test_01.py::test_two_level_parametrization[-3] -3 
PASSED