pytest框架使用教程
Pytest框架
一、简介
pytest:基于unittest之上的单元测试框架
有什么特点?
- 自动发现测试模块和测试方法
- 断言更加方便,assert + 表达式,例如
assert 1 == 1
- 灵活运行指定的测试用例,标签化,适合回归、正向、冒烟、登录
- (夹具)环境管理灵活。会话、模块,哪个用,哪个不用
- 丰富的插件,例如测试报告插件
- 和unittest兼容
安装
pip install pytest
# 更新
pip install -U pytest
# 只安装到当前用户
pip install -U --user pytest
# 安装html报告的插件
pip install pytest-html
二、pytest收集测试用例的规则
默认从当前目录中搜集测试用例,即在哪个目录下运行pytest命令,则从哪个目录当中搜索
搜索规则:
- 模块名称:
test_*.py
和*_test.py
开头或者结尾,不要同时满足 - 函数名称:
test_
开头 - 类:
- 以
Test
开头的测试类(没有__init__
函数) - 如果使用了 unittest, 遵循 unittest 的规则
- 如果没有继承 unittest.TestCase, 不要使用
__init__
,一旦使用__init__
,就是一个普通的类,不会被当成测试类了
- 以
- 模块中可以只有测试方法函数,不用类,也可以识别
- 模块名称:
自定义查找规则:pytest.ini
[pytest]
python_files =
test_*.py
check_ *.py
python_functions = *_test
python_classes = Check_*
三、fixture测试夹具——前置后置条件
1. 定义和作用
- 测试用例执行的环境准备和清理,前置条件和后置条件
- unittest中是setUp()等
2.定义fixture
- 在一个普通函数申明前加 @pytest.fixture
- 在函数内使用 yield 关键字
- 关键字以后的代码,就是环境清理的代码,即在测试用例执行完毕之后执行
3.fixture作用域
@pytest.fixture(scope="fuction")
# function:每个函数中都运行一次,默认,类比setUp
# class:每个类中运行一次,类比setUpClass
# module:每个模块中只运行一次
# session:全局只运行一次
4.调用fixture
在测试用例中直接调用它
def test_login(self, fixture函数名)
用pytest装饰器调用
@pytest.mark.usefixtures("fixture函数名字")
5.conftest.py
- 存储fixture
- 固定的文件,不需要导入
6.使用实例
conftest.py文件:
import pytest
from selenium import webdriver
@pytest.fixture(scope="fuction")
def before_test_and_after():
"""启动浏览器"""
print("正在启动浏览器")
driver = webdriver.Chrome()
yield driver # 生成器,惰性求值。
driver.quit()
test_demo.py测试用例文件:
import pytest
# 方法一:
@pytest.mark.usefixtures("before_test_and_after")
class TestAdd:
@pytest.mark.parametrize("case_info", cases)
def test_add(self,case_info):
assert case_info["expected"] == 3
四、paramtrize参数化——数据驱动
ddt和unittest搭配使用
在pytest中用@pytest.mark.paramtrize("data", cases)
cases = [
{"expected": 1},
{"expected": 2},
{"expected": 3}
] class TestAdd:
@pytest.mark.parametrize("case_info", cases)
def test_add(self,case_info):
assert case_info["expected"] == 3
五、assert断言
直接用内置关键字, assert 条件表达式
expected = "yuz"
actual = "yuz wang"
assert expected not in actual, "这次真的断言失败了,可能是因为元素的定位问题"
六、测试报告
pytest -html插件
安装html报告的插件:pytest -html
pip install pytest -html
生成html格式的测试报告
# 命令行
pytest --html=reports\test.html
# python程序
if __name__ == '__main__':
pytest.main(["-m invest", f"--html=reports\test.html"])
allure报告插件
安装allure插件
- 解压后,复制bin文件所在路径,配置环江变量
- cmd中输入allure,碰到以下错误
解决:安装jdk,配置JAVA_HOME环境变量
安装allure-pytest 绑定包
pip install allure-pytest
allure的使用
- 生成测试报告
首次安装allure,需要重启,allure命令才生效
# 命令行运行
# 生成一个test_invest的文件
pytest tests\test_invest.py --alluredir=reports\test_invest
# 预览测试报告,会生成临时报告,自动用网页打开
allure serve reports\test_invest
# 生成静态文件
allure generate reports\test_invest
- 添加注释
七、mark 功能——用例筛选
作用:给测试用例打标签,在运行测试用例的时候,可根据标签名来过滤要运行的用例
使用步骤:
注册,修改pytest.ini文件
[pytest]
markers =
success
demo
linux
在测试方法或测试类上打标签,可以同时打多个标签
import pytest @pytest.mark.demo
class TestDemo: @pytest.mark.linux
@pytest.mark.success
def test_demo(self):
pass
运行用例。命令行运行
pytest -m "success"
# 标签表达式
# 表达式只支持双引号,不支持单引号
pytest -m "success and demo"
pytest -m "success or demo"
pytest -m "success and not demo"
特殊标签——跳过函数
# 某个功能被废弃,不需要测试。
@pytest.mark.skip(reason="跳过原因")
# 有条件地跳过某些内容
import sys
@pytest.mark.skipif(sys.version_info < (3.6), reson="requires python3.6 or higher")
@pytest.mark.skipif(sys.platform=="linux", reason="window系统因为环境不同跳过。")
八、pytest运行的几种方式
右击运行
命令行运行:
# 运行当前目录下的所有用例
pytest
# 指定测试模块
pytest test_demo.py
# 指定测试目录
pytest testing/
# 通过关键字表达式过滤执行
pytest -k "MyClass and not method"
# 通过节点id来运行,节点id: 模块名::类名::函数名
pytest test_login.py::test_demo
# 通过标签表达式
pytest -m "success"
python程序运行:
if __name__ == '__main__':
# main()函数里可以加表达式
pytest.main()
# pytest.main(["-m success"])
设置默认的测试用例运行器
九、重运行机制
重运行表示如果断言失败,测试用例没有通过,则重新运行一次。如果测试用例通过了,就不会重新运行。
在web自动化测试当中,元素定位, 元素操作不是很稳定,例如网络不稳定
安装
pip install pytest-rerunfailures
运行
# 执行2次
pytest --reruns 2
# 间隔5s再执行
pytest --reruns 2 --reruns-delay 5
十、打印输出信息
pytest -s
十一、pytest 和unittest的区别
- pytest支持更加丰富的插件
- pytest是第三方库,unittest是标准库,标准库是和python绑定,稳定性更强,pytest的稳定性会差一些,pytest版本和python版本不匹配
- 运行用例,管理用例更加灵活,@pytest.mark标记功能,运行时用标记表达式
- 断言更加方便和智能,用assert 关键字,而且有智能提示,预期结果和实际结果。
- 有更加灵活更加强大的环境管理,fixture
- 自动收集用例
- pytest 和 unittest 是可以兼容的,但是不是完全兼容。
- 使用了pytest的paramatrize和fixture,不能再使用unittest,强制二选一
十二、web自动化方案选择
方案1: 全部使用 pytest, 完全不用 unittest
方案2:
unittest 去实现测试用例方法和ddt,setUp, tearDown,
- pytest 用来运行和管理用例,mark
- allure 生成报告
pytest框架使用教程的更多相关文章
- 《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制 一.综述 SuperIO(SIO)定位 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 3.设备驱动介绍
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 IOT
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通讯模式开发及注意事项。附:网友制作的类库说明(CHM)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 6.并发通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 7.自控通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 9. 协议过滤器,解决一包多发、粘包、冗余数据
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
随机推荐
- [转] 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)
点击阅读原译文 原文见:http://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/ ...
- [转] VMware中的Ubuntu无法通过桥接方式上网
遇到的问题:主机可以上网(使用了代理),VMware设置为桥接方式连网.在主机中可以ping通虚拟机,在虚拟机中也可以ping通主机,可是在虚拟机中始终连接不了因特网. 感谢刘洋同学的博文,“在桥接模 ...
- Java中的map集合顺序如何与添加顺序一样
一般使用map用的最多的就是hashmap,但是hashmap里面的元素是不按添加顺序的,那么除了使用hashmap外,还有什么map接口的实现类可以用呢? 这里有2个,treeMap和linkedH ...
- qemu-guest-agent详解
qemu guest agent简称qga, 是运行在虚拟机内部的一个守护程序(qemu-guest-agent.service),他可以管理应用程序,执行宿主机发出的命令. QEMU为宿主机和虚拟机 ...
- winxp系统连接服务器丢包解决方法
winxp系统连接服务器丢包解决方法 MFC编写一个打开网页的程序,发生异常没有获取到数据. 分析步骤: 1. 用getLastError()获取到的信息,(2)- 系统找不到指定的文件. 2. 用浏 ...
- 如何在VMware虚拟机中安装CentOS6.7系统(下篇)
上一篇文章讲到了CentOS6.7的安装教程,安装步骤到时区选择这块了,这篇文章接上篇文章,继续讲述CentOS6.7的安装教程,直至安装完成. 17.设置root的登录密码,日后登录虚拟机,用户名就 ...
- hdoj3791
题目: Problem Description 判断两序列是否为同一二叉搜索树序列 Input 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束.接下去 ...
- Beta冲刺<3/10>
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第三天(05.21) 作业正文 如下 其他参考文献 ... B ...
- C#数据结构与算法系列(十):逆波兰计算器——逆波兰表达式(后缀表达式)
1.介绍 后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后 2.举例说明 (3+4)*5-6对应的后缀表达式就是3 4 +5 * 6 - 3.示例 输入一个逆波兰表达式(后缀表达 ...
- JavaWeb网上图书商城完整项目--27.注册页面之注册按钮图片切换实现
我们要实现立即注册这个按钮,光标获得焦点是一张图片,光标失去焦点的时候是另外一张图片 我们需要在文档加载完成之后,设置该事件hover事件 hover(over,out)这是jQuery的一个模仿悬停 ...