测试工具coverage的高阶使用

这篇具有很好参考价值的文章主要介绍了测试工具coverage的高阶使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  在文章Python之单元测试使用的一点心得中,笔者介绍了自己在使用Python测试工具coverge的一点心得,包括:

  1. 使用coverage模块计算代码测试覆盖率
  2. 使用coverage api计算代码测试覆盖率
  3. coverage配置文件的使用
  4. coverage badge的生成

  本文在此基础上,将会介绍coverage的高阶使用,包括:

  • Flask API测试
  • coverage多文件测试
  • coverage的Gitlab CI/CD集成
  • coverage badge生成

  本文中使用coverage的版本均为7.3.0。

Flask API测试

  在unittest测试框架如果对Flask API进行测试时使用HTTP请求,那么将无法得到代码覆盖率。
  我们有如下的示例Flask服务:

# -*- coding: utf-8 -*-
from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():
    return "Hello index"


@app.route('/test')
def test():
    return "Hello test"


if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000, debug=True)

  正确的测试代码如下:

# -*- coding: utf-8 -*-
import unittest

from flask_app import app


class AppTestCase(unittest.TestCase):
    def setUp(self):
        self.ctx = app.app_context()
        self.ctx.push()
        self.client = app.test_client()

    def tearDown(self):
        self.ctx.pop()

    def test_case1(self):
        response = self.client.get("/")
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.text, "Hello index")

    def test_case2(self):
        response = self.client.get("/test")
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.text, "Hello test")


if __name__ == "__main__":
    suite = unittest.TestSuite()
    suite.addTest(AppTestCase('test_case1'))
    suite.addTest(AppTestCase('test_case2'))
    run = unittest.TextTestRunner()
    run.run(suite)

coverage多文件测试

  我们有如下的实现两个变量相加的代码(func_add.py):

# -*- coding: utf-8 -*-
def add(a, b):
    if isinstance(a, str) and isinstance(b, str):
        return a + '+' + b
    elif isinstance(a, list) and isinstance(b, list):
        return a + b
    elif isinstance(a, (int, float)) and isinstance(b, (int, float)):
        return a + b
    else:
        return None

  两个测试文件test_func_add1.pytest_func_add2.py,内容如下:

# -*- coding: utf-8 -*-
import unittest

from func_add import add


class TestAdd(unittest.TestCase):
    def setUp(self):
        pass

    def test_add_case1(self):
        a = "Hello"
        b = "World"
        res = add(a, b)
        print(res)
        self.assertEqual(res, "Hello+World")

    def test_add_case2(self):
        a = 1
        b = 2
        res = add(a, b)
        print(res)
        self.assertEqual(res, 3)


if __name__ == '__main__':

    # 部分用例测试
    # 构造一个容器用来存放我们的测试用例
    suite = unittest.TestSuite()
    # 添加类中的测试用例
    suite.addTest(TestAdd('test_add_case1'))
    suite.addTest(TestAdd('test_add_case2'))
    run = unittest.TextTestRunner()
    run.run(suite)
# -*- coding: utf-8 -*-
import unittest

from func_add import add


class TestAdd(unittest.TestCase):
    def setUp(self):
        pass

    def test_add_case3(self):
        a = [1, 2]
        b = [3]
        res = add(a, b)
        print(res)
        self.assertEqual(res, [1, 2, 3])

    def test_add_case4(self):
        a = 2
        b = "3"
        res = add(a, b)
        print(None)
        self.assertEqual(res, None)


if __name__ == '__main__':

    # 部分用例测试
    # 构造一个容器用来存放我们的测试用例
    suite = unittest.TestSuite()
    # 添加类中的测试用例
    suite.addTest(TestAdd('test_add_case3'))
    suite.addTest(TestAdd('test_add_case4'))
    run = unittest.TextTestRunner()
    run.run(suite)

使用命令进行测试:

coverage run test_func_add1.py
coverage run test_func_add2.py
coverage report

生成的代码测试覆盖率如下:

Name          Stmts   Miss  Cover
---------------------------------
func_add.py       8      2    75%
---------------------------------
TOTAL             8      2    75%

这是不符合我们预期的,因为在这两个测试文件中我们对所有的代码都进行了测试,理论上测试覆盖率应该为100%,之所以这样,是因为coverage run命令运行时每一次都会覆盖掉之前的测试。正确的测试命令(以文件追加的形式)如下:

