一、环境搭建
本地安装相关依赖包,pytest、requests、allure-pytest、pytest-ordering等
二、编写脚本
1、测试文件以test_开头(以_test结尾也可以),注意必须有下划线_
2、测试类以Test开头,并且不能带init方法
3、测试方法以test_开头
4、断言使用基本的assert即可
常见断言:
assert xx:判断xx为真
assert not xx:判断xx不为真
assert a in b:判断b包含a
assert a == b:判断a等于b
assert a !=b:判断a不等于b
三、yaml文件编写&读取
yaml文件编写
user:
password: ‘123456’
username: vivi
文件读取
# coding=utf-8
import yaml
import os
filename = os.getcwd() + "\data\config.yaml"
print (filename)
def read_yaml(filename):
with open(filename,encoding='utf-8') as f:
data = yaml.load(f.read(),Loader=yaml.FullLoader)
print (type(data))
print(data)
if __name__ == "__main__":
read_yaml(filename)
四、pytest标记【参考博客:https://blog.csdn.net/qq_42610167/article/details/101204066】
1、@pytest.mark.xfail :标记失败,如果用例失败,则执行后显示xfail;若用例成功,则执行后显示xpath。如下图
使用场景,功能未完成,或者测试实际失败的情况
2、@pytest.mark.skip:跳过执行该用例
使用场景:跳过执行;某些平台无法执行;依赖的外部资源不可用;某些版本中执行,其他版本跳过
五、confest&fixture
新建conftest.py,文件内写入公共的函数,如下:(这个文件会找其同级以及文件内的下一级以test_xx.py或者xx_test.py的文件,根据公共函数适用范围执行公共函数代码)
#coding = utf-8
import pytest
@pytest.fixture(scope="module")
def open_url():
print ("打开url")
yield "lallaa"
print ("关闭浏览器")
test_xx.py文件编写方式1,使用usefixtures,如下:
#coding=utf-8
import pytest
@pytest.mark.usefixtures("open_url")
class Test_Pytest():
def test_get_page(self,):
print("----start------")
print("test_get_page方法执行" )
assert 1==1
if __name__=="__main__":
pytest.main(['-s','-r','test_xx.py'])
test_xx.py文件编写方式2,直接传参,如下:
def test_passport(open_url):
data = open_url
print(data)
注:
1、如果一个方法或者一个class用例想要同时调用多个fixture,可以使用@pytest.mark.usefixture()进行叠加。注意叠加顺序,先执行的放底层,后执行的放上层。
2、如果fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。
方法三:fixture自动使用autouse=True
@pytest.fixture(autouse=True)
def get_page(login):
六、装饰器
1、装饰函数
def use_logging(func):
def _deco(*args,**kwargs):
print("%s is running" % func.__name__)
a = func(*args,**kwargs)
print (a)
# return a["kk"]
return _deco
@use_logging
def set_value(a,b):
print('i am bar:%s' % (a + b))
return 3
if __name__ == "__main__":
set_value(1, 2)
输出结果
set_value is running
i am bar:3
3
2、装饰类
def use_logging(func):
def _deco(*args,**kwargs):
print("%s is running" % func.__name__)
a = func(*args,**kwargs)
print (a)
return a
return _deco
@use_logging
class ValuePool():
def set_value(self,a,b):
print('i am bar:%s' % (a + b))
return 3
if __name__ == "__main__":
kk = ValuePool().set_value(1, 2)
print (kk)
输出结果
ValuePool is running
<__main__.ValuePool object at 0x000002229060C820>
i am bar:3
3
七、运行和生成报告
1.进入项目目录(和case在同一层级),执行 执行命令:pytest
2.allure serve {报告路径} 如 “allure serve report”
3.在python代码中实现
# pytest.main([‘-s’, ‘-q’, ‘–html=…/result//report.html’,‘test_all.py’])
pytest.main([‘-q’, ‘-s’, ‘–alluredir=…/reports/allure’,‘test_all.py’])
os.system(“allure generate …/reports/allure/ -o …/reports/html --clean”)
# 自动打开生成的测试报告
# os.system(‘allure serve allure’)
遇到的问题,打开报告页面空白:
原因:1、allure版本过低更新版本;2、pycharm中运行,需要修改运行工具位unittests。(File | Settings | Tools | Python Integrated Tools-Default test runner)