pytest的固件
模块级别
类级别
函数级别
方法级别
setup_module(),teardown_module() :(模块级别)
一前一后,必须写成声明的函数,不能加self,可以实现整个测试模块,各执行一次,
unittest有两种固件:(类级别)
setUpclass(搭建)和tearDown(清理)比如用于连接数据库,断开数据库,测试数据的创建和清理
setUp和tearDown比如:用于打开浏览器,关闭浏览器,
函数级别的固件:
setup_function/teardown_function(在每个函数用例 执行之前和执行之后执行一次)
方法级别的固件:(写在类里面)
setup_method/teardown_method(也可以写为setup/teardown),前者的优先级更高
4种固件共10个的执行顺序
①如果只有函数用例:setup_module--setup_function--用例--teardown_function......teardown_module
②如果只有方法用例:setup_module--setup_class--setup_method--setup--用例--teardown--teardown_method--teardown_method--teardown_module
自定义固件
装饰器的作用:在不改变装饰对象代码函的前提下,扩展其功能,被装饰对象可以是类,函数,方法
目前用过的装饰器有;
parameterized.expand():参数化一个方法的用例
classmethod:作用是实现一个方法装饰成类的方法
staticmethod:作用是实现一个方法装饰成静态方法
pytest.fixture来:作用是实现自定义固件
pytest.mark.usefixtures():作用是实现固件的调用
函数加括号是调用,不加括号是一个对象
自定义固件的语法:通过装饰器pytest.fixture来装饰一个函数,这个函数就变成了一个固件。自定义的固件需要调用才能被执行。
pytest.fixture()装饰器中的参数:
scope:作用是定义固件的级别,scope默认值是function,它的取值可以是function/class/module/package/session之一。
scope=function:对函数用例来讲,相当于setup_function,对方法用例来讲,相当于setup_method
scope=class:对函数用例来讲,相当于setup_function,对方法用例来讲,相当于setup_class
scope=module:相当于setup_module
scope=session:相当于设置固件的级别为会话级别,它与setup_module相比,可以实现跨模块只执行一次。
yield语句:作用是一方面可以实现函数或方法的返回,此时相当于return语句;同时可以把函数变成一个生成器。
实现自定义固件中的teardown代码:在自定义固件中,使用yield语句来实现返回,yield之前的代码就是setup的代码,yield之后
的代码就是teardown的代码。
固件创建对象,初始化数据,
conftest.py文件(不能写错文件名)
可以在conftest.py文件中自定义固件,这样的好处是可以不用导入就可以被用例调用,注意conftest.py文件放的位置必须放到调用它的模块的同级或者上级目录,最简单的方法就是放到项 目的根目录下,这样项目下的所有模块都能调用到固件
跳过这行用例
@pytest.mark.skip(reson = "暂时不需要执行这条用例")
判断操作系统类型的方法:
1)os.name:返回nt表示windows,返回posix表示linux;
2)sys.platform:返回win32表示windows,返回linux表示linux系统。
pytest中常用的装饰器:
1)pytest.mark.skip(reason):装饰一个用例,作用是跳过这条用例不执行
2)pytest.mark.skipif(condition,reason):装饰一个用例,作用是当满足条件时跳过这条用例不执行
3)pytest.mark.xfail(reason):装饰一个用例,作用是标记这个用例预期是失败的,预期失败的用例如果实际运行失败,
状态是XFAIL,预期失败的用例如果实际运行是成功的,状态是XPASS
4)pytest.mark.usefixtures(fixture):实现自定义固件的调用。
unittest中的装饰器:
unittest.skip(reason):标记跳过某个测试用例
unittest.skipIf(condition,reason):标记当条件为真的时候就跳过
unittest.skipUnless(condition,reason):标记当条件为真的时候就不跳过,条件为假的时候就跳过
@parameterized_class ,对所有用例参数化
@parameterized.expand,对单条用例参数化
固件参数化
@pytest.fixture(params=[1,2,3,4,5])
def my_fixture_30(request): 声明形参猜能返回
yield request.param
用例参数化
@pytest.mark.parametrize("a,b,c",([1,2,3],(2,7,8),(2,4,6)))
以字符串传入参数名,二维的列表或者元组传入数据
跳过这条用例
# @pytest.mark.parametrize("a,b,c",([1,2,3],pytest.param(*(2,7,8),marks = pytest.mark.xfail(reason="不会成功")),(2,4,6)))
@pytest.mark.parametrize("a,b,c",([1,2,3],pytest.param(*(2,7,8),marks = pytest.mark.skip(reason="不会成功")),(2,4,6)))
unittest和pytest的区别
1) unit test需要继承unit test.TestCase类,而pytest不需要继承
2)在编写用例时,unit test只支持用例,pytest同时支持函数和方法两种用例
3)unittest中的断言使用继承于unittest.TestCase类的assert*方法来实现,而pytest只需要使用python的assert语句实现断言;
4)pytest支持自定义固件,在conftest.py文件中自定义固件;
5)unittest本身没有参数化模块,需要第三方模块比如parameterized、ddt等来实现参数化,而pytest自带参数化模块,并且可以实现固件参数化和用例参数化两种形式;
ddt:data driven test 数据驱动测试
参数化用例,自动读取用例
@file_data(".\ddt_json.json")
ddt的几个装饰器:
ddt:装饰测试类
data:装饰测试用例,对用例传参
unpack:装饰测试用例,作用是当data装饰器中传入元组或列表的时候,把元组或列表中的数据拆出来传给用例的参数
file_data:装饰测试用例,作用是对用例传参,这个装饰器中可以传入json或者yaml文件路径
生成html文件报告(插件pytest-html)
pytest .\test_cases_with_pytest.py --html=..\test_result\interfaceAtuoTest.html --self-contained-html
--html= 表示生成报告的路径
--self-contained-html表示生成的文件中html和css嵌套在一起
在pycharm运行生成报告,需要配置
pytest .\test_cases_with_pytest.py --alluredir=..\test_result --clean-alluredir
allure serve ..\test_result吧
标题参数化 allure.dynamic.title(name)