coverage run test_func_add1.py
coverage run --append test_func_add2.py
coverage report

此时代码覆盖率如下:

Name          Stmts   Miss  Cover
---------------------------------
func_add.py       8      0   100%
---------------------------------
TOTAL             8      0   100%

coverage的Gitlab CI/CD集成

  在文章Gitlab CI/CD入门(一)Python项目的CI演示中,笔者介绍了Gitlab CI/CD的入门。在此基础上,我们将集成coverage。
  首先我们的test目录如下:

.
├── __init__.py
├── func_add.py
└── test_func_add.py

func_add.py为实现两个变量相加的代码,如前述。test_func_add.py为测试代码,如下:

# -*- coding: utf-8 -*-
import unittest

from func_add import add


class TestAdd(unittest.TestCase):
    def setUp(self):
        pass

    def test_add_case1(self):
        a = "Hello"
        b = "World"
        res = add(a, b)
        print(res)
        self.assertEqual(res, "Hello+World")

    def test_add_case2(self):
        a = 1
        b = 2
        res = add(a, b)
        print(res)
        self.assertEqual(res, 3)

    def test_add_case3(self):
        a = [1, 2]
        b = [3]
        res = add(a, b)
        print(res)
        self.assertEqual(res, [1, 2, 3])

    def test_add_case4(self):
        a = 2
        b = "3"
        res = add(a, b)
        print(None)
        self.assertEqual(res, None)


if __name__ == '__main__':

    # 部分用例测试
    # 构造一个容器用来存放我们的测试用例
    suite = unittest.TestSuite()
    # 添加类中的测试用例
    suite.addTest(TestAdd('test_add_case1'))
    suite.addTest(TestAdd('test_add_case2'))
    suite.addTest(TestAdd('test_add_case3'))
    suite.addTest(TestAdd('test_add_case4'))
    run = unittest.TextTestRunner()
    run.run(suite)

CI/CD依赖.gitlab-ci.yml,配置如下:

stages:
  - build
  - unittest

build-job:
  stage: build
  script:
    - echo `date`
    - echo "Hello, $GITLAB_USER_LOGIN!"
    - echo "This job deploys something from the $CI_COMMIT_BRANCH branch."

unit_test_job:
  stage: unittest
  image: python:3.9-alpine3.17
  script:
    - pip3 install coverage==7.3.0
    - coverage run test/test_func_add.py
    - coverage report
  coverage: '/TOTAL.*\s+(\d+%)$/'

  运行CI/CD,结果如下图:
测试工具coverage的高阶使用,Python,测试工具
  在Gitlab项目中的Settings -> CI/CD -> General pipelines中点击Expand,会显示CI/CD已内置Pipeline status, Coverage report, Latest release,其中Coverage repor如下图:
测试工具coverage的高阶使用,Python,测试工具
  最后我们要在项目中加入coverage badge(徽章),在Gitlab项目中的Settings -> General -> Badge中点击Expand,再点击Add badge,coverage徽章的配置如下:
测试工具coverage的高阶使用,Python,测试工具
本项目中只有main分支,因此不需要设置变量,实际在使用过程中,需要配置变量如default_branch等。
  以上配置完毕后,项目徽章显示如下:

测试工具coverage的高阶使用,Python,测试工具
  以上配置过程已开源,项目网址为:https://gitlab.com/jclian91/gitlab_ci_test 。

coverage badge生成

  coverage badge生成方式分为静态和动态。
  动态的话,可使用coverage-badge或者genbadge模块。
  静态的话,可使用网站:https://shields.io/badges/static-badge .
  比如我们生成编程语言的徽章,如下图:
测试工具coverage的高阶使用,Python,测试工具
之后我们就可以用该网址访问徽章了。

总结

  本文介绍了测试工具coverage的高阶使用,希望能对读者有所启发~文章来源地址https://www.toymoban.com/news/detail-659994.html

