setup()和teardown()函数更加灵活。可以使用pytest.fixture()查看fixture()函数的源码和所需要的参数,同Fixture装饰器需要的参数一样。
fixture(scope="function", params=None, autouse=False, ids=None, name=None): 说明:
scope:表示被@pytest.fixture()装饰器所标识方法的作用域。function(默认),类class,模块module,包package/session。function作用域包含函数和方法。params:一个可选的参数列表,用于做Fixture的参数化。autouse:autouse=Ture则开启自动使用Fixture功能,也是调用Fixture函数一种方法。autouse默认值为Flase。ids:一个字符串id的列表,即当使用params参数化时,给每一个值设置一个变量名。params将自动生成ID 。name:表示给被@pytest.fixture()装饰器修饰的方法取一个别名,调用时可以使用别名调用。使用Fixture装饰器来实现部分用例的前后置。
比如:我们在测试一个操作流程时,有的测试用例需要登陆,有的测试用例执行不需要用户登陆。
如果要直接使用setup_function()前置函数来实现,该文件中的所有用例执行前都需要进行用户登陆。
如下示例:
import pytest# 函数级,前置函数def setup_function(): print("用户登陆")def test_add_cart(): print("添加购物车--需要登录")def test_add_address(): print("添加收货地址--需要登录")def test_browser_goods(): print("浏览商品--不需要登录")if __name__ == '__main__': pytest.main()"""执行结果:用户登陆添加购物车--需要登录PASSED用户登陆添加收货地址--需要登录PASSED用户登陆浏览商品--不需要登录PASSED"""我们可以使用Fixture装饰器来实现部分用例的前后置,如下示例:
"""1.学习目标 掌握pytest fixture定义2.操作步骤 1.在定义的函数前添加装饰器 @pytest.fixture() 2.编写函数 @pytest.fixture() def 函数名(): 代码 3.使用fixture 在测试用例中,将上面定义的函数名称,当做参数传入到测试用例中即可 def test_xx(函数名): 用例步骤"""import pytest# 步骤1@pytest.fixture()def login(): # 步骤3 print("输入账号,密码,进行登录")def test_add_cart(login): # 步骤3 print("添加购物车--需要登录")def test_add_address(login): # 步骤3 print("添加收货地址--需要登录")def test_browser_goods(): print("浏览商品--不需要登录")if __name__ == '__main__': pytest.main()"""执行结果:输入账号,密码,进行登录添加购物车--需要登录PASSED输入账号,密码,进行登录添加收货地址--需要登录PASSED浏览商品--不需要登录PASSED只有添加购物车,添加收货地址的用例,执行了登陆操作"""提示:Fixture装饰器既可以实现部分用例的前后置,也可以是现实全部用例的前后置,所以比单独使用前置
setup()函数和后置teardown()函数灵活多了。
前面的示例,是在用例前加前置条件,相当于执行了setup()前置函数,既然有setup()前置函数那就会有teardown()后置函数,Fixture里面的teardown()后置函数用yield来唤醒。
示例:
import pytest# 步骤1@pytest.fixture()def login(): # 步骤2 print("打开APP") print("输入账号,密码,进行登录") yield # 当用例执行完成后,执行yield后的代码 print("关闭APP")def test_add_cart(login): # 步骤3 print("添加购物车--需要登录")def test_add_address(login): # 步骤3 print("添加收货地址--需要登录")if __name__ == '__main__': pytest.main()"""执行结果:打开APP输入账号,密码,进行登录添加购物车--需要登录关闭APPPASSED打开APP输入账号,密码,进行登录添加收货地址--需要登录关闭APPPASSED"""