文章标题

来源:互联网 发布:sql语言设计登陆验证码 编辑:程序博客网 时间:2024/06/15 13:08

Python unittest 简明教程

为什么要写unittest

unittest(单元测试)是保证代码质量的重要手段之一。在项目开发新的feature(特性)时,经常需要对代码进行局部修改,单元测试的意义在于保证修改后的局部代码能够被测试覆盖,检验修改后的代码是否满足新feature的需求。尤其是对于不喜欢使用IDE的python程序员来说,单元测试能够有效杜绝局部代码的语法错误和逻辑错误,为后续整个项目的集成功能测试减轻负担。

python 单元测试框架unittest介绍

python自带的unittest模块提供了很简单易用的单元测试工具。它支持测试自动化,多个测试之间共享setup和shutdown代码,把多个测试合并执行等功能。
为了方便理解和实现这些功能,unittest支持了三个层次的概念:

  • 测试用例

    一个测试用例就是一个最小的测试单元。它用来检查被测试的单元,譬如函数或成员函数,对于特定输入的反应。unittest提供了一个基类TestCase用来构造新的测试用例。

  • 固定设施

    固定设施就是多个相关测试用例所共享的公共准备工作,譬如创建一个路径,链接数据库,或者类对象初始化等等。

  • 测试用例集

    测试用例集是把多个测试合并到一个集合中,便于一次执行全部测试用例,并且生成聚合的测试报告。

    unittest.TestCase的基类提供setUp(),tearDown(),runTest()三个函数供子类覆盖实现,其中runTest()是执行测试的函数。

unittest框架使用

一个简单的unittest例子如下:

import unitestclass TestStringMethods(unittest.TestCase):    def setUp(self):        pass    def test_upper(self):        self.assertEqual('foo'.upper(), 'FOO')    def test_isupper(self):        self.assertTrue('FOO'.isupper())        self.assertTrue('Foo'.isupper())    def test_split(self):        s = 'hello world'        self.assertEqual(s.split(), ['hello', 'world'])    def tearDown(self):        passsuite = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)unittest.TextTestRunner(verbosity=2).run(suite)     

这个例子中测试用例TestStringMethods通过继承扩展unittest.TestCase来构造。

  • TestStringMethods子类定义了三个独立的名字以test开头的子测试用例,这种命名惯例通知测试runner哪些成员函数代表实际的测试用例。每个测试用例的关键在于调用assertEqual()或者assertTrue()函数来检查返回结果与期望值是否一致。
  • 可以覆盖unittest.TestCase的setUp()和tearDown()函数来定义为这三个测试用例所共享的固定设施,即在每次执行单个test_*前后分别执行。
  • unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)的含义在于根据前述命名惯例,从TestStringMethods中找到3个测试用例函数,分别构造了3个TestStringMethods的子类并且用3个test_*函数的内容覆盖各自的runTest()函数。因此suite里包含3个测试用例,最后被unittest.TextTestRunner执行。
0 0
原创粉丝点击