pytest基础使用
pytest执行测试用例规则
# .py测试文件必须以test_xxx.py开头,或者以(_test结尾)
# 测试类必须以Test开头,并且不能有init方法
# 测试方法必须以test_开头
# 断言必须使用assert
class TestLoagin(object):
def test_login01(self):
print("输出信息")
assert 1 + 1 == 2
pytest.main(["test_login.py","-vs"]) # 文件名称可以不写,默认不就是当前文件
打印对应的信息
# pytest中比如print的打印信息,默认是不展示的
# 要在pytest.main(["-s"]) "-s"参数,表示输出对应的打印信息
pytest的四种setup和teardown
不常用,通常是使用fixture的scope进行定义
# 1.setup_module 和 teardown_module 在整个测试用例所在的文件中所有方法运行前和运行后运行且只运行一次
# 2.setup_class 和 teardown_class在整个文件中的一个class中所有用例前后运行
# 3.setup_method和teardown_method在class内的每个方法运行前后运行
# 4.setup_function和teardown_function则是在非class下的每个测试方法前后运行
Allure环境搭建
# 1.下载allure.zip
# 2.解压allure.zip到一个文件目录中
# 3.将G:\lanzhuo\allure-2.13.3\bin路径添加环境变量,path中
# 4.pip install allure-pytest
# 5.cmd窗口allure
pytest结合Allure
# 执行pytest单元测试,生成Allure报告需要的数据存放在/tmp目录
Pytest -lanzhuo --aluredir = ../report/tmp
# 执行命令,生成测试报告
allure generate ../report/tmp -o ../report/report--clean
生成报告
if __name__ == "__main__":
pytest.main(["-s","--alluredir","../report/tmp"]) # 报告要存放路径
os.system('allure generate ../report/tmp -o ../report/report --clean') # 把tmp里面的json文件,生成报告到report目录下
allure报告加标签
@allure.epic('ETL') # 项目名称
@allure.feature('登录模块') # 此处是模块名称,比如mysql数据源,sqlserver数据源 # 一级标签,就比如:数据源、任务开发,任务运维
class TestLogin:
@pytest.mark.parametrize('title,inBody,expData', get_yaml_caseData(os.path.join(testData_path,'loginCase.yml')))
#@pytest.mark.parametrize('title,inBody,expData',get_excel_data('登录模块','Login','标题','请求参数','响应预期结果'))
@allure.story("登录-1") # 二级标签
@allure.title("{title}") # 测试方法的名称
def test_login(self,title,inBody,expData):
res = Login().login(inBody)
#断言:1-局部关键信息相等 2- 包含关系 in
ApiAssert.define_api_assert(res['msg'],'=',expData['msg'])
fixture用法
fixture定义
# 1.在conftest.py文件里定义夹具
# 2.conftest的作用域,在哪个包里面,就作用哪个包;通常是放到项目根目录
# 3.定义的夹具不需要导入就可以直接使用
import pytest
# class级别就类似unittest中的类前置方法
# yield后的类似于unittest中的类后置方法
@pytest.fixture(scope="class")
def start_time():
pass
@pytest.fixture(scope="class")
def return_vaule():
yield "返回的值"
# 手动调用有返回值的夹具,就直接使用函数名称,就不能再使用usefixtures了
# 手动调用定义好,没有返回值的夹具,@pytest.mark.usefixtures("函数名称")
@pytest.mark.usefixtures("start_time") # 先执行定义好的fixture,再执行类里面的代码块
class Niu:
pass
Scope作用域
# scope级别
- function
- class
- module
- package/session
# 比如conftest文件在test_case下的作用域
# 若scope=class,比如test_case下面有五个测试类,就会执行五次;
# 若是设置了moude级别的,test_case下面有三个py文件,就会执行三次,
# 若设置了scope=function,若test_case下有十个测试方法,就会执行10次
# 若设置了scope=seesion,则仅执行一次
# scope默认是funciton级别的,就是每个测试方法执行前都会执行一次
# autouse=True,默认是False,是否自动被调用,如果设置了为True会自动调用,如果设置了False,则要手动来调;工作中autouse为False手动调用的最多
yield
pytest控制台的几种状态
"""
`.`成功的
`F`失败的
`E`错误的
`S`skip跳过的
`deselect`没有被选择的
"""
自定义标签
必须在pytest.ini文件里面,这里添加自定义的标签
自定义标签名称:pytest.mark.自定义的标签名称
如果不添加标签的话,pytest运行以后会出现警告
适用场景:指定场景运行
[pytest]
markers =
"my_smoke":自定义的标签描述
title01:
title02:
只执行自定义的标签
pytest.main("-v","-m","my_smoke","my_smoke02","....")