pytest的参数化
参数化多个参数:
可以使用多个参数来参数化测试。例如:
1 2 3 4 5 6 7 8 | import pytest @pytest .mark.parametrize( "x, y, expected" , [ ???? ( 1 , 2 , 3 ), ???? ( 3 , 4 , 7 ), ???? ( 5 , 6 , 11 ), ]) def test_addition(x, y, expected): ???? assert x + y = = expected |
参数化列表:
可以使用列表来参数化测试。例如:
1 2 3 4 5 6 7 8 | import pytest @pytest .mark.parametrize( "test_input, expected_output" , [ ???? ([ 1 , 2 , 3 ], 6 ), ???? ([ 4 , 5 , 6 ], 15 ), ???? ([ 7 , 8 , 9 ], 24 ), ]) def test_sum(test_input, expected_output): ???? assert sum (test_input) = = expected_output |
参数化字典:
可以使用字典来参数化测试。例如:
1 2 3 4 5 6 7 8 | import pytest @pytest .mark.parametrize( "test_input, expected_output" , [ ???? ({ "x" : 1 , "y" : 2 }, 3 ), ???? ({ "x" : 3 , "y" : 4 }, 7 ), ???? ({ "x" : 5 , "y" : 6 }, 11 ), ]) def test_addition(test_input, expected_output): ???? assert test_input[ "x" ] + test_input[ "y" ] = = expected_output |
参数化文件:
可以使用文件来参数化测试。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pytest import csv def read_csv(): ???? with open ( 'testdata.csv' , 'r' ) as f: ???????? reader = csv.reader(f) ???????? rows = [] ???????? for row in reader: ???????????? rows.append(row) ???????? return rows[ 1 :] @pytest .mark.parametrize( "test_input, expected_output" , read_csv()) def test_addition(test_input, expected_output): ???? x, y = map ( int , test_input.split( ',' )) ???? assert x + y = = int (expected_output) |
动态参数化:
可以使用 Python 代码动态生成参数。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pytest import time def get_test_data(): ???? test_data = [] ???? start_time = time.time() ???? while time.time() - start_time < 10 :? # 运行时间小于 10 秒 ???????? x = random.randint( 1 , 100 ) ???????? y = random.randint( 1 , 100 ) ???????? expected = x + y ???????? test_data.append((x, y, expected)) ???? return test_data @pytest .mark.parametrize( "x, y, expected" , get_test_data()) def test_addition(x, y, expected): ???? assert x + y = = expected |
从外部数据源加载数据:
可以使用动态参数化从外部数据源加载测试数据,例如数据库、API 或其他 Web 服务。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pytest import requests def get_test_data(): ???? response = requests.get( 'https://api.example.com/data' ) ???? test_data = [] ???? for item in response.json(): ???????? x = item[ 'x' ] ???????? y = item[ 'y' ] ???????? expected = item[ 'expected' ] ???????? test_data.append((x, y, expected)) ???? return test_data @pytest .mark.parametrize( "x, y, expected" , get_test_data()) def test_addition(x, y, expected): ???? assert x + y = = expected |
在上面的例子中,get_test_data 函数使用 requests 库从远程 API 加载测试数据,并返回一个测试数据列表。然后,使用?@pytest.mark.parametrize
?装饰器动态参数化测试,使用从 API 加载的测试数据作为参数。
组合参数:
可以使用?itertools
?库中的 product 函数生成参数的所有组合。例如:
1 2 3 4 5 | import pytest import itertools @pytest .mark.parametrize( "x, y" , itertools.product([ 1 , 2 , 3 ], [ 4 , 5 , 6 ])) def test_multiplication(x, y): ???? assert x * y = = y * x |
在上面的例子中,使用?itertools.product?
函数生成 x 和 y 的所有组合,并将它们作为参数传递给测试函数。
参数化生成器:
可以使用生成器函数生成参数。例如:
1 2 3 4 5 6 7 8 9 10 11 | import pytest import random def get_test_data(): ???? while True : ???????? x = random.randint( 1 , 100 ) ???????? y = random.randint( 1 , 100 ) ???????? expected = x + y ???????? yield (x, y, expected) @pytest .mark.parametrize( "x, y, expected" , get_test_data()) def test_addition(x, y, expected): ???? assert x + y = = expected |
?