pytest介绍
pytest的使用
pytest优点
入门简单,文档丰富
支持单元测试,功能测试
支持参数化,重复执行,部分执行,测试跳过
兼容其他测试框架(nose,unittest 等)
支持生成html报告
可集成CI环境(Jenkins 等)
第三方插件丰富,良好的自定义扩展性
环境安装
pip install pytest
一、pytest 对比 unittest
1、unittest是python中的官方库,兼容性更好,更稳定,pytest在安装的时候,可能会出现和python版本的兼容问题。
2、unittest编写用例一定要以类的形式去编写,而且必须要继承TestCase,
3、pytest编写用例,既可以使用类的形式,又可以使用函数的形式,并且无需继承
4、unittest要自己加载用例到套件,再去执行,pytest更加智能,会自动查找用例
5、pytest可以对用例打便签做分类管理,可以通过便签筛选用例,执行用例更加的灵活
6、pytest有用例失败重运行机制,unittest没有。
7、pytest支持的插件非常丰富,功能扩展性强。
8、pytest用例执行的前置后置处理更加灵活
9、执行顺序不一样,unittest是按照ASCLL码顺序执行,pytest是从上到下的顺序执行
10、unittest有好多种断言方法,pytest只有assert
11、unittest参数化需要结合ddt使用,pytest有自己的参数化方法 @pytest.mark.parametrize装饰器
12、Pytest测试类以Test开头,并且不能带有 init 方法
二、pytest 运行的方式
方式一:命令行输入 pytest
方式二:使用pycahrm以pytest方式运行用例文件方式三:创建一个启动文件:
方式三:创建一个启动文件:
运行参数
pytest.main()
指定测试模块:
# pytest 文件名
pytest test_mod.py
指定测试目录:
# pytest 文件路径
pytest testcases
指定测试用例执行:
# 测试节点的组成:
# py模块名::类名::函数名
pytest test_dome.py::TestLogin::test_login_pass
# pytest py模块名::函数名
pytest test_dome.py::test_demo2
通过关键字表达式过滤执行:
# 这条命令会匹配文件名、类名、方法名匹配表达式的用例
pytest -k "MyClass and not method"
通过标记表达式执行
# 这条命令会执行被装饰器 @pytest.mark.smoke 装饰的所有测试用例
pytest -m smoke
三、测试用例的规范
1、发现用例的规则
1、测试文件 以 *_test.py 开头或者结尾
2、Test开头的类 中test开头的方法【并且不能带有__init__方法】
3、模块中test开头的函数注意点:
1、pytest 是以方法为单位发现用例的,你写不写测试类根本不重要。
2、在那个目录下执行pytest,就在哪个目录下按照上述规则去查找
2、自定义查找规则:pytest.ini
[pytest]
# 文件以test开头和test(check开头和check结尾)结尾都会当成测试用例
python_files =
test*.py
*基础版1.py
cheack_*.py
test_*.py
# 方法以test开头和test(check开头和check结尾)结尾都会当成测试用例
python_functions =
test*
*test
check*
*check
# 类以test开头和test(check开头和check结尾)结尾都会当成测试用例
python_classes =
Test*
*Test
Check*
*Check
四、用例打标记
需求:有一部分老的用例,一部分新用例,我只想运行对用例进行标注,打标签
1、注册标签
mark 注册:创建 pytest.ini 文件
五、用例执行顺序
1、unittest用例执行排序:
根据ASCII码来排序
2、pytest用例执行的顺序:
文件名称 按 ASCII 码排序
文件内根据定义的的方法的先后顺序,从上到下执行
六、断言
使用关键字:assert断言
assert a % 2 == 0
七、测试报告
pip install pytest-html
# 第一种:log 普通文本: TextTestRunner
--resultlog=report/demo.txt 相对路径
# 第二种:xml, 生成 xml 文件
--junitxml=report/demo.xml
# 第三种:html HTMLTestRunner,
--html=report/demo.html
# 第四种:allure :
allure 是一个通用的测试报告的框架。python, java,php, ruby
八、参数化(数据驱动)
pytest写的用例,如何实现用例数据参数化? 使用pytest.parametrize
@pytest.mark.parametrize("用例方法中接收的参数名",数据)
九、fixture
"""
fixture(scope="function") 根据方法运行
fixture(scope="class") 根据类运行
fixture(scope="module") 根据模块运行
fixture(scope="package") 根据包运行
fixture(scope="session") 根据会话对象运行
fixture(autouse="True") autouse="True"会自动加到所有用例前后置
定义:
1.@pytest.fixture(scope="function")
2.@pytest.fixture(scope="class")
调用:
1.在用例方法参数中,写上前后置的方法名
2.在定义前后置方法的
注意点:前后置方法可以统一放到congtest.py文件中(用例文件中直接使用,不需要导入)
方式一:
方式二:
方式三: