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

单元测试作为任何语言的开发者都应该是必要的,因为时隔数月后再回来调试自己的复杂程序时,其实也是很崩溃的事情。虽然会很快熟悉内容,但是修改和调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而单元测试可以帮助我们很快准确的定位到问题的位置,出现问题的模块和单元。所以这是一件很愉快的事情,因为我们知道其它修改或没有修改的地方仍然是正常工作的,而我们目前的唯一问题就是搞定眼前这个有点问题的“家伙”。所以工作会在轻松中开始,并且很快将会结束,因为你已经知道很多信息了。

单元测试自然是对程序中最小的可测试模块--函数来进行测试;因为单元测试的对象是函数,也就是说你得被测试对象一定要有输出结果,哪怕就是异常输出,也得有输出,以便单元测试模块能够捕获返回值,并且与预期值进行比较,从而得出测试通过与否。

单元测试的加载方式有2种:一种是通过unittest.main()来启动单元测试的测试模块;一种是添加到testsuite集合中再加载所有的被测试对象,而testsuit里存放的就是单元测试的用例,下面分别列出了2种方法的使用。

1.1 测试模块中的函数:

被测模块:

#!/usr/bin/env python

#encoding: utf-8

def sum( x, y):

return x+y

def sub( x, y):

return x-y

单元测试模块:

#!/usr/bin/env python

#encoding: utf-8

import unittest

import myclass

class mytest(unittest.TestCase):

##初始化工作

def setUp(self):

pass

#退出清理工作

def tearDown(self):

pass

#具体的测试用例,一定要以test开头

def testsum(self):

self.assertEqual(myclass.sum(1, 2), 2, 'test sum fail')

def testsub(self):

self.assertEqual(myclass.sub(2, 1), 1, 'test sub fail')

if __name__ =='__main__':

unittest.main()

测试结果:【F表示一个fail, F前的点表示一个通过,有E的话表示程序自身异常】

.F

======================================================================

FAIL: testsum (__main__.mytest)

----------------------------------------------------------------------

Traceback (most recent call last):

File "C:\Users\xiaowu\workspace\mypython\unitTest.py", line 19, in testsum

self.assertEqual(myclass.sum(1, 2), 2, 'test sum fail')

AssertionError: test sum fail

----------------------------------------------------------------------

Ran 2 tests in 0.001s

FAILED (failures=1)

1.2 测试模块类中的函数:

被测模块:

#!/usr/bin/env python

#encoding: utf-8

class myclass:

def __init__(self):

pass

def sum(self, x, y):

return x+y

def sub(self, x, y):

return x-y

单元测试模块:

#!/usr/bin/env python

#encoding: utf-8

import unittest

import myclass

class mytest(unittest.TestCase):

##初始化工作

def setUp(self):

self.tclass = myclass.myclass()

##实例化了被测试模块中的类

#退出清理工作

def tearDown(self):

pass

#具体的测试用例,一定要以test开头

def testsum(self):

self.assertEqual(self.tclass.sum(1, 2), 3)

if __name__ =='__main__':

unittest.main()

运行结果:

.

----------------------------------------------------------------------

Ran 1 test in 0.000s

OK

这种方式执行单个测试文件时使用-v参数可以获得更多的测试结果信息。如:mytest.py -v

2 加载测试套件

好吧,在运用测试套件进行单元测试之前,我想还是稍微研究一下unittest模块的内容有哪些,其大概的运行方式是什么样的。而后在给出根据各种情况如何制定单元测试套件。

首先,自然是查看unittest模块有哪些成员啦!

>>import unittest

>>dir(unittest)

