pytest框架实现一些前后置(固件、夹具)的处理,常用三种
一、setup/teardown, setup_class/teardown_class全部
class TestClass:
# 这个在所有的用例之前只执行一次 def setup_class(self):
print("在每个类执行前初始化的工作,如:创建日志对象,创建数据库的连接等")
# 在每个用例之前执行一次 def setup(self):
print("在执行测试用例之前初始化的代码,如:打开浏览器,加载网页等")
def test_01(self):
print("测试用例1")
def test_02(self):
print("测试用例2")
def test_03(self):
print("测试用例3")
def teardown(self):
print("在执行测试用例之后的扫尾代码,如:关闭浏览器")
def teardown_class(self):
print("在每个类执行后的扫尾工作,如销毁日志对象,销毁类等")
缺陷:每一个用例必须执行,如果只想部分执行,就需要另外的方法
二、使用fixture装饰器来实现部分用例前后置置(固件、夹具)的处理
装饰器:@pytest.fixture(scope="", params="", autouse="", ids="", name="")
-
scope表示的是被@pytest.fixture标记的方法的作用域。function(默认)、class、module、package/session
-
params:参数化(支持列表[],元组(),字典列表[{},{},{}],字典元组({},{},{})
import pytest
@pytest.fixture(scope='function', params=['zhangsan', 'lisi'])
def my_fixture(request):
print("这是前置的方法")
yield request.param # return和yield都表示返回都意思,但是return后面不能有代码,yield返回后可接代码
print("这是后置的方法")
class TestClass:
def test_01(self):
print("测试用例1")
def test_02(self, my_fixture):
print("测试用例2")
print("--------" + str(my_fixture))
-
autouse=True,自动使用,默认False
-
ids:当使用params参数化时,给每一个值设置一个变量名。意义不大
-
name:给表示的是被@pytest.fixture标记的方法取一个别名(当取了别名后原来的名称就不能用了)
三、通过conftest.py和@pytest.fixture结合使用实现全局的前置应用(比如:项目的全局登录,模块的全局处理)
-
conftest.py文件是单独存放的一个夹具配置文件,名称是不能更改的
-
用处:可以在不同的.py文件中使用同一个fixture函数
-
原则上conftest.py需要和运行的用例放到同一层,不需要做任何import导入的操作(不同层也可以,作用域问题)
四、断言
assert
asser A==B
五、pytest结合allure-pytest插件生成allure测试报告
-
allure安装
windows:下载,解压,并配置环境变量:https://github.com/allure-framework/allure2/releases
mac:brew install allure
-
安装Python依赖
windows:pip install allure-pytest
mac:pip3 install allure-pytest
-
加入命令生成json格式的临时报告
--alluredir ./temp
-
生成allure报告
os.system('allure generate ./temp -o ./report --clean')
allure generate 固定指令
./temp 临时的json格式报告的路径
-o 输出output
./report 生成的allure报告的路径
--clean 情况./report路径原来的报告
六、@pytest.mark.parametrize()基本用法
@pytest.mark.parametrize(args_name, args_value)
args_name: 参数名
args_value: 参数值(列表、元组、字典列表、字典元组),有多个值用例就会执行多次
第一种方式
import pytest
class TestApi:
@pytest.mark.parametrize('args', ['zhangsan', 'lisi'])
def test_01_zhansan(self, args):
print(args)
# 执行结果# xxx.py::TestApi::test_01_zhansan[zhangsan] PASSED [ 50%]zhangsan# xxx.py::TestApi::test_01_zhansan[lisi] PASSED [100%]lisi
第二种方式(同unittest的ddt里面的@unpack解包一样)
import pytest
class TestApi:
@pytest.mark.parametrize('name, age', [['zhangsan', '20'], ['lisi', '18']])
def test_01_zhansan(self, name, age):
print(name, age)
# 执行结果# xxx.py::TestApi::test_01_zhansan[zhangsan-20] PASSED [ 50%]zhangsan 20# xxx.py::TestApi::test_01_zhansan[lisi-18] PASSED [100%]lisi 18
七、YAML文件详解——实现接口自动化
-
用于全局的配置文件 ini/yaml
-
用于写测试用例(接口测试用例)
语法规则:
-
区分大小写
-
使用缩进表示层级,支持注释、换行、多行字符串、裸字符串(整型、字符串)
-
缩进没有数量要求,只要前面对其就行
-
注释用#
数据组成:
-
Map对象,键值对 键:(空格)值
-
多行写法:
msxy:
name: zhangsan
age: 18
-
一行的写法:msxy:{name: zhangsan, age: 18}
数组(list),用一组横线开头:
-
多行写法:
-
msxy:
name: zhangsan
age: 18
-
msxy:
name: lisi
age: 20
-
一行的写法:
-
msxy: [{name: 百里}, {age: 18}]
标签:allure,name,框架,self,pytest,Pytest,print,升华,def From: https://www.cnblogs.com/dyl0/p/17145099.html