pytest测试框架系列 - 快速入门和简单使用

前言

  • 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,安装的是最新版
cmd窗口
  • 在编译器安装模块界面安装(pycharm为例):`File -> Settings->Project->Project Interpreter

->点击"+"号->搜索框输入 pytest,选择pytest,点击Install Package`

pycharm安装

查看版本

cmd输入框输入:pytest --version

pytest版本

快速开始


# _*_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命令行窗口里面执行用例搜索规则

  1. 某个目录下所有的用例 cmd命令行输入:pytest
pytest
  1. 执行某一个 py 文件下用例 pytest 脚本名称.py
在这里插入图片描述
  1. 运行模块里面的某个函数,或者某个类,某个类里面的方法

pytest test_01.py::TestClass::test_one

pytest test_01.py::TestClass

pytest test_01.py::test_answer

执行结果
  1. -m 标记表达式(后面详细讲解)

pytest -m smoke

将运行用 @pytest.mark.smoke 装饰器装饰的所有测试用例,后面再详细讲解标记相关内容

  1. -q 简单打印,只打印测试用例的执行结果

pytest -q test_01.py

执行结果
  1. -v 详细打印

pytest -v test_01.py

-v 详细打印
  1. -s 打印print 调式相关信息

pytest -s test_01.py

-s
  1. -x 遇到错误时停止测试

作用调式用例时使用,遇见失败就停止

pytest test_01.py -x

-x
  1. —maxfail=num,当用例错误个数达到指定数量时,停止测试

pytest test_01.py --maxfail=1

—maxfail=num,当用例错误个数达到指定数量时,停止测试
  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 框架去运行

欢迎您给我留言,我们一起讨论。

*如果觉得文章不错,欢迎关注微信公众号

微信公众号

你可能感兴趣的:(pytest测试框架系列 - 快速入门和简单使用)