一,pytest了解
pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。(官方文档https://docs.pytest.org/en/stable/index.html)
优点:
1.第一个优点肯定是简单,灵活,易上手
2.支持参数化,pytest直接使用@pytest.mark.parametrize装饰器
3.能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)
4.pytest有丰富的第三方插件库,比如pytest-HTML、allure插件,专门用作与测试报告。pytest-selenium插件,集成测试。pytest-rerunfailures插件,用于失败重跑。pytest-assume插件,多重效验。pytest-ordering设定执行顺序等实用插件。
5.pytest断言直接在assert 后面接表达式
6.conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置,可供多个py文件调用。
7.scope="session" 以实现多个.py跨文件使用一个session来完成多个用例
二,安装
1.安装pytest
2种安装方法。
1是直接通过pip安装。安装命令为:pip install pytest,
检测是否安装成功命令:pytest --version ,如果他显示了版本名称,就表示已经安装成功。
2是通过官网直接下载然后放进python插件库里。
下载地址:https://pypi.org/project/pytest/
2.安装插件
安装html插件命令:pip install pytest-html
除开 pytest-html插件外 ,pytest还具备丰富的插件库,pytest插件汇总站点:http://plugincompat.herokuapp.com/
三,pytest执行测试需要遵循的规则(重要)
· .py测试文件必须以test_开头或者_test结尾
· 测试类必须以Test开头,并且不能有init方法
· 测试方法必须以test_开头
· 测试断言用assert
使用:
1,先创一个以test_开头的文件
2,创建一个Test_code
3,创建测试方法
1 # -*- coding: utf-8 -*-
2
3 class Test_code:
4 def test_jian(self):
5 assert 520==520
执行有两种方法:
1,是通过dos命令或者pycharm的命令窗口输入pytest。
我这是通过pytest 地址 指定搜索的目录下的文件,直接执行文件中所有的用例,也可以精确到类,某个用例。
还可以通过输入pytest直接所搜用例并执行。会在默认从当前目录中搜索用例,即在哪个目录下运行pytest命令,则从哪个目录中搜索。
2是通过在主函数中用代码执行。需要导入pytest包。
可以在mian()中填上哪个用例方法就执行哪个。
# -*- coding: utf-8 -*-
import pytest
class Test_code:
def test_jian(self):
assert 520==520if __name__ == '__main__':
pytest.main()
四:Pytest的使用
数据pytest驱动
1,参数化:
方便测试函数对测试数据的获取。
参数化是指把函数的多组参数传值序列化
pytest参数化 和unittest中的ddt相似。都是把数据放入用例中执行。
使用@pytest.mark.parametrize() 代码将数据代入用例中,括号中必须声明代入用例中的变量名,用引号引起,变量名必须一样
list=([('741852963', '123456', '123456'), ('122886', '123456', '123456')])
@pytest.mark.parametrize('urer,passd,ex',list) # 代入数据代码
def test_shuju(self,urer,pwd,ex): #变量名要和parametrize里面一样
print('这个是用户名'.format(urer))
print('这个是密码{}'.format(pwd))
assert pwd==ex
2.Yaml数据驱动
(1)yaml文件各式
这种yaml文件各式等价于数组:[‘python’,‘java’,‘jmeter’,‘自动化测试’,'性能测试‘]
例子1:接口测试代码如下:该篇请求接口为‘https://ceshiren.com/search/query’,term为网站的搜索条件,根据yalm文件中的搜索关键字进行搜索,接口请求的status_code作为断言
'param’作为参数名,将yaml文件中的搜索关键字传递给接口
该用法是基于@pytest.mark.parametrize(‘param’,[]),用文件维护信息更有利于测试用力的维护与更新,多个参数可以写为@pytest.mark.parametrize({‘param1’,[]},{‘param2’,[]})
相应对文件进行调整
例子2:yaml文件也可以这样传多个列表
使用get_yaml获取文件中的数据传给params,实现加法传入x,y,z,name
3,失败重跑
我们使用:pip3 install pytest-rerunfailures 代码来下载插件
使用:@pytest.mark.flaky() 代码放在用例前面
list=([('741852963', '123456', '123456'), ('122886', '123456', '123456')])@pytest.mark.flaky(reruns=5, reruns_delay=1) # 如果失败则延迟1s后重跑 最多跑五次
@pytest.mark.parametrize('urer,passd,ex',list)
def test_shuju(self,urer,pwd,ex):
print('这个是用户名'.format(urer))
print('这个是密码{}'.format(pwd))
assert pwd==ex
4、fixture功能
在执行测试用例前往往需要进行环境的准备,在执行完用例,将环境销毁。在unittest中一般通过 setUp与tearDown来进行用例前的环境准备和用例后的环境销毁。而在pytest中还有另外一种方式——fifixture。与setup和teardown相比,fifixture使用起来更加灵活,更加方便。(使用setup方法意思是每个用例都会先执行这个方法里面,teardown方法正好相反每个用例结束后都必须执行这个方法)
这是fixture在页面中代码使用方法
使用@pytest.mark.usefixtures("环境方法名") 代码放在用例或者类前,放在类前就是这个类里面的用例都会先执行环境。
fixture修饰器来标记固定的工厂函数,在其他函数,模块,类或整个工程调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作。
方法:fixture(scope="function", params=None, autouse=False, ids=None, name=None)
常用参数:
scope:被标记方法的作用域
function" (default):作用于每个测试方法,每个test都运行一次
"class":作用于整个类,每个class的所有test只运行一次
"module":作用于整个模块,每个module的所有test只运行一次
"session:作用于整个session(慎用),每个session只运行一次
params:(list类型)提供参数数据,供调用标记方法的函数使用
autouse:是否自动运行,默认为False不运行,设置为True自动运行
# -*- coding: utf-8 -*-import pytest #把前置
@pytest.mark.demo
class Test_code:
def test_aa(self,test_bb)
print("打印aa")
@pytest.fixture() #声明这是fixture函数,
def test_bb(self):
print("打印bb")
就是进入test_aa方法中先调用test_bb进行使用