本文实例讲述了python单元测试。分享给大家供大家参考,具体如下:

在python中进行单元测试需要用到自动单元测试框架pyunit,python2.1及其以后的版本都将pyunit作为一个标准模块(即python的unittest模块),如果你很out,那么你需要从pyunit网站下载源码安装后才能使用。

一、python单元测试范例

测试最基本的原理是比较预期结果是否与实际执行结果相同,如果相同则测试成功,否则测试失败。为了更好地理解自动测试框架pyunit,下面会以对widget类进行测试为例说明之:

二、测试用例testcase

软件测试中最基本的组成单元式测试用例(test case),pyunit使用testcase类来表示测试用例,并要求所有用于执行测试的类都必须从该类继承。testcase子类实现的测试代码应该是自包含的(self contained),即测试用例既可以单独运行,也可以和其它测试用例构成集合共同运行。testcase类中常用的函数或方法有:

setup:进行测试前的初始化工作。

teardown:执行测试后的清除工作。

failedinfo:表示不成立打印信息faliedinfo,为可选参数。

self.assertequal(value1, value2, failedinfo):会无条件的导致测试失败,不推荐使用。

self.asserttrue(, failedinfo):断言value1 == value2。

self.assertfalse(, failedinfo):断言value为真。

self.assertraises(valueerror, self.widget.resize, -1, -1):断言肯定发生异常,如果没发生异常,则为测试失败。参数1为异常,参数2为抛出异常的调用对象,其余参数为传递给可调用对象的参数。

testcase在pyunit测试框架中被视为测试单元的运行实体,python程序员可以通过它派生自定义的测试过程与方法(测试单元),利用command和composite设计模式,多个testcase还可以组合成测试用例集合。pyunit测试框架在运行一个测试用例时,testcase子类定义的setup()、runtest()和teardown()方法被依次执行,最简单的测试用例只需要覆盖runtest()方法来执行特定的测试代码就可以了。

1、静态方法

一个测试用例只对软件模块中一个方法进行测试,采用覆盖runtest()方法来构造测试用例,这在pyunit中称之为静态方法,举例说明如下:

如果采用静态方法,python程序员就不得不为每个要测试的方法编写一个测试类,该类通过覆盖runtest()方法来执行测试,并在每个测试类中生成一个待测试的对象,这样会非常繁琐与笨拙。

2、动态方法

鉴于静态方法的缺陷,pyunit提供了另一种高帅富的解决方法,即动态方法,只编写一个测试类来完成对整个软件模块的测试,这样对象的初始化工作可以在setup()方法中完成,而资源的释放则可以在teardown()方法中完成,举例说明如下:

动态方法不再覆盖runtest()方法,而是为测试类编写多个测试方法,按照惯例这些方法通常以test开头但这不是必须的,在创建testcase子类的实例时必须给出测试方法的名称来为pyunit测试框架指明运行该测试用例时应该调用测试类中的哪些方法,这通常会结合测试用例集testsuite一起使用。

三、测试用例集testsuite

完整的单元测试很少只执行一个测试用例,开发人员通常需要编写多个测试用例才能对某一软件功能进行比较完成的测试,这些相关的测试用例称为一个测试用例集,在pyunit中是用testsuite类来表示的。pyuinit测试框架允许python程序员在单元测试代码中定义一个名为suite()的全局函数,并将其作为整个单元测试的入口,pyunit通过调用它来完成整个测试过程:

在pyunit测试框架中,testsuite类可以看成是testcase类的一个容器,用来对多个测试用例进行组织,这样多个测试用例可以自动在一次测试中全部完成。事实上,testsuite除了可以包含testcase外,也可以包含testsuite,从而可以构成一个更庞大的测试用例集:

四、实施测试testrunner

编写测试用例(testcase)并将它们组织成测试用例集(testsuite)的最终目的只有一个:实施测试并获得最终结果。pyunit使用testrunner类作为测试用例的基本执行环境,来驱动整个单元测试过程。但是python开发人员在进行单元测试时一般不直接使用testrunner类,而是使用其子类texttestrunner来完成测试,并将测试结果以文本方式显示出来。举例说明如下:

使用如下命令执行该单元测试:

默认情况下,texttestrunner将结果输出到sys.stdout/sys.stderr上,但是如果在创建texttestrunner类实例时将一个文件对象传递给了构造函数,则输出结果将被重定向到该文件中。

五、大道至简main()

pyunit模块中定义了一个名为main的全局方法,使用它可以很方便地将一个单元测试模块变成可以直接运行的测试脚本,main()方法使用testloader类来搜索所有包含在该模块中的测试方法,并自动执行它们。如果python程序员能够按照约定(以test开头)来命令所有的测试方法,那么只需要在测试模块的最后加入如下几行代码即可:

下面是利用main()方法来进行测试的完整例子:

使用如下命令执行上面的单元测试:

如上这样将执行widgettestcase中的所有测试方法,但是如果只想执行testsize()方法,则可以如下这般:

