浅谈如何测试Python代码python

如果可能的话,代码库中的所有代码都要测试。但这取决于开发者,如果写一个健壮性测试是不切实际的,你可以跳过它。就像_NickCoghlan_(Python核心开发成员)在访谈里面说的:有一个坚实可靠的测试套件,你可以做出大的改动,并确信外部可见行为保持不变。

这里引用维基百科的介绍:

在计算机编程中,单元测试(英语:UnitTesting)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

单元测试模块

在Python里我们有unittest这个模块来帮助我们进行单元测试。

阶乘计算程序

在这个例子中我们将写一个计算阶乘的程序factorial.py:

importsysdeffact(n):"""阶乘函数:argn:数字:returns:n的阶乘"""ifn==0:return1returnn*fact(n-1)defdiv(n):"""只是做除法"""res=10/nreturnresdefmain(n):res=fact(n)print(res)if__name__=='__main__':iflen(sys.argv)>1:main(int(sys.argv[1]))运行程序:

$python3factorial.py5

测试哪个函数?

正如你所看到的,fact(n)这个函数执行所有的计算,所以我们至少应该测试这个函数。

编辑factorial_test.py文件,代码如下:

importunittestfromfactorialimportfactclassTestFactorial(unittest.TestCase):"""我们的基本测试类"""deftest_fact(self):"""实际测试任何以`test_`开头的方法都被视作测试用例"""res=fact(5)self.assertEqual(res,120)if__name__=='__main__':unittest.main()运行测试:

$python3factorial_test.py.----------------------------------------------------------------------Ran1testin0.000sOK说明

我们首先导入了unittest模块,然后测试我们需要测试的函数。

测试用例是通过子类化unittest.TestCase创建的。

现在我们打开测试文件并且把120更改为121,然后看看会发生什么?

各类assert语句

如果我们在factorial.py中调用div(0),我们能看到异常被抛出。

我们也能测试这些异常,就像这样:

self.assertRaises(ZeroDivisionError,div,0)完整代码:

importunittestfromfactorialimportfact,divclassTestFactorial(unittest.TestCase):"""我们的基本测试类"""deftest_fact(self):"""实际测试任何以`test_`开头的方法都被视作测试用例"""res=fact(5)self.assertEqual(res,120)deftest_error(self):"""测试由运行时错误引发的异常"""self.assertRaises(ZeroDivisionError,div,0)if__name__=='__main__':unittest.main()

mounttab.py中只有一个mount_details()函数,函数分析并打印挂载详细信息。

importosdefmount_details():"""打印挂载详细信息"""ifos.path.exists('/proc/mounts'):fd=open('/proc/mounts')forlineinfd:line=line.strip()words=line.split()print('{}on{}type{}'.format(words[0],words[1],words[2]),end='')iflen(words)>5:print('({})'.format(''.join(words[3:-2])))else:print()fd.close()if__name__=='__main__':mount_details()重构mounttab.py

现在我们在mounttab2.py中重构了上面的代码并且有一个我们能容易的测试的新函数parse_mounts()。

importosdefparse_mounts():"""分析/proc/mounts并返回元祖的列表"""result=[]ifos.path.exists('/proc/mounts'):fd=open('/proc/mounts')forlineinfd:line=line.strip()words=line.split()iflen(words)>5:res=(words[0],words[1],words[2],'({})'.format(''.join(words[3:-2])))else:res=(words[0],words[1],words[2])result.append(res)fd.close()returnresultdefmount_details():"""打印挂载详细信息"""result=parse_mounts()forlineinresult:iflen(line)==4:print('{}on{}type{}{}'.format(*line))else:print('{}on{}type{}'.format(*line))if__name__=='__main__':mount_details()同样我们测试代码,编写mounttest.py文件:

#!/usr/bin/envpythonimportunittestfrommounttab2importparse_mountsclassTestMount(unittest.TestCase):"""我们的基本测试类"""deftest_parsemount(self):"""实际测试任何以`test_`开头的方法都被视作测试用例"""result=parse_mounts()self.assertIsInstance(result,list)self.assertIsInstance(result[0],tuple)deftest_rootext4(self):"""测试找出根文件系统"""result=parse_mounts()forlineinresult:ifline[1]=='/'andline[2]!='rootfs':self.assertEqual(line[2],'ext4')if__name__=='__main__':unittest.main()运行程序

$python3mounttest.py..----------------------------------------------------------------------Ran2testsin0.001sOK

测试覆盖率是找到代码库未经测试的部分的简单方法。它并不会告诉你的测试好不好。

在Python中我们已经有了一个不错的覆盖率工具来帮助我们。你可以在实验楼环境中安装它:

$sudopip3installcoverage覆盖率示例

$coverage3runmounttest.py..----------------------------------------------------------------------Ran2testsin0.013sOK$coverage3report-mNameStmtsMissCoverMissing--------------------------------------------mounttab2.py22768%16,25-30,34mounttest.py140100%--------------------------------------------TOTAL36781%

我们还可以使用下面的命令以HTML文件的形式输出覆盖率结果,然后在浏览器中查看它。

$coverage3html

知识点回顾:

本节了解了什么是单元测试,unittest模块怎么用,测试用例怎么写。以及最后我们使用第三方模块coverage进行了覆盖率测试。

在实际生产环境中,测试环节是非常重要的的一环,即便志不在测试工程师,但以后的趋势就是DevOps,所以掌握良好的测试技能也是很有用的。