['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult', 'Tes

tSuite', 'TextTestRunner', '_CmpToKey', '_TextTestResult', '_WritelnDecorator',

'__all__', '__author__', '__builtins__', '__doc__', '__email__', '__file__', '__

metaclass__', '__name__', '__package__', '__unittest', '__version__', '_makeLoad

er', '_strclass', 'defaultTestLoader', 'findTestCases', 'getTestCaseNames', 'mai

n', 'makeSuite', 'os', 'sys', 'time', 'traceback', 'types']

可以看到其自身的成员也不是很多,大概包括有:

['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult',

'TestSuite','TextTestRunner', '_CmpToKey', '_TextTestResult', '_WritelnDecorator',

'defaultTestLoader','findTestCases', 'getTestCaseNames', 'main', 'makeSuite']

好吧,我们大概看看具体都是干什么的

>>memblist = ['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult',\

'TestSuite','TextTestRunner', 'defaultTestLoader','findTestCases', 'getTestCaseNames', \

'main', 'makeSuite']

>>for memb in memblist:

.. cur = getattr(unittest, memb)

.. print help(cur)

'FunctionTestCase':函数测试用例,即给一个函数作为参数,返回一个testcase实例,可选参数有set-up,tear-down方法

'TestCase':所有测试用例的基本类,给一个测试方法的名字,返回一个测试用例实例

'TestLoader':测试用例加载器,其包括多个加载测试用例的方法。返回一个测试套件

loadTestsFromModule(self, module)--根据给定的模块实例来获取测试用例套件

loadTestsFromName(self, name, module=None)

--根据给定的字符串来获取测试用例套件,字符串可以是模块名,测试类名,测试类中的测试方法名,或者一个可调用的是实例对象

这个实例对象返回一个测试用例或一个测试套件

loadTestsFromNames(self, names, module=None) --和上面功能相同,只不过接受的是字符串列表

loadTestsFromTestCase(self, testCaseClass)--根据给定的测试类,获取其中的所有测试方法,并返回一个测试套件

'TestProgram':命令行进行单元测试的调用方法,作用是执行一个测试用例。其实unittest.main()方法执行的就是这个命令,

而这个类实例时默认加载当前执行的作为测试对象,

原型为 __init__(self, module='__main__', defaultTest=None, argv=None, testRunner=xx, testLoader=xx)

其中module='__main__'就是默认加载自身

'TestResult':测试用例的结果保存实例,通常有测试框架调用

'TestSuite':组织测试用例的实例,支持测试用例的添加和删除,最终将传递给testRunner进行测试执行

'TextTestRunner':进行测试用例执行的实例,其中Text的意思是以文本形式显示测试结果。显示测试名称,即完成的测试结果,其过同执行单元测试脚本时添加-v参数

'defaultTestLoader':其实就是TestLoader

'findTestCases', 'getTestCaseNames':这个2个就不用解释了

'main': 其实就是TestProgram

'makeSuite':通常是由单元测试框架调用的,用于生产testsuite对象的实例

至此,我们知道了。其实整个单元测试框架的逻辑出来了。分三步走:第一步testloader根据传入的参数获得相应的测试用例,即对应具体的测试方法,

然后makesuite在把所有的测试用例组装成testsuite,最后把testsiute传给testrunner进行执行。

而我们通常执行的unittest.main(),其实就是unittest.testprom方法,其执行的功能就是上面分析的三步,在第一步中其传入的参数是自身的模块__main__;

在第二步中把自身模块中的所有测试类中中的测试方法提取出来,并生成测试套件;最后再把测试套件传递给testrunner进行具体的测试。

最后给出一个完整的单元测试组织代码,把该代码放到单元测试用例文件的同一个目录后执行该脚本,即可执行所有的测试用例文件。

【测试用例文件必须为test开头,如:testxxx.py, 当然这个文件本身是一个单元测试的文件】

#!/usr/bin/env python

#encoding: utf-8

#该代码源自深入python

import unittest

import myclass

import re

import os

import sys

def testAllinCurrent():

path = os.path.abspath(os.path.dirname(sys.argv[0]))

files = os.listdir(path)

test = re.compile("test\.py{1}quot;, re.IGNORECASE)

files = filter(test.search, files)

filenameToModuleName = lambda f: os.path.splitext(f)[0]

moduleNames = map(filenameToModuleName, files)

modules = map(__import__, moduleNames)

load = unittest.defaultTestLoader.loadTestsFromModule

return unittest.TestSuite(map(load, modules))

if __name__ == "__main__":

unittest.main(defaultTest="regressionTest")

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

python语言案例教程 单元测试_python单元测试unittest实例详解相关推荐

  1. 以python程序调用的系统_python 系统调用的实例详解

    python 系统调用的实例详解 本文将通过两种方法对python 系统调用进行讲解,包括python使用CreateProcess函数运行其他程序和ctypes模块的实例, 一 python使用Cr ...

  2. python的模拟登录原理_Python模拟登陆实例详解

    本篇文章主要介绍了Python模拟登陆实现代码,这里整理了详细的代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 下面分享一个使用Python进行网站模拟登陆的小例子. 原理 使用Cookie技 ...

  3. python代码覆盖率测试_unittest+coverage单元测试代码覆盖操作实例详解_python

    这篇文章主要为大家详细介绍了unittest+coverage单元测试代码覆盖操作的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 基于上一篇文章,这篇文章是关于使用coverage来实现代码 ...

  4. python url解码_对python中url参数编码与解码的实例详解

    一.简介 在python中url,对于中文等非ascii码字符,需要进行参数的编码与解码. 二.关键代码 1.url编码 对字符串编码用urllib.parse包下的quote(string, saf ...

  5. python中label有什么用_对Python中TKinter模块中的Label组件实例详解

    Python2.7.4 OS-W7x86 1. 简介 Label用于在指定的窗口中显示文本和图像.最终呈现出的Label是由背景和前景叠加构成的内容. Label组件定义函数:Label(master ...

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

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

  7. python 类 实例_Python类的实例详解

    类(class)是一个用户自定义类型,开发者可以将其实例化以获得实例(instance),实例表示这种类型的对象.在Python中,类就是对象,开发者可以像对其他对象那样处理函数,可以在调用函数时传递 ...

  8. python处理excel实例编程_python读取Excel实例详解

    本文实例为大家分享了python读取Excel实例的具体代码,供大家参考,具体内容如下 1.操作步骤: (1)安装python官方Excel库-->xlrd (2)获取Excel文件位置并读取 ...

  9. python实现非对称加密算法_Python3非对称加密算法RSA实例详解

    本文实例讲述了Python3非对称加密算法RSA.分享给大家供大家参考,具体如下: python3 可以使用 Crypto.PublicKey.RSA 和 rsa 生成公钥.私钥. 其中 python ...

  10. 怎么创建python django项目_创建Django项目图文实例详解

    本文实例讲述了创建Django项目的方法.分享给大家供大家参考,具体如下: 创建Django项目 创建一个HelloDjango项目 GitHub地址:https://github.com/liang ...

最新文章

  1. 风口上的政府大数据 需要消除“大误区”
  2. HDU 2431 Counting Problem
  3. java mp3 暂停,Java MP3播放器 - 使用jLayer播放,暂停和搜索不能正常工作
  4. java实现插入排序 1
  5. 使用mmap实现大文件的复制:单进程与多进程情况
  6. ARM汇编编程基础之一 —— 寄存器
  7. 拉普拉斯算子属于卷积方法吗_三代图卷积网络理论
  8. 海康sdk java_java调用海康sdk案例
  9. C#替换方向性的 Unicode 控制字符,解决无法匹配iphone 通讯录复制的手机号码问题
  10. Python采集《雪中》弹幕做词云图可视化分析,看看它为何高开低走
  11. Jumpserver界面设置及界面功能
  12. java反射机制原理,为什么需要反射,反射的作用
  13. 布赖恩·克尼根位计数算法说明及简单使用
  14. 笔记本固态硬盘选型(总线、接口、协议、SATA、PCIe、AHCI、NVMe、M.2、NGFF)
  15. 基于.NET平台的MapX开发
  16. day27旅游线路查询线路详情
  17. 华为畅玩5 android6.0,华为荣耀畅玩5的报价以及具体评测【图文】
  18. C语言军旗思路,谁告诉我军旗最好的摆法?
  19. vue js 图像标注 --- canvas 实现
  20. 企业搭建小型直播间、中型直播间、大型直播间的介绍

热门文章

  1. 【洛谷 P2633】 Count on a tree(主席树,树上差分)
  2. [APIO2009]抢掠计划
  3. UGUI 与 Spine 的完美结合
  4. JAVA工具类-StrUtils
  5. 自定义 Web 服务器控件
  6. 让搜索显示中文的方法
  7. [Asp.net]Uploadify上传大文件,Http error 500 解决方案
  8. SIGIR2020 | 一种新颖的推荐系统重训练技巧
  9. 当个性化推荐遇上知识图谱.pdf(附下载链接)
  10. PU-Net: Point Cloud Upsampling Network