如果在单元测试脚本中定义了testsuite,还可以指定要运行的测试集,使用-h参数可以查看运行该脚本所有可能用到的参数:

需要注意的是:pyunit的testcase中如果有多个test_xxx,则默认按照xxx的字母顺序执行测试用例函数,如果test_xxx之间有依赖关系的话就会出错,解决方法有二:1、解耦;2、编写xxx函数时人为地按字母顺序。

当然,如果你安装了python 2.7.2及以上版本,你还可以利用discover函数来自动发现并执行测试用例:

更多关于python单元测试的资料可以参看这里,还有这里。

希望本文所述对大家python程序设计有所帮助。

原文链接:https://blog.csdn.net/rhx_qiuzhi/article/details/80151666

python简单单元测试示范卷,Python单元测试实例详解相关推荐

  1. python装饰器函数-Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...

  2. python随机生成二维列表_对python产生随机的二维数组实例详解

    对python产生随机的二维数组实例详解 最近找遍了python的各个函数发现无法直接生成随机的二维数组,其中包括random()相关的各种方法,都没有得到想要的结果.最后在一篇博客中受到启发,通过列 ...

  3. python判断是否回文_对python判断是否回文数的实例详解

    设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 上面的解释就是说回文数和逆 ...

  4. python当型循环_对python while循环和双重循环的实例详解

    废话不多说,直接上代码吧! #python中,while语句用于循环执行程序,即在某个条件下,循环执行某段程序,以处理需要重复处理的相同任务. #while是"当型"循环结构. i ...

  5. python画二维散点图-基于python 二维数组及画图的实例详解

    1.二维数组取值 注:不管是二维数组,还是一维数组,数组里的数据类型要一模一样,即若是数值型,全为数值型 #二维数组 import numpy as np list1=[[1.73,1.68,1.71 ...

  6. python中if语句的实例_对python中if语句的真假判断实例详解

    说明 在python中,if作为条件语句,当if后面的条件参数为真时,则执行后面的语句块,反之跳过,为了深入理解if语句,我们需要知道if语句的真假判断方式. 示例 在python交互器中,经过测试发 ...

  7. Python爬虫包 BeautifulSoup 递归抓取实例详解

    Python爬虫包 BeautifulSoup 递归抓取实例详解 概要: 爬虫的主要目的就是为了沿着网络抓取需要的内容.它们的本质是一种递归的过程.它们首先需要获得网页的内容,然后分析页面内容并找到另 ...

  8. Python中Print()函数的用法___实例详解(二)(全,例多)

    Python中Print()函数的用法___实例详解(二)(全,例多) 目录 十一.Print()小例子 十二.Print()中文输入显示乱码问题 十三.Print()写入文件 十四.print()在 ...

  9. python画二维数组散点图_基于python二维数组及画图的实例详解

    基于python二维数组及画图的实例详解 下面小编就为大家分享一篇基于python 二维数组及画图的实例详解,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 1.二维数组取值 注:不管 ...

  10. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

最新文章

  1. GAN的理解与TF的实现
  2. oracle imp 工具可能出现的问题
  3. 3DSlicer22:Module-ExtensionWizard Build Install
  4. LuckyDraw bot有幸被提名为微软2019的People's Choice app
  5. wcf获取MySQL中午乱码,如何启用WCF日志记录,以便它写入数据库?
  6. 刚来公司时我却做了一件最傻的事
  7. Java语言基础41-44--泛型与集合
  8. f-admin——基于Laravel框架开发的基础权限后台系统
  9. 时刻牢记“我是谁、为了谁、依靠谁” 始终践行党的群众观点和群众路线
  10. Linux kernel中 __bitmap_weight函数的理解
  11. STM32实现水下四旋翼(三)通信任务——遥控器SBUS通信
  12. 473. 火柴拼正方形
  13. vue 图表三维立体3D散点图
  14. 微信域名检测API接口实现方法及原理
  15. 奔波霸儿大战邮箱服务器
  16. linux串口配置驱动程序,Linux下安装PCI转串口卡及USB转串口器的驱动方法
  17. matplotlib的默认字体_matplotlib中中文字体配置
  18. “EasyUEFI只能在基于(U)EFI启动的Windows操作系统上安装”解决方案
  19. 锁相环的组成和工作原理
  20. Java实现简单的个人网络嗅探器

热门文章

  1. tensorflow elu函数应用
  2. hadoop【大象】慕课笔记
  3. 江苏省委党校在云创举办实践培训会议
  4. 社交通讯产品-app榜单第三:探探
  5. sap workload
  6. JavaScript 解构以及ECMA6
  7. 艾美捷人免疫球蛋白IgG4 ELISA试剂盒样品收集、处理及保存方法
  8. windows平台下的mysql启动等基本操作
  9. 计算机毕业论文-ASP.NET的网站新闻管理系统设计与实现
  10. Java Map.forEach 用法示例