title: Double parameterization
body: <p>So I have a set of tests where I'd like to test multiple versions of a solution. Currently I have </p>
  
  <pre><code>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)
  </code></pre>
  
  <p>And this works great. But looking at my solution I see that all of my tests have the same basic set of code. How can I parameterize a function twice so that I can just have a single test function and stop repeating myself?</p>
  
  <p>I thought that I could do something like</p>
  
  <pre><code>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
  </code></pre>
  
  <p>but that just returns this error </p>
  
  <pre><code>E   assert 0 == 2
  E    +  where 0 = len([])
  E    +  and   2 = len(['function_input', 'expected_result'])
  </code></pre>