pytest:自动执行fixture;fixture传递参数
一、如果每条测试用例都需要添加fixture功能,则需要在每一个用例方法里面传入这个fixture的名字,这里就可以在装饰器里面添加一个参数autouse='true',它会自动执行应用到所有的测试方法中,只是这里没有办法返回值给测试用例。
使用方法如下:
@pytest.fixture(autouse="true")
def myfixture():
print("this is my fixture")
@pytest.fixture里设置autouse参数值为ture(默认false),每个测试函数都会自动调用这个前置函数
实例:
#!/usr/bin/env python # _*_coding: utf-8 _*_ import pytest @pytest.fixture(autouse="true") def myfixture(): print("this is my fixture") class TestAutouse: def test_one(self): print("执行test_one") assert 1 + 2 == 3 def test_two(self): print("执行test_two") assert 1 == 1 def test_three(self): print("执行test_three") assert 1 + 1 == 2
运行结果:
Testing started at 11:45 ... C:\Python\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1\helpers\pycharm\_jb_pytest_runner.py" --path C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_autouse.py Launching pytest with arguments C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_autouse.py in C:\Users\wanwen\PycharmProjects\vigo\xuexi\20210123 ============================= test session starts ============================= platform win32 -- Python 3.8.0, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 rootdir: C:\Users\wanwen\PycharmProjects\vigo\xuexi\20210123 plugins: html-2.1.1, metadata-1.11.0, ordering-0.6collected 3 items test_autouse.py [100%] ============================== 3 passed in 0.09s ============================== Process finished with exit code 0 this is my fixture .执行test_one this is my fixture .执行test_two this is my fixture .执行test_three
从上面的结果可以看出,在方法myfixture()上面加了装饰器@pytest.fixture(autouse="true"),测试用例无须传入这个fixture 的名字它会自动在每条用例之前执行这个fixture
二、fixture传递参数
测试过程中需要大量的测试数据,如果每条测试数据都编写一条测试用例,用例数量将是非常庞大的一般我们在测试过程中会将测试用到的数据以参数的形式传入到测试用例中并为每条测试数据生成一个测试结果数据。这时候可以使用fixture的参数化功能,在fixture方法加上装饰器@pytest.fixture(params=[1,2,3]),就会传入三个数据1,2,3分别将这三个数据传入到用例当中,这里可以传入的数据是个列表,传入的数据需要使用一个固定的参数名request来接收
实例:
#!/usr/bin/env python # _*_coding: utf-8 _*_ import pytest @pytest.fixture(params=[1, 2, 3]) def data(request): return request.param def test_not_2(data): print(f"测试数据:{data}") assert data < 5
运行结果:
Testing started at 12:02 ... C:\Python\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1\helpers\pycharm\_jb_pytest_runner.py" --path C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_params.py Launching pytest with arguments C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_params.py in C:\Users\wanwen\PycharmProjects\vigo\xuexi\20210123 ============================= test session starts ============================= platform win32 -- Python 3.8.0, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 rootdir: C:\Users\wanwen\PycharmProjects\vigo\xuexi\20210123 plugins: html-2.1.1, metadata-1.11.0, ordering-0.6collected 3 items test_params.py [100%] ============================== 3 passed in 0.05s ============================== Process finished with exit code 0 .测试数据:1 .测试数据:2 .测试数据:3
从运行结果可以看出对于params里面的每个值,fixture都会去调用一次,使用request.param 来接收用例参数化的数据,并且为每个测试数据生成一个测试结果。在测试工作中使用这种参数化的方式,会减少大量的代码量,并且便于阅读和维护