使用fixture实现部分前后置
#读取数据
def read_yaml():
return ["chenglong","zhenzidan","zhangsan"]
@pytest.fixture(scope="function",autouse=True,params=read_yaml(),ids=["c","z","s"],name="db")
#scope:作用域 scope="function"只作用于函数,在函数之前之后执行
# class,在类之前和之后执行,例子在第二个类中
# package/sessoin:在整个项目会话之前和之后执行
# fixture通过return或yeild返回值的话,那么可以把这个值传递到测试用例中,值是通过固件名字传递的
#autouse:自动执行,默认是False
#ids:
#params:实现参数化 params=read_yaml()
# 通过在fixture函数的参数里面添加request来接收这个参数 def exe_database_sql(request),然后通过print("request.param")来取值
#ids:不能单独使用,必须和params一起使用,作用是对参数起别名
#name:作用是给fixture作用的函数起别名,那么函数名称失效,exe_database_sql变成name的值
def exe_database_sql():
print("执行SQL语句")
# return success
# yield ”success“
print("关闭数据库")
class TestYutong:
def test_ceshi1(self,exe_database_sql):
print("测试1")
print(exe_database_sql) #success
def test_ceshi2(self):
print("测试2")
@pytest.mark.usefixtures("exe_database_sql") #scope="class"时,手动调用的方式
class Testjiaoyu :
def test_01():
pass
-
scope:作用域 scope="function"只作用于函数,在函数之前之后执行 class,在类之前和之后执行,例子在第二个类中 package/sessoin:在整个项目会话之前和之后执行
在根文件目录下建conftest.py针对全局有效(或在包下面创建,只针对包有效),再运行run.pyconftest.py文件里面所有的方法在调用时,都不需要导包
import pytest @pytest.fixture(scope="function",autouse=True,name="db")#在测试文件中方法中添加db def exe_database_sql(): print("执行SQL语句") yield ”success“ print("关闭数据库") @pytest.fixture(scope="function",autouse=True,name="db")#在测试文件中方法中添加db def user_manage(): print("用户管理模块之前的准备") yield ”user_manager“ print("用户管理模块之后的准备")
fixture通过return或yeild返回值的话,那么可以把这个值传递到测试用例中,值是通过固件名字传递的
-
autouse:自动执行,默认是False
-
params:实现参数化 params=read_yaml()
通过在fixture函数的参数里面添加request来接收这个参数 def exe_database_sql(request),然后通过 print("request.param")来取值,注意:这里的param没有s
-
ids:不能单独使用,必须和params一起使用,作用是对参数起别名
-
name:作用是给fixture作用的函数起别名,那么函数名称失效,exe_database_sql变成name的值
setup,teardown,setup_class,teardown_class,fixture,conftest优先级
-
fixture的session级别的优先级最高
-
fixture的class级别的优先级其次 setup_class
-
fixture的function级别的优先级最后 setup
总结:pytest执行过程
-
查询当前目录下的conftest.py文件
-
查询当前目录下的pytest.ini文件
-
查询用例目录下contest.py文件
-
查询py文件中是否有setup,teardown,setup_class,teardown_class
-
再根据pytest.ini文件的测试用例的规则去查找用例并执行
pytest的断言
class TestYutong:
def test_ceshi1(self):
print("测试1")
assert 1==1
def test_ceshi2(self):
print("测试1")
assert "a" in "abc"
pytest结合allure-pytest插件生成美观的测试报告
-
安装allure-pytest插件
-
下载allure ,下载之后解压,配置环境变量(把allure目录下的bin目录配置到系统变量的path路径)
-
验证allure是否安装成功 allure --version
-
生成报告
-
生成测试报告
pytest.ini文件中 [pytest] addopts=-vs --alluredir #通过main运行
-
生成临时json报告
addopts==-vs --alluredir=./temps --clean-alluredir
--alluredir=./temps 生成临时报告
--clean-alluredir 清空临时报告
pytest之parametrize()实现数据驱动
-
方法:
@pytest.mark.parametrize(args_name,args_value)
def test_01():
pass
args_name:参数名称,用于将参数值传递给函数
args_value:参数值格式(列表和字典列表,元组和字典元组),有n个值用例就执行n次
@pytest.mark.parametrize("caseinfo",["张三","李四","百里"])
def test_01(self,caseinfo):
print("获取鉴权码"+caseinfo)
@pytest.mark.parametrize("args1,args2",[["name":"百里"],["age":"18"]])
def test_02(self,args1,args2):
print("获取鉴权码"+"str(args1)+"+"str(args2)")
YAML格式测试用例读、写、封装
-
yaml是一种数据格式,扩展名可以是yaml或yml,支持#注释,通过缩进表示层级,区分大小写。
-
用途:用于做配置文件(yaml,ini)
用于编写自动化测试用例
-
数据组成:
msjy: - name1: lisa - name2: - age1: 18 - age2: 19 - name2: joy
-
注:yaml文件读出来的数据类型是字典
-
map对象,键值对,键:(空格)值
name: lisa
-
数组(list),使用-来表示列表
-
创建get_token.yaml
创建yaml_util.py
import yaml
#获取项目根目录
def get_obj_path():
os.path.dirname(__file__).split("")
#读取yaml,需要安装pip installl pyyaml
def read_yaml(yamlpath):
with open("yaml文件的路径= get_obj_path()+yamlpath",mode="r",encoding="utf-8") as :
yaml.load(stream=f,Loader=yaml.FullLoader) #加载所有内容
return value
if __name__="__main__":
read_yaml(yamlpath)
parametrize结合
get_token.yaml
#第一个用例
-
name: 获取统一的鉴权码
request:
method:get
url:
data:
grant_type:
appid:
secret:
validate: None
#第二个用例
-
name: 获取统一的鉴权码
request:
method:get
url:
data:
grant_type:
appid:
secret:
validate: None
统一接口请求封装
接口自动化测试框架的封装
-
接口关联的封装
-
yaml文件如何实现动态参数的处理
-
yaml文件如何实现文件上传
-
yaml文件如何实现解决断言,特别是当有参数化的时候如何断言
-
yaml文件数据量太大怎么办
-
接口自动化框架的扩展性:加密接口,签名接口,自定义功能接口