Python 中 unittest(单元测试)的学习

python 中单元测试 unittest模块学习



unittest主要概念:

    1. 一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
    2.而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
    3.TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
    4.TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。

    PS:测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。


关键代码->>>源文件(widget.py)
 # /usr/bin/python
 # encoding:utf-8

 class Widget:
     def __init__(self, size=(40, 40)):
         self._size = size

     def get_size(self):
         return self._size

     def resize(self, width, height):
         if width < 0 or height < 0:
             raise ValueError, 'illegal size'
             self._size = (width, height)

if __name__ == '__main__':
    widget = Widget()
    print widget.get_size()

关键代码->>>测试文件(widgettest.py)

# /usr/bin/python
# encoding:utf-8

from widget import Widget
import unittest


class WidgetTestCase(unittest.TestCase):

# 对象的初始化工作可以在setUp()方法中完成
    def setUp(self):
        self.widget = Widget()

# 对象的资源的释放则可以在tearDown()方法中完成
    def tearDown(self):
        self.widget.dispose()
        self.widget = None

# 对应widget类中的get_size函数测试
    def test_size(self):
        self.assertEqual(self.widget.get_size(), (40, 40))

# 对应widget类中resize函数的测试
    def test_Resize(self):
        self.widget.resize(100, 100)
        self.assertEqual(self.widget.get_size(), (100, 100))

if __name__ == "__main__":
    unittest.main()
按照以上两个代码实例可以完成具体的python单元测试

测试用例集TestSuite

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

如:

def suite():  
    suite = unittest.TestSuite()  
    suite.addTest(WidgetTestCase("testSize"))  
    suite.addTest(WidgetTestCase("testResize"))  
    return suite 

or 直接定义一个TestSuite的子类,并在其初始化方法init中完成所有测试用例的添加:

class WidgetTestSuite(unittest.TestSuite)  
    def __init__(self):  
        unittest.TestSuite.__init__(self, map(WidgetTestCase, ("testSize", "testResize")))  

这样只需要在suite()方法中返回该类的一个实例就可以了:

def suite():  
    return WidgetTestSuite()

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

suite1 = mysuite1.TheTestSuite()
suite2 = mysuite2.TheTestSuite()
alltests = unittest.TestSuite((suite1, suite2))

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

# /usr/bin/python
# encoding: utf-8

from widget import Widget  
import unittest  

#执行测试的类  
class WidgetTestCase(unittest.TestCase):  
    def setUp(self):  
        self.widget = Widget()  

    def tearDown(self):  
        self.widget.dispose()  
        self.widget = None  

    def test_size(self):  
        self.assertEqual(self.widget.get_size(), (40, 40))  

    def test_resize(self):  
        self.widget.resize(100, 100)  
        self.assertEqual(self.widget.get_size(), (100, 100))  

#测试  
if __name__ == "__main__":  
    #构造测试集              
    suite = unittest.TestSuite()  
    suite.addTest(WidgetTestCase("test_size"))  
    suite.addTest(WidgetTestCase("test_resize"))  
    #执行测试  
    runner = unittest.TextTestRunner()  
    runner.run(suite)  

Ps:源代码和测试代码最好放在一起。

展开阅读全文

没有更多推荐了,返回首页