pytes框架实现一些前后置(固件,夹具)的处理,常用三种
为什么要用这些功能?
比如在做web自动化时,在做一个测试时总要有一个先必做的动作,或者是结束后要关闭的动作等。
以及如有些函数需要连接数据库,可以把连接数据库和断开数据的操作放在,指定的函数里.
这样每次测试函数的时候,都调取这个链接数据库的函数就行
一、setup/teardown,setup_class/teardown_class
1、setup/teardown:在每个用例的前后都会执行一次。
如图下,设置之后,运行
setup_class/teardown_class:在所有用例前后总共各执行一次。
*模块级(setup_module/teardown_module):开始于模块始末,作用于全局(总用各执行一次。)
*函数级(setup_function/teardown_function):仅对函数用例生效(即不在类中,每个函数执行一次)
*类级(setup_class/teardown_class):只在类中前后运行一次(在类中)
*方法级(setup_method/teardown_method):开始于方法始末(在类中,每个方法执行一次)
如下
二、使用@pytest.fixture()装饰器来实现部分用例的前后置
1、首先要理解unittest中setup、teardown的作用,可以实现在执行用例前或结束后加入一些操作,但这种都是针对整个测试类全局生效的
2、如果有以下场景:用例 1 需要先登录,用例 2 不需要登录,当每个测试用例的执行环境和条件都不一样时,显然无法用 setup 和 teardown 来实现
3、fixture可以使环境管理更灵活,每个测试用例可以有自己的fixture
装饰器
@pytest.fixture(scope="",params="",autouse="",ids="",name="")
---------------------------------------------------------------------------
(1)scope:表示的是被@pytes.fixture标记的方法的作用域
function(默认),class,module,package/session
(2)params:参数化(支持,列表[],元祖(),字典列表[{},{},{}],字典元祖({},{},{}]) )
测试用例参数化传入的参数被fixture调用,需要使用到request.param
params=['苹果','香蕉','梨'] 这里params是参数名,有s
request.param这里是属性名,是没有s的
(3)autouse=True:自动使用,默认False
(4)ids:当使用params参数化时,给每一个值设置一个变量名,意义不大
(5)name:给表示的是被@pytes.fixture标记的方法取一个别名。同一模块的fixture相互调用建议写不同的name
当取了别名之后,那么原来的名称就用不了了
测试用例如何调用fixture
1、将fixture名称作为测试用例函数的输入参数
2、加上装饰器:@pytest.fixtures()
fixture之yield实现teardown
用fixture实现teardown并不是一个独立的函数,而是用yield 关键字来开启teardown操作
注意
1、如果yield前面的代码,即setup部分已经抛出异常了,则不会执行yield后面的内容
2、如果测试用例抛出异常,yield后面的内容还是会正常执行
3、带有 yield 的函数在 Python 中被称之为 generator(生成器),生成器就是一边循环一边计算的机制,yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力
4、与return的区别:return后面的代码不会执行,yield后面的代码继续执行
调用时,可以使用usefixtures
usefixtures与传fixture区别
如果fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。
当fixture需要用到return出来的参数时,只能讲参数名称直接当参数传入,不需要用到return出来的参数时,两种方式都可以。
如下,如果add方法加上“---------”+my_fixtrue,就会报错,不加就不会报错
三、通过conftest.py和@pytest.fixture()结合使用全局的前后置应用(如:项目的全局登录,模块的全局处理)
1、conftest.py文件是单独存放的一个夹具配置文件,名称是不能更改的
2、用处可以在不同的py文件中使用同一个fixture函数
3、原则上conftest.py需要和运行的用例放到统一层,并且不需要做任何的import导入的操作
总结:
1️⃣setup/teardown,setup_class/teardown_class 它的作用于所有的用例或者所有的类
2️⃣@pytest.fixture()它的作用是既可以部分也可以全局前后置
3️⃣conftest.py和@pytest.fixture()结合使用,作用于全局的前后置