Bootstrap

python单元测试框架—pytest

目录

简介

安装

验证安装成功

pytest用例编写规则

pytest执行方式

pytest 在当前目录下运行所有测试

pytest test_mod.py 执行指定的测试文件

pytest somepath 在指定路径下运行所有测试

pytest -k stringexpr 当测试文件、测试类名、测试方法中包含stringexpr关键字时,均可以被执行

pytest test_mod.py::test_func 仅运行与节点ID匹配的测试

pytest常用命令

pytest测试报告

​编辑失败重跑

setup和teardown函数

控制测试函数的运行顺序 

pytest.ini:通过配置文件配置要执行的测试用例 

@pytest.fixture

方法和参数

作为参数引用

作为函数引用 

设置自动执行 

设置作用域

作用域为function

作用域为class

作用域为module 

作用域为session

返回值

参数化

@pytest.mark 

skipif跳过测试函数

xfail预期失败函数 

parametrize参数化函数

单个参数

多个参数 

conftest.py 在指定范围内共享fixture实例

scope="function"

 scope="module"

先实例化更大范围的设备

fixture的完成与拆卸(teardown)代码

1) yield方式

2) addfinalizer方式(推荐使用) 

yield和addfinalizer方式的区别:

fixture参数化

fixture作用域

文件夹级别的覆盖

模块级别的覆盖 

参数化覆盖

Allure

下载Allure

安装pytest-allure

生成报告

查看测试报告

allure特性

添加feature、story、step

添加allure.attach

添加link, issue, testcase 

添加severity


简介

pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。

根据pytest的官方网站介绍,它具有如下特点:

(1)非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
(2)能够支持简单的单元测试和复杂的功能测试
(3)支持参数化
(4)执行测试过程中可以将某些测试跳过,或者对某些预期失败的case标记成失败
(5)支持重复执行失败的case
(6)支持运行由nose, unittest编写的测试case
(7)pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等
(8)方便的和持续集成工具集成

安装

py -3 -m pip install pytest

或者

py -3 -m pip install -U pytest

验证安装成功

pytest --version

pytest用例编写规则

(1)测试文件以test_开头(以_test结尾也可以),注意:pytest 文件名.py不受此规则限制。

(2)测试类以Test开头,并且不能带有 __init__ 方法

(3)测试函数以test_开头

(4)断言使用基本的assert即可

pytest执行方式

pytest 在当前目录下运行所有测试

# 执行pytest目录下所有test_开头(以_test结尾也可以)的py文件
# 子目录中以_test开头或结尾的py文件也会被执行
...\pytest>pytest

pytest test_mod.py 执行指定的测试文件

# 执行某个测试文件
...\pytest>pytest test_a.py

pytest somepath 在指定路径下运行所有测试

# 执行指定目录下所有test_开头(以_test结尾也可以)的py文件
...\pytest>pytest pytest_sub_path

pytest -k stringexpr 当测试文件、测试类名、测试方法中包含stringexpr关键字时,均可以被执行

# 测试文件、测试类名、测试方法中包含指定关键字,匹配成功时,均可以被执行
F:\LiFuChe\python_20_自动化\pytest>pytest -k fixture
================================ test session starts ================================
platform win32 -- Python 3.10.2, pytest-7.1.2, pluggy-1.0.0
rootdir: F:\LiFuChe\python_20_自动化\pytest
plugins: html-3.1.1, metadata-2.0.2, ordering-0.6, rerunfailures-10.2
collected 49 items / 29 deselected / 20 selected

test_fixture1.py .                                                             [  5%]
test_fixture2.py ...                                                           [ 20%]
test_fixture3.py ...                                                           [ 35%]
test_fixture4.py ...                                                           [ 50%]
test_fixture5.py .F                                                            [ 60%]
test_fixture6.py ....                                                          [ 80%]
conftest\test_fixture_module.py FF                                             [ 90%]
test_conftest\test_fixture_module.py FF

pytest test_mod.py::test_func 仅运行与节点ID匹配的测试

pytest test_a.py::test_case1 #执行test_a.py文件下的test_case1函数
pytest test_mod.py::TestClass::test_method #执行指定测试类TestClass中的test_method 方法

pytest常用命令

使用pytest --help可以查看全部选项

命令 说明
-q 等价于pytest --quiet,简化输出信息
-s 等价于pytest --capture=no,输出测试用例中的打印信息
-v 等价于pytest --verbose,显示具体的详情信息(哪个测试用例的哪个测试方法被执行),一般显示错误的位置及错误的详细信息
-m 用于标记测试并分组,以便快速选中并运行。需要先在待分组的方法前加上@pytest.mark.mark_name这样的装饰器,执行时用pytest-m  mark_name。
-m还可以用表达式指定多个标记。使用-m "mark1 and mark2"可以同时选中带有这两个标记的所有测试用例。使用-m "mark1 and not mark2"则会选中带有mark1但不带mark2的测试用例;使用-m "mark1 or mark2"则选中带有mark1或mark2的所有测试用例
-k 后面可为测试文件、测试类名、测试方法中包含的关键字,匹配成功时,均可以被执行
--lf 等价于--last-failed,只重新运行上次运行失败的用例(如果没有失败的话,会全部跑)
--ff 等价于--failed-first,运行所有测试用例,但首先运行上次运行失败的测试
--x 等价于--exitfirst,遇到错误或者用力不通过,则退出执行
--maxfailed=num 指定执行失败次数后停止

pytest测试报告

生成测试报告需要安装插件:

py -3 -m pip install pytest-html

或:pip install -U pytest-html

执行用例的命令:

pytest --html=report.html

失败重跑

需要安装插件:

py -3 -m pip install pytest-rerunfailures

或:pip install -U pytest-rerunfailures

运行命令:

pytest test_sample2.py --reruns n

# n表示重试的次数

setup和teardown函数

setup和teardown:每个测试函数运行时,运行一次

import pytest

class Test_ST():
    def setup(self):
        print("------setup------")

    def teardown(self):
        print("------teardown------")

    def test_001(self):
        assert True

    def test_002(self):
        assert False

setup_class和teardown_class:一个测试类只运行一次

import pytest

class Test_ST():
    def setup_class(cls):
        print("------setup_class------")

    def teardown_class(cls):
        print("------teardown_class------")

    def test_001(self):
        assert True

    def test_002(self):
        assert True

控制测试函数的运行顺序 

需要安装插件:

py -3 -m pip install pytest-ordering

使用访求:

  1. 使用 @pytest.mark.run(order=x) 标记被测试函数;
  2. 运行的顺序由order传入的参数决定;(order从小到大的顺序执行)
import pytest
class Test_ST():

    @pytest.mark.run(order=3)
    def test_001(self):
        print("001...")
        assert True

    @pytest.mark.run(order=2)
    def test_002(self):
        print("002...")
        assert True

    @pytest.mark.run(order=1)
    def test_003(self):
        print("003...")
        assert True

pytest.ini:通过配置文件配置要执行的测试用例 

(1)pytest的配置文件存放位置及命名:
通常放在测试目录下,名称为pytest.ini,命令行运行时会使用配置文件中的配置
(2)配置pytest命令行运行参数
[pytest]
addopts=-s ...  # 以空格分隔,可添加个命令行参数

;