福州网站快速排名,平台设计图,黑客攻击的网站,it外包wordpress模板在文章Python之单元测试使用的一点心得中#xff0c;笔者介绍了自己在使用Python测试工具coverge的一点心得#xff0c;包括#xff1a;
使用coverage模块计算代码测试覆盖率使用coverage api计算代码测试覆盖率coverage配置文件的使用coverage badge的生成 本文在此基础上… 在文章Python之单元测试使用的一点心得中笔者介绍了自己在使用Python测试工具coverge的一点心得包括
使用coverage模块计算代码测试覆盖率使用coverage api计算代码测试覆盖率coverage配置文件的使用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 Flaskapp Flask(__name__)app.route(/)
def index():return Hello indexapp.route(/test)
def test():return Hello testif __name__ __main__:app.run(host0.0.0.0, port5000, debugTrue)正确的测试代码如下
# -*- coding: utf-8 -*-
import unittestfrom flask_app import appclass 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 belif isinstance(a, list) and isinstance(b, list):return a belif isinstance(a, (int, float)) and isinstance(b, (int, float)):return a belse:return None两个测试文件test_func_add1.py和test_func_add2.py内容如下
# -*- coding: utf-8 -*-
import unittestfrom func_add import addclass TestAdd(unittest.TestCase):def setUp(self):passdef test_add_case1(self):a Hellob Worldres add(a, b)print(res)self.assertEqual(res, HelloWorld)def test_add_case2(self):a 1b 2res 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 unittestfrom func_add import addclass TestAdd(unittest.TestCase):def setUp(self):passdef 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 2b 3res 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.pyfunc_add.py为实现两个变量相加的代码如前述。test_func_add.py为测试代码如下
# -*- coding: utf-8 -*-
import unittestfrom func_add import addclass TestAdd(unittest.TestCase):def setUp(self):passdef test_add_case1(self):a Hellob Worldres add(a, b)print(res)self.assertEqual(res, HelloWorld)def test_add_case2(self):a 1b 2res 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 2b 3res 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- unittestbuild-job:stage: buildscript:- echo date- echo Hello, $GITLAB_USER_LOGIN!- echo This job deploys something from the $CI_COMMIT_BRANCH branch.unit_test_job:stage: unittestimage: python:3.9-alpine3.17script:- pip3 install coverage7.3.0- coverage run test/test_func_add.py- coverage reportcoverage: /TOTAL.*\s(\d%)$/运行CI/CD结果如下图 在Gitlab项目中的Settings - CI/CD - General pipelines中点击Expand会显示CI/CD已内置Pipeline status, Coverage report, Latest release其中Coverage repor如下图 最后我们要在项目中加入coverage badge徽章在Gitlab项目中的Settings - General - Badge中点击Expand再点击Add badgecoverage徽章的配置如下 本项目中只有main分支因此不需要设置变量实际在使用过程中需要配置变量如default_branch等。 以上配置完毕后项目徽章显示如下 以上配置过程已开源项目网址为https://gitlab.com/jclian91/gitlab_ci_test 。
coverage badge生成 coverage badge生成方式分为静态和动态。 动态的话可使用coverage-badge或者genbadge模块。 静态的话可使用网站https://shields.io/badges/static-badge . 比如我们生成编程语言的徽章如下图 之后我们就可以用该网址访问徽章了。
总结 本文介绍了测试工具coverage的高阶使用希望能对读者有所启发~