基础知识学习完毕,接下来我们开始学习测试框架啦!!!
首先来回顾一下python自带的Unittest框架:
Python基础学习018____参数化-CSDN博客文章浏览阅读16次。【代码】Python基础学习018____参数化。https://blog.csdn.net/Chrisliuluo/article/details/134302520?spm=1001.2014.3001.5501Python基础学习019--跳过-CSDN博客文章浏览阅读145次。【代码】Python基础学习019--跳过。https://blog.csdn.net/Chrisliuluo/article/details/134538737?spm=1001.2014.3001.5501Python基础学习__测试报告-CSDN博客文章浏览阅读162次。stream = sys.stdout,必填,测试报告的文件对象(open一个文件就可以得到一个文件对象)即测试报告名称,注意,必须使用wb(二进制写入)打开。# runner = HTMLTestRunner(f,2,'测试报告名称','Python3.11') # 运行对象。# 即将报告模板放在代码目录下,导包,添加用例,使用第三方的Runner代替Python自带的TextTestRunner来执行用例实例。# title = None ,可选,是测试报告的标题。https://blog.csdn.net/Chrisliuluo/article/details/134538760?spm=1001.2014.3001.5501接下来,我们来学习一个新的框架:pythet
1.与Unittest框架相比,优缺点:
优点:功能更加强大,代码更简单,可以调用执行Unittest代码
缺点:需要安装才能使用
2.安装
直接安装: pip install pytest
指定版本安装: pip install pytest==版本号
查看安装结果: pip list 或 pytest --version
3.使用
(1)定义
与Unittest不同,不需要装饰器,也不需要指定类继承,不需要将类名或函数名固定以Test开头。
类直接定义,继承基类object类即可。命名不需要特定以test开头,但是要注意类名开头统一,方便执行(不需要必须以Test开头,但是开头也要一致)
特殊函数:
①函数级别:开始函数 setup(self)、结束函数 teardown(self)
②类级别:开始函数setup_class(self)、结束函数 teardown_class(self),不需要装饰器指定为类方法。
(2)执行:
①使用主函数形式执行:在测试用例文件末尾添加如下代码:
python
if __name__ == '__main__':
"""
语法: pytest,main(['-s','文件名.py'])
"""
pytest.main(['-s', 'Pytest001_主函数形式执行.py'])
②使用配置文件+pytest命令执行:
注意:配置文件命名,可以为pytest.ini|tox.ini|setup.cfg|pyproject.toml,任选其一即可,通常用pytest.ini。不可以随便自定义
pytes.ini文件中不可以有注释,搬运的时候记得把下边代码的注释全部去掉
一个工程通常只有一个配置文件,放在根目录
写好配置文件,想要批量执行用例,只需要在Terminal命令行输入pytest命令即可。
python
[pytest]
# 测试用例代码的路径
testpaths =./scripts/
?
# 测试用例代码文件前缀,此处以test为例,可以是项目缩写或任意字符,
# 批量执行在testpaths指定的路径下,以test开头的测试文件
# 只要开头统一能使用通配符*匹配到,就可以批量执行以指定字符串开头的测试文件
python_files = test*.py
# 测试类指定开头,可以是任意字符,此处以Test为例
python_classes = Test*
# 测试方法指定开头,可以是任意字符,此处以Test为例
python_functions = test*
# 执行用例时,使用pytest命令,添加什么字段
# -s表示执行文件
# --html=./report/testreport1.html表示生成html文件形式的测试报告,保存在./report/testreport1.html路径
# --self-contained-html表示生成的html报告要将CSS文件整合在一起,保留页面布局
# --reruns 0表示用例的失败重执行次数。
addopts = -s
--html=./report/testreport1.html --self-contained-html
--reruns 0
# 生成日志的格式
log_format = %(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(funcName)s:%(lineno)d)] - %(message)s
# 生成日志的时间格式
log_date_format = %Y-%m-%d %H:%M:%S
#是否生成日志文件
log_cli = true
# 生成日志的级别
log_cli_level=INFO
# 日志文件保存路径
log_file = ./log/test1.log
③控制执行顺序
在方法的上方添加@pytest.mark.run(order=X),X可以为正数、负数也可以正负数同时存在。1.order同为正数或同为负数时,值越小优先级越高.正负数同时存在时正数优先,同类数越小优先级越高
2.对方法有效,对测试类同样有效
扩展:Unittest是通过ascII码决定执行顺序的
(3)跳过
pytest与Unittest有相似的跳过功能,不过实现方式不同。同样是添加装饰器。
@pytest.mark.skipif(version <= 20, reason='版本低于20不支持该功能')
注意reason=不可以缺。
适用于函数,也适用于类
(4)断言
pytest没有封装断言方法,可以直接使用python自带的断言:
assert 表达式
表达式结果为True即断言成功,表达式结果为False则抛出断言错误异常。
例如:assert 1==0,则抛出异常,assert 'h' in 'hello' ,则断言成功
(5)参数化
①单个参数:
@pytest.mark.parametrize('name', ['张飒', "李思思"])
②多个参数:将多个参数名使用一个字符串用逗号隔开,或将多个参数名放在一个元组里
@pytest.mark.parametrize('name,passwd,msg', test_data)
@pytest.mark.parametrize(('name','passwd','msg'), test_data)
③通过函数引入测试数据
@pytest.mark.parametrize(('name','passwd','msg'), test_data())
添加一个PO模式封装实战------在线计算器
代码:
https://download.csdn.net/download/Chrisliuluo/88588738?spm=1001.2014.3001.5503