前言
python常用测试框架有Unittest、Doctest、Nose及Pytest
unittest大部分人都非常清楚,都用来做自动化,无论是UI还是接口自动化
Nose是对unittest的扩展,使得python的测试更加简单。nose自动发现测试代码并执行,nose提供了大量的插件,但是很多插件不支持python3
doctest是python自带的一个模块,你可以把它叫做“文档测试”(doctest)模块,使用起来不太方面,被大家放弃使用
pytest是基于unittest开发的另一款更高级更好用的单元测试框架,提供了丰富的插件且容易使用,二次开发也比较简单
那大家为什么都推荐使用Pytest
pytest 的官方网站对Pytest说明如下特点:
非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
能够支持简单的单元测试和复杂的功能测试
支持用简单的assert语句实现丰富的断言
自动识别测试模块和测试函数
安装插件即可支持参数化,使用非常简单
模块化夹具用以管理各类测试资源
执行测试过程中可以将某些测试跳过(skip),或者对某些预期失败的case标记成失败
支持重复执行(rerun)失败的 case
支持运行由 nose, unittest 编写的测试 case
可生成 html 报告,特别有allure报告插件
方便的和持续集成工具 jenkins 集成
支持用例筛选,支持执行部分用例
具有很多第三方插件,并且可以自定义扩展,截止目前已有800多个各式各样的插件
pytest和Unittest区别
类型 | Unittest | Pytest |
---|---|---|
用例编写规则 | 测试文件必须先import unittest 测试类必须继承unittest.TestCase 测试方法必须以“test_”开头 测试类必须要有unittest.main()方法 |
测试文件名必须以“test_”开头或者"test"结尾 测试方法必须以“test”开头 测试类命名以"Test"开头 |
用例执行 | 默认执行全部用例,也可以通过加载testsuit,执行部分用例 | 可以通过@pytest.mark来标记类和方法,pytest.main加入参数("-m")可以只运行标记的类和方法 |
用例前置和后置 | 提供了setUp/tearDown,只能针对所有用例 | 提供模块级、函数级、类级、方法级等不同级别 更有fixture更加灵活 |
参数化 | 需依赖第三方库如ddt、paramunittest库 | 使用@pytest.mark.parametrize装饰器 |
断言 | 很多断言格式(assertEqual、assertIn、assertTrue、assertFalse) | 使用python自带的assert即可,比较自由方便 |
报告 | 使用HTMLTestRunner.py库 | 有pytest-HTML、allure插件 |
失败重跑 | 无此功能 | 使用插件pytest-rerunfailures即可完成,不需要编写多余代码 |
并发测试 | 无此功能 | 使用插件pytest-xdist即可完成,不需要编写多余代码 |
安装Pytest
- 在编辑器或者cmd命令窗口输入:
pip install pytest
或者pip install pytest -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
,安装的是最新版
- 在编译器安装模块界面安装(pycharm为例):`File -> Settings->Project->Project Interpreter
->点击"+"号->搜索框输入 pytest,选择pytest,点击Install Package`
查看版本
cmd输入框输入:pytest --version
快速开始
# _*_coding:utf-8 _*_
# @Time :2021/7/1 22:18
# @Author : king
# @File :test_01.py
# @Software :PyCharm
# @blog :https://blog.csdn.net/u010454117
# @WeChat Official Account: 【测试开发知识库】
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
class TestClass:
def test_one(self):
x = "king"
assert "k" in x
def test_two(self):
assert func(2) == 3
然后,cmd进入当前文件目录,直接执行 pytest
需掌握的知识点
如果只输入 pytest ,就会开始从当前目录及其子目录下以 test_*.py 或 *_test.py 文件,找到文件后,在文件中找到以 test 开头函数并执行
如果只想执行某个文件,可以 pytest test_01.py
加上-q,就是显示简单的执行结果: pytest -q test_01.py
加上 -v,就是显示详细的执行结果: pytest -v test_01.py
Pytest用例的编写遵循原则
默认情况下,使用Pytest编写用例时候,需要按照下面的规则去写,否则不符合规则的测试用例不会执行(后续会讲解如果更改用例搜索执行规则)
文件名以
test_*.py
文件和*_test.py
以
test_
开头的函数以
Test
开头的类,不能包含__init__
方法以
test_
开头的类里面的方法所有的包 pakege 必须要有
__init__.py
文件
Pytest cmd命令行窗口里面执行用例搜索规则
- 某个目录下所有的用例
cmd命令行输入:pytest
- 执行某一个 py 文件下用例
pytest 脚本名称.py
- 运行模块里面的某个函数,或者某个类,某个类里面的方法
pytest test_01.py::TestClass::test_one
pytest test_01.py::TestClass
pytest test_01.py::test_answer
- -m 标记表达式(后面详细讲解)
pytest -m smoke
将运行用 @pytest.mark.smoke 装饰器装饰的所有测试用例,后面再详细讲解标记相关内容
- -q 简单打印,只打印测试用例的执行结果
pytest -q test_01.py
- -v 详细打印
pytest -v test_01.py
- -s 打印print 调式相关信息
pytest -s test_01.py
- -x 遇到错误时停止测试
作用调式用例时使用,遇见失败就停止
pytest test_01.py -x
- —maxfail=num,当用例错误个数达到指定数量时,停止测试
pytest test_01.py --maxfail=1
- -k 匹配用例名称、根据用例名称排除某些用例、同时匹配不同的用例名称
pytest -s -k xkw test_01.py
pytest -s -k "not xkw" test_01.py
pytest -s -k "test_answer or test_two" test_01.py
注意
pytest 是可以兼容 unittest 脚本的,前面写的 unittest 用例稍微做下修改就能用 pytest 框架去运行
欢迎您给我留言,我们一起讨论。
*如果觉得文章不错,欢迎关注微信公众号