2016-05-31 59 views
2

所以我有一组测试,我想测试解决方案的多个版本。目前我有双参数化

import pytest 

import product_not_at_index 


functions_to_test = [ 
    product_not_at_index.product_not_at_index_n_squared, 
    product_not_at_index.product_not_at_index, 
] 

def run_test(function_input, expected_result, test_func): 
    actual_result = test_func(function_input) 
    assert actual_result == expected_result 

@pytest.mark.parametrize("test_func", functions_to_test) 
def test_empty_list(test_func): 
    input_data = [] 
    expected_result = [] 
    run_test(input_data, expected_result, test_func) 

@pytest.mark.parametrize("test_func", functions_to_test) 
def test_single_item(test_func): 
    input_data = [1] 
    expected_result = [1] 
    run_test(input_data, expected_result, test_func) 

@pytest.mark.parametrize("test_func", functions_to_test) 
def test_one_times_one(test_func): 
    input_data = [1, 1] 
    expected_result = [1, 1] 
    run_test(input_data, expected_result, test_func) 

@pytest.mark.parametrize("test_func", functions_to_test) 
def test_normal_use_case(test_func): 
    input_data = [1, 7, 3, 4] 
    expected_result = [84, 12, 28, 21] 
    run_test(input_data, expected_result, test_func) 

而且这个工程很好。但看着我的解决方案,我发现我的所有测试都具有相同的基本代码集。我怎样才能参数化一个函数两次,以便我可以只有一个测试函数,并停止重复自己?

我认为我可以做类似

import pytest 

import product_not_at_index 


functions_to_test = [product_not_at_index.product_not_at_index_n_squared] 
test_data = [ 
    [], [], 
    [1], [1], 
    [1, 1], [1, 1], 
    [1, 7, 3, 4], [84, 12, 28, 21], 
] 

@pytest.mark.parametrize("function_input,expected_result", test_data) 
@pytest.mark.parametrize("test_func", functions_to_test) 
def test_run(function_input, expected_result, test_func): 
    actual_result = test_func(function_input) 
    assert actual_result == expected_result 

但只是返回该错误

E assert 0 == 2 
E + where 0 = len([]) 
E + and 2 = len(['function_input', 'expected_result']) 
+2

[是,堆栈交换明确鼓励](https://stackoverflow.com/help/self-answer) – AlexLordThorsen

回答

2

我结束了使用的解决方案是这样的一个

import pytest 

import product_not_at_index 


functions_to_test = [product_not_at_index.product_not_at_index_n_squared] 
test_data = [ 
    ([], []), 
    ([1], [1]), 
    ([1, 1], [1, 1]), 
    ([1, 7, 3, 4], [84, 12, 28, 21]), 
] 

# TODO: turn into a list comprehension. 
test_paramaters = [] 
for func in functions_to_test: 
    for test_input, expected_result in test_data: 
     test_paramaters.append([test_input, expected_result, func]) 

@pytest.mark.parametrize("function_input,expected_result,test_func", test_paramaters) 
def test_run(function_input, expected_result, test_func): 
    actual_result = test_func(function_input) 
    assert actual_result == expected_result