python如何使用unit test 模块

Python内部自带了一个单元测试的模块,pyUnit也就是我们说的:unittest

TestCase:所有测试用例的基本类,给一个测试方法的名字,就会返回一个测试用例实例;
 
TestSuit:组织测试用例的实例,支持测试用例的添加和删除,最终将传递给  testRunner进行测试执行;
 
TextTestRunner:进行测试用例执行的实例,其中Text的意思是以文本形式显示测试结果。测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息;
 
TestLoader:用来加载TestCase到TestSuite中的,其中有几个  loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例;

在采用PyUnit这一单元测试框架后,用于测试的代码做了相应的改动:

  • 用import语句引入unittest模块。
  • 让所有执行测试的类都继承于TestCase类,可以将TestCase看成是对特定类进行测试的方法的集合。
  • 在setUp()方法中进行测试前的初始化工作,并在tearDown()方法中执行测试后的清除工作,setUp()和tearDown()都是TestCase类中定义的方法。
  • 定义测试用例,名字以test开头。
    一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。
  • 提供名为suite()的全局方法,PyUnit在执行测试的过程调用suit()方法来确定有多少个测试用例需要被执行,可以将TestSuite看成是包含所有测试用例的一个容器。
  • 调用unittest.main()启动测试
  • 如果测试未通过,会输出相应的错误提示。如果测试全部通过则不显示任何东西,这时可以添加-v参数显示详细信息。

利用python进行测试时,测试用例的加载方式有2种:

  一种是通过unittest.main()来启动所需测试的测试模块;
  一种是添加到testsuite集合中再加载所有的被测试对象,而testsuit里存放的就是所需测试的用例


虽然看起来有点复杂,但PyUnit使得所有的Python程序员都可以使用同样的单元测试方法,测试过程不再是杂乱无章的了,而是在同一规范指导下进行的有序行为,这就是使用PyUnit这一自动单元测试框架所带来的最大好处。

好了,现在进入我们的学习重点,PyUnit模块的使用!

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

runner = unittest.TextTestRunner()
  runner.run(suite)

使用TestRunner来实施测试的例子如例7所示,

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

if __name__ == "__main__":
    unittest.main()

使用main()方法来实施测试的例子如例8所示:

8. main_runner.py
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 testSize(self):
        self.assertEqual(self.widget.getSize(), (40, 40))
    def testResize(self):
        self.widget.resize(100, 100)
        self.assertEqual(self.widget.getSize(), (100, 100))   
# 测试
if __name__ == "__main__":
    unittest.main()



你可能感兴趣的:(python如何使用unit test 模块)