介绍
pytest是一个非常成熟的Python单元测试框架,比自带的unittest更简洁,效率更高
特点
- 简单灵活易上手,能够支持简单的大暖测试和复杂的功能测试
- 有丰富的第三方插件pytest-selenium,pytest-html,pytest-rerunfailures、pytest-xdist等
- 测试用例指定跳过,或对某些预期失败的case标记为失败
- 可以很好的和Jenkins集成,实现持续集成
- 支持与allure结合自动化生成测试报告
- 支持运行由nose、unittest编写的测试用例
- 支持参数化方式,DDT数据驱动
安装
在线安装
pip install [-u] pytest
#-u 是指针对已安装pytest的更新
Q:公司没有外网,也不能拷贝,也不能通过邮件传送,如何离线安装? 离线安装 pip install pytest -i 镜像地址 因为我们是华为外包公司,所以用的是华为镜像地址,才可以下载
Pytest用例规范
- 所有测试用例文件必须以test开头或结尾
- 所有测试类必须以Test开头,并且不能有__init__()方法
- 测试函数或者测试类中的用例方法必须以test_开头
- 测试文件中必须导入pytest
- 在执行pytest命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行
实例:
import pytest
class TestJDFlow():
def test_flow_a(self):
print('1111')
assert 1==1
def test_flow_b(self):
print('2222')
assert 1==1
def test_flow_c(self):
print('3333')
assert 1==1
if __name__ == '__main__':
pytest.main(['-s','test_jd_flow.py'])
Pytest用例文件运行
1、测试类主函数模式
在测试脚本的py文件中,加入main函数调用,默认
pytest.main(['-s','testjd.py'])
-s:表示输出用例执行的详细结果
-testjd.py:是要执行的脚本名称,一般都是当前模块名称
注意:main函数两种写法都可以 ,参数也可以修改添加其他的
如果文件中不写main函数, 直接右键执行模块文件后,也能执行成功,只是不会打印输出信息了
2、命令行执行 #模块中不写main函数,直接在命令行执行,也可以加参数 进入到文件所在文件目录,选中Terminal
pytest 可选参数 [文件路径/[测试文件名]
如果不写文件路径和文件名,则执行当前目录及子目录下的所有命名规则符合pytest用例的文件 只指定测试模块(文件名):则执行对应的测试模块文件 只指定测试目录:则执行该目录下和子目录下的所有符合条件的文件 【可能遇到的问题】 如果test脚本执行失败,修改下面的配置setting–tools,将Testing中的默认值改成pytest就OK了(默认的可能是unittest)
用例执行顺序
同一个模块内的用例,按定义顺序从上往下执行
用例执行控制
可选参数即控制用例执行的
- -s:显示print的信息,可用于调试脚本
- -x: 有一条用例失败,就停止运行
import pytest
class TestJDFlow():
def test_flow_a(self):
print('1111')
assert 1==1
def test_flow_b(self):
print('2222')
assert 1>1
def test_flow_c(self):
print('3333')
assert 1==1
如上代码执行结果: 执行到第二条用例,断言失败,然后就停止了,第三条用例没有执行,所以只有1passed,1failed
- –maxfail=n:失败用例有n个时,就停止测试
- -k :通过关键字表达式过滤执行
文件名、类名、方法名中能匹配上关键字的用例
说明:
如果文件名符合,就会执行所有类下面的所有用例
如果文件名不符合,但类名符合,会执行所有这个类下面的所有用例
如果文件名不符合,类名不符合,则判断方法名是否符合,如果方法名符合,则只执行这条用例;如果方法名不符合,则不执行
多个关键字条件用and 或and not,关键字必须用双引号; #如果只有一个关键字,不需要写引号
pytest -k “demo and jd” pytest -k demo
【遇到的问题】: 1、我在模块文件中写了-s参数(都写了下面代码),但是我用命令行执行时,仍然需要加-s参数,才会显示print内容 此时谁是当前执行文件 main? 2、-s 和-k组合时,必须-s 在-k 前面,否则就会报错
- node id指定测试用例–待验证
nodeid指由模块名、分隔符、类名、方法名、参数构成
①运行指定用例
pytest test_flow.py::test_func
②运行指定方法
pytest test_flow.py::TestClass::test_method
- -m 用@pytest.mark.xxx装饰函数,执行时通过-m xxx指定要执行的用例
- –pyargs :指定包,执行包下所有用例
【遇到的问题】 1、执行pyargs 导入包后,报错 直接选中包右键,运行 是可以运行成功的,但是在命令行输入后,就报错 ,提示missing init.py文件(但是我明明有这个文件) 【解决办法】 路径不对,在当前包路径下 执行这个命令 就不行 返回上一层目录 就OK了 2、命令中的包名大小写必须与目录中的一致
-
多进程运行 当case量很多时,运行时间也会变的很长;多进程同时运行,缩短脚本运行时间 需要先安装 pytest-xdist 插件 pip install -U pytest-xdist 执行: pytest 文件名 -n N# N为并发进程数 -
重试运行 对于运行失败的用例,重新运行N次 需要先安装pytest-rerunfailures pip install -U pytest-rerunfailures 执行命令: pytest 文件名 --reruns Num #Num为重试的次数
【遗留待验证问题】 setup和teardown后面不写代表的是method?如果setup和setup_method同时存在的结果如何?
|