到了这里,关于测试工具coverage的高阶使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用Python编写一个代理池测试工具

    部分数据来源: ChatGPT 背景:         在进行网络爬虫时,我们经常需要使用代理池来防止IP被网站禁封。代理池是一个保存多个代理IP地址的数据库,我们可以从数据库中随机选择一个代理地址来进行网络请求,避免过多请求来自同一个IP地址。 为了提高爬虫程序的稳定

    2024年02月08日
    浏览(39)
  • Python自动化测试工具selenium使用指南

    概述 selenium 是网页应用中最流行的自动化测试工具,可以用来做自动化测试或者浏览器爬虫等。官网地址为:相对于另外一款web自动化测试工具QTP来说有如下优点: 免费开源轻量级,不同语言只需要一个体积很小的依赖包 支持多种系统,包括Windows,Mac,Linux 支持多种浏览器

    2024年02月04日
    浏览(63)
  • 测试员进阶必看系列 “ python自动化测试工具selenium使用指南 ”

    概述 python+selenium环境安装 使用selenium启动浏览器 selenium页面加载等待和检测 使用time.sleep()等待 使用implicitly_wait设置最长等待时间 使用WebDriverWait设置等待条件 检测document是否加载完成 selenium元素定位和读取 查找元素 dom元素交互 查找元素失败处理 selenium交互控制 ActionChains动

    2024年02月05日
    浏览(107)
  • 如何使用Python自动化测试工具Selenium进行网页自动化?

    Selenium 是一个流行的Web自动化测试框架, 它支持多种编程语言和浏览器,并提供了丰富的API和工具来模拟用户在浏览器中的行为 。 Selenium可以通过代码驱动浏览器自动化测试流程,包括页面导航、元素查找、数据填充、点击操作等。 与PyAutoGUI和AutoIt相比, Selenium更适合于处

    2023年04月09日
    浏览(120)
  • python自动化测试工具selenium使用指南 ,绝对能帮到你

    目录 概述 python+selenium环境安装 使用selenium启动浏览器 selenium页面加载等待和检测 使用time.sleep()等待 使用implicitly_wait设置最长等待时间 使用WebDriverWait设置等待条件 检测document是否加载完成 selenium元素定位和读取 查找元素 dom元素交互 查找元素失败处理 selenium交互控制 Actio

    2024年02月08日
    浏览(50)
  • 【测试开发】Python+Django实现接口测试工具

    Python+Django接口自动化  引言:          最近被几个公司实习生整自闭了,没有基础,想学自动化又不知道怎么去学,没有方向没有头绪,说白了其实就是学习过程中没有成就感,所以学不下去。出于各种花里胡哨的原因,今天给大家整一个简单又有成就感的接口自动化学习

    2024年02月15日
    浏览(50)
  • Python性能测试工具Locust入门

    1、性能测试该怎么做? 利用工具模拟真实用户操作。 2、性能测试基础: 性能:事物的性质和能效 --效率性能 (时间/资源/容量) 思考:如何评价软件系统的性能? 快慢:衡量系统的处理效率 (响应时间) 多少:衡量系统的处理能力(单位时间内,能处理多少个事物) 3、性

    2024年02月07日
    浏览(58)
  • python自动化测试工具selenium

    selenium 是网页应用中最流行的自动化测试工具,可以用来做自动化测试或者浏览器爬虫等。官网地址为:Selenium。相对于另外一款web自动化测试工具QTP来说有如下优点: 免费开源轻量级,不同语言只需要一个体积很小的依赖包 支持多种系统,包括Windows,Mac,Linux 支持多种浏

    2024年02月08日
    浏览(81)
  • Python+Requests+PyWebIO框架详解,编写测试工具提高团队测试效率

    老铁们如果是QA,想必也遇到过类似痛点吧: 业务逻辑复杂性决定测试场景复杂性,配置测试场景常常花费大量时间,导致测试效率降低 新用户的测试场景,账号可能经常注销,协助debug时需要用userid,每次都得重新抓包。而且测试账号很多,来回切,即使在本地管理userid,

    2024年02月13日
    浏览(40)
  • 【Python百宝箱】Python测试工具大揭秘:从单元测试到Web自动化

    在现代软件开发中,测试是确保代码质量和稳定性的关键步骤。Python作为一门广泛应用的编程语言,拥有丰富的测试工具和库,从单元测试到Web自动化,覆盖了多个测试层面。本文将介绍一系列Python测试工具,帮助开发者选择适合项目需求的工具,提高代码的可靠性和可维护

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包