Python测试框架pytest(21)插件 - 单元测试覆盖率、随机执行用例

2022-07-26 14:32:55 浏览数 (1)

Python测试框架pytest(21)

插件

单元测试覆盖率、随机执行用例

目录

  • 1、pytest-cov(单元测试覆盖率)
    • 1.1、安装
    • 1.2、示例
  • 2、pytest-random-order(随机执行用例)
    • 2.1、安装
    • 2.2、参数
    • 2.3、示例
    • 2.4、禁用随机
    • 2.5、禁用插件

1、pytest-cov(单元测试覆盖率)

在做单元测试时,一般都会参考代码覆盖率来衡量代码的质量。

pytest-cov 插件可用来统计单元测试覆盖率。

1.1、安装

在命令行中运行以下命令进行安装:

代码语言:javascript复制
pip install pytest-cov

或者(使用国内的豆瓣源,数据会定期同步国外官网,速度快。)

代码语言:javascript复制
pip install pytest-cov -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

1.2、示例

创建测试项目,目录结构:

src目录存放项目的源码

test目录存放单元测试用例

1、src目录下,创建my_status.py文件,为源代码。

功能实现为根据不同的code值,返回成功或失败信息。

脚本代码:

代码语言:javascript复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

def get_status(result):
    if result.get("code") == 000000:
        return "成功"
    elif result.get("code") == 100000:
        return "失败: %s" % result.get("msg")
    elif result.get("code") == 100001:
        return "失败: %s" % result.get("msg")
    elif result.get("code") == 100002:
        return "失败: %s" % result.get("msg")
    elif result.get("code") == 200000:
        return "失败: %s" % result.get("msg")
    elif result.get("code") == 200001:
        return "失败: %s" % result.get("msg")
    elif result.get("code") == 200002:
        return "失败: %s" % result.get("msg")
    else:
        return "失败: 系统异常,请稍后再试"

2、test目录下,创建test_my_status.py文件,为单元测试用例。

编写一条测试用例,验证code值为成功的情况。

脚本代码:

代码语言:javascript复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

from src.my_status import get_status

def test_get_status_success():
    result = {
        "code": 000000,
        "msg": "success!"
    }
    assert get_status(result) == "成功"

3、命令行跳转到项目根目录下,输入执行命令(参数 --cov):

代码语言:javascript复制
pytest --cov

运行结果:

可以看到src目录下的my_status.py文件代码覆盖率为24%,其余代码覆盖率为100%。

4、生成html覆盖率报告

输入执行命令(参数 --cov --cov-report=html):

代码语言:javascript复制
pytest --cov --cov-report=html

运行结果:

执行完成后,会在项目的根目录下生成htmlcov报告目录。

打开报告(浏览器打开index.html文件),可查看代码覆盖率。

点击指定的文件(例如my_status.py),可查看还有哪些代码没有覆盖到(标红的)。

5、指定运行模块(包、文件)

输入执行命令(参数 --cov=模块):

例如1:

代码语言:javascript复制
pytest --cov=src

运行结果:

指定运行src包下的所有模块

例如2:

代码语言:javascript复制
pytest --cov=src.my_status

运行结果:

指定运行src包下的my_status.py模块

2、pytest-random-order(随机执行用例)

pytest 默认运行用例的顺序是按模块和用例命名的 ASCII 编码顺序执行的,这就意味着每次运行用例的顺序都是一样的。

pytest-random-order 插件可打乱用例的执行顺序,进行随机执行。

该插件允许用户控制他们想要引入的随机性级别并禁用对测试子集的重新排序。通过传递先前测试运行中报告的种子值,可以按特定顺序重新运行测试。

2.1、安装

在命令行中运行以下命令进行安装:

代码语言:javascript复制
pip install pytest-random-order

或者(使用国内的豆瓣源,数据会定期同步国外官网,速度快。)

代码语言:javascript复制
pip install pytest-random-order -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

2.2、参数

--random-order 使用默认配置进行随机测试(默认情况下,它是禁用的)。

--random-order-bucket={global,package,module,class,parent,grandparent,none}

在指定的测试范围内进行随机测试。

类型:

--random-order-seed=RANDOM_ORDER_SEED 使用特定种子进行随机测试。

2.3、示例

创建项目,目录结构如下:

创建module1包下的test_case1.py文件,编写测试用例。

脚本代码:

代码语言:javascript复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

class TestDemo():
    def test_case1(self):
        print("执行用例1")

    def test_case2(self):
        print("执行用例2")

    def test_case3(self):
        print("执行用例3")

创建module2包下的test_case2.py文件,编写测试用例。

脚本代码:

代码语言:javascript复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

class TestClass():
    def test_case4(self):
        print("执行用例4")

    def test_case5(self):
        print("执行用例5")

    def test_case6(self):
        print("执行用例6")

1、默认执行

打开命令行,项目根目录下,执行命令

代码语言:javascript复制
pytest -v

运行结果:

默认按顺序执行。

2、使用参数 --random-order

命令行执行命令

代码语言:javascript复制
pytest -v --random-order

运行结果:

按随机执行用例,默认使用--random-order-bucket=module。

--random-order-seed=179023,每次执行后seed值都会变。

3、使用参数 --random-order-bucket

命令行执行命令

代码语言:javascript复制
pytest -v --random-order-bucket=global

运行结果:

参数值为global,将所有的用例打乱执行。

4、使用参数 --random-order-seed

在使用随机执行时,如果想按照上次随机执行用例的顺序,可以使用此参数。

例如上次执行后,--random-order-seed=455773,则使用seed值455773。

命令行执行命令

代码语言:javascript复制
pytest -v --random-order-seed=455773

运行结果:

根据随机种子,执行顺序与上一次相同。

2.4、禁用随机

在模块或类中想禁止用例随机执行,可以使用

pytestmark = pytest.mark.random_order(disabled=True)

创建module1包下的test_case3.py文件,编写测试用例。

脚本代码:

代码语言:javascript复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest

pytestmark = pytest.mark.random_order(disabled=True)

def test_case7():
    print("执行用例7")

def test_case8():
    print("执行用例8")

def test_case9():
    print("执行用例9")

创建module2包下的test_case4.py文件,编写测试用例。

脚本代码:

代码语言:javascript复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest

class TestCase():
    pytestmark = pytest.mark.random_order(disabled=True)

    def test_case10(self):
        print("执行用例10")

    def test_case11(self):
        print("执行用例11")

    def test_case12(self):
        print("执行用例12")

命令行执行命令

代码语言:javascript复制
pytest -v --random-order

运行结果:

设置禁止随机执行的用例,都是按照顺序执行的。

2.5、禁用插件

如果不想使用此插件,输入禁用插件的命令

代码语言:javascript复制
pytest -p no:random_order

注意:默认情况下禁用随机化。通过传递 -p no:random_order 您将停止插件的注册,因此其钩子将不会被注册,并且命令行选项也不会出现在 --help 中。

0 人点赞