THE END
1.VS如何运行测试代码VS如何运行测试代码 简介 现在我们来看看,VS如何运行测试代码。工具/原料 联想2020 Win11 VS 2017 方法/步骤 1 我们可以使用最简单的办法直接点击启动按钮。2 或者我们点击菜单栏中的测试按钮。3 然后我们点击运行二级菜单。4 接下来我们点击所以测试按钮。5 也可以使用它的快捷键。6 同理,还可以使用它的调试命令https://jingyan.baidu.com/article/67662997a06a7d54d51b84e7.html
2.Python中如何实现代码测试问答在Python中,通常可以使用以下几种方法来实现代码测试:1. 单元测试(Unit testing):使用Python内置的unittest模块或第三方库如pytest来编写和运行单元测试,以验证https://www.yisu.com/ask/27942242.html
3.Golang中如何编写test测试代码这个输出结果是否是我们期望的!很多是否都要碰都这种情况,特别是在写一些项目的时候,文件很多代码也多,以前在不知道这样方法的时候就很恼火,以前在遇到这种情况的时候处理方法就是用IDE新建一个环境,然后把要测试的函数直接复制过去,但是这样不仅麻烦很多时候还没有办法做。https://www.jianshu.com/p/3e9aa5d20782
4.MSDN—探索如何创建测试和理解代码MicrosoftLearn创建代码 了解如何创建代码,获取工具,并立即开始学习。 测试代码 阅读有关测试代码的基础知识,获取工具,并立即了解更多信息。 理解代码 学习理解代码的过程,获取工具,并深入了解! 所有开发人员中心 展开表 任务 展开表 理解代码 理解代码涉及多个任务。工具可帮助您以直观形式查看和理解代码的组织、关系和行为。 https://msdn.microsoft.com/zh-cn/gg192976
5.如何创建临时查询,测试运行代码临时查询用于在本地测试代码的实际情况与期望值是否相符或排查代码错误。 背景信息 若您仅需在数据开发(DataStudio),即开发环境,查询数据及相关SQL代码、测试代码的实际运行情况与期望值是否相符,或验证代码的正确性,而无需将数据或SQL代码发布至生产环境并操作生产环境引擎,则可通过 新建临时查询文件实现。https://help.aliyun.com/zh/dataworks/user-guide/create-an-ad-hoc-query
6.四种常见的代码覆盖率测试当您添加新的功能和测试时,增加代码覆盖率百分比可以让您更加确信您的应用程序已经经过了彻底的测试。然而,还有更多的问题有待发现。 四种常见的代码覆盖类型 有四种常见的方法来收集和计算代码覆盖率:函数、行、分支和语句覆盖率。要查看每种类型的代码覆盖率如何计算其百分比,请思考以下计算咖啡成分的代码示例: https://blog.csdn.net/2301_81967508/article/details/144409765
7.谷歌指南:编写可测试的代码谷歌的软件工程师为了保持代码的最佳状态, 写了以下提醒. 缺陷: 构造器做了真正的工作 构造器中的工作包括: 创建/初始化协同类, 和其他service通信, 和设置自身状态的逻辑, 失去了测试的必要, 迫使subclass/mocks去继承不必要的行为. 构造器中太多的工作阻止了测试中的实例化或协同类的修改. https://zhuanlan.zhihu.com/p/146951456
8.JavaIDE如何使用代码覆盖率工具?在软件开发中,代码覆盖率是一个重要的质量指标,它用于衡量测试代码对实际代码的覆盖程度。Java 开发者常常使用 IntelliJ IDEA 这样的 IDE 来进行项目开发和代码测试。然而,有时在使用“Run with Coverage”功能时,会遇到一些问题,导致代码覆盖率无法正常工作。本文将介绍如何在 IntelliJ IDEA 中使用代码覆盖率工具,并https://blog.51cto.com/u_16175520/11996918
9.如何在树莓派4B上通过GoogleMediapipe解决方案实现手势检测6. 编写代码测试 接下来就可以尝试编写代码进行测试了,其中可以参考官方提供Python代码示例来进行学习: import cv2 import mediapipe as mp mp_drawing = mp.solutions.drawing_utils mp_drawing_styles = mp.solutions.drawing_styles mp_hands = mp.solutions.hands https://www.eet-china.com/mp/a148964.html
10.如何在Simulink中实现MIL的自动化测试?汽车测试技术自动化测试代码主要包括3个指令:xlsread、sim、xlswrite。 先用xlsread把测试用例的输入和期望输出读取进来;借助for循环,实现每一个测试用例的单独执行,这里会用到sim(‘XX.mdl’),把执行完的结果与期望的结果对比即可获得测试结果;最后把测试结果通过xlswrite写入excel。 https://www.auto-testing.net/news/show-107747.html
11.通过调试器如何在线测试S7SCL源代码?内容预览:描述: 调试器帮助对S7-SCL源代码进行一个简单调试,如果在编译S7-SCL 源代码过程没有错误发生,能够通过利用断点找出程序逻辑错误,并在运行时监视S7-SCL 代码的函数功能。过程如下面表格中描述: https://www.ad.siemens.com.cn/download/DocumentDetail_2719.html
12.静态代码分析测试静态分析如何保障软件质量和软件安全? 提高代码质量并降低缺陷成本 在开发过程的早期防止代码缺陷,以免它们在软件测试的后期阶段造成昂贵的成本。 满足行业功能安全标准 引入支持IS26262、DO-178C、IEC62304、IEC61508、EN50128等功能安全标准的静态分析解决方案。 https://www.parasoftchina.cn/solutions/static-code-analysis/