Python unittest测试框架详解

概述
unittest测试框架包括如下:

1.测试脚手架(test fixture)

测试准备前要做的工作和测试执行完后要做的工作.包括setUp()和tearDown().

2.测试案例(test case)

最小的测试单元.

3.测试套件(test suite)

测试案例的集合.

4.测试运行器(test runner)

测试执行的组件.

命令行接口

可以用命令行运行测试模块,测试类以及测试方法.

复制代码代码如下:

python -m unittest test_module1 test_module2
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method

可加-v打印详细信息
复制代码代码如下:

python -m unittest -v test_module

测试案例自动搜索

unittest支持简单的test discovery. 命令行传入discovery后,框架会自动在当前目录搜索要测试的案例并执行.搜索目录必须是包或者模块.基本使用如下:

复制代码代码如下:

cd project_directory 
python -m unittest discover

子选项如下: 
-v, –verbose 
输出信息的详细级别

-s, –start-directory directory 
开始搜索目录 (默认为当前目录)

-p, –pattern pattern 
匹配的文件名 (默认为test*.py)

-t, –top-level-directory directory 
搜索的顶层目录 (默认为start directory)

创建测试代码

1.方式一

创建子类继承unittest.TestCase,然后重写以下方法

复制代码代码如下:

class WidgetTestCase(unittest.TestCase):
    def setUp(self):
        pass
    def runTest(self):
        pass
    def tearDown(self):
        pass

运行

2.方式二

编写以test开头的方法

复制代码代码如下:

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

    def test_xx1(self)
    def test_xx2(self)
    ...
    def test_xxN(self)

    def tearDown(self):
        pass


构建测试套件

方式一

复制代码代码如下:

widgetTestSuite = unittest.TestSuite()
widgetTestSuite.addTest(WidgetTestCase('test_default_size'))
widgetTestSuite.addTest(WidgetTestCase('test_resize'))

方式二(推荐)

复制代码代码如下:

def suite():
    suite = unittest.TestSuite()
    suite.addTest(WidgetTestCase('test_default_size'))
    suite.addTest(WidgetTestCase('test_resize'))
    return suite

方式三(推荐)
复制代码代码如下:

def suite():
    tests = ['test_default_size', 'test_resize']
    return unittest.TestSuite(map(WidgetTestCase, tests))

其中还有几种方式不常用。

待测试的类(Widget.py)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Widget.py
# Python 2.7.6
  
class Widget:
   def __init__( self , size = ( 40 , 40 )):
     self .size = size
   def getSize( self ):
     return self .size
   def reSize( self ,width,height):
     if width < 0 or height < 0 :
       raise ValueError, 'illegal size'
     else :
       self .size = (width,height)
       return self .size
   def dispose( self ):
     pass

测试类(Auto.py)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# coding=utf8
# Auto.dy
# Python 2.7.6
  
from Widget import Widget #导入测试类模块Widget
import unittest      #导入unittest模块 
  
  
class WidgetTestCase(unittest.TestCase):
#让所有执行测试的类都继承于TestCase类,可以将TestCase看成是对特定类进行测试的方法的集合
  
   #在setUp()方法中进行测试前的初始化工作。
   def setUp( self ):  
     self .widget = Widget()
  
   #并在tearDown()方法中执行测试后的清除工作,setUp()和tearDown()都是TestCase类中定义的方法。
   def tearDown( self ):
     self .widget = None
  
   #测试Widget类中getSize方法
   def testgetSize( self ):
     print "Test GetSize"
     #对Widget类中getSize()方法的返回值和预期值进行比较,确保两者是相等的,
     #assertEqual()也是TestCase类中定义的方法。
     self .assertEqual( self .widget.getSize(), ( 40 , 40 ))
      
   #测试Widget类中reSize方法
   def testreSize( self ):
     print "Test Resize"
     #对Widget类中reSize()方法的返回值和预期值进行比较,确保两者是相等的。
     #assertEqual()也是TestCase类中定义的方法。
     self .assertEqual( self .widget.reSize( 50 , 100 ),( 50 , 100 ))
    
  
#提供名为suite()的全局方法,PyUnit在执行测试的过程调用suit()方法来确定有多少个测试用例需要被执行,
#可以将TestSuite看成是包含所有测试用例的一个容器。
def suite():
   suite = unittest.TestSuite()
   suite.addTest(WidgetTestCase( "testgetSize" )) #往此添加需要测试的方法testgetSize()
   suite.addTest(WidgetTestCase( "testreSize" )) #往此添加需要测试的方法testreSize()
   return suite 
  
if __name__ = = "__main__" :
   unittest.main(defaultTest = 'suite' ) #在主函数中调用全局方法.

测试结果:

?
1
2
3
4
5
6
7
8
D:\Python>python27 Auto.py
Test GetSize
.Test Resize
.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ran 2 tests in 0.004s
  
OK

总结:
1。第一步:先写好测试类
2。第二步:导入unittest模块及测试的类,运用setup()方法做测试前的准备工作,如建立数据库连接,运用teardown()方法做测试后的清除工作,如取消数据库的链接,再对类中的方法逐一做测试。
3。第三步: 写suite()的全局方法,将要测试的方法,一一加入。
测试结果,有几个测试用例就有几个. 最后显示OK,表示通过。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值