unittest 几个重要概念
unittest是一个python版本的junit,junit是java中的单元测试框架,unittest实现了很多junit中的概念,比如我们非常熟悉的test case, test suite等,总之,原理都是相通的,只是用不同的语言表达出来。
unittest中的4个重要的概念:test fixture, test case, test suite, test runner,我觉得只有理解了这几个概念,才能真正的理解单元测试的基本原理,下面就主要围绕这几个概念来展开这篇文章。
1、Test Case
一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代 码(run),以及测试后环境的还原(tearDown)。单元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
2、Test Suite
一个功能的验证往往需要多个测试用例,可以把多个测试用例集合在一起执行的,就是TestSuite,TestSuit用来组装单个测试用例,可以通过addTest加载到TestCase到TestSuit中,从而返回一个TestSuit实例;而且TestSuite也可以嵌套TestSuite。
(TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例)
3、TestRunner
测试的执行也是单元测试中非常重要的一个概念,一般单元测试框架中都会提供非常丰富的执行策略和执行结果;在unittest中,通过TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。TestRunner可以使用图形界面、文本界面,或者返回一个特殊的值的方式来表示测试执行结果。
(这样整个流程就清楚了,首先是要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由 TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模 块中)
4、Test Fixture
对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖TestCase的setUp()和tearDown()方法 来实现。这个有什么用呢?比如说在这个测试用例中需要访问数据库,那么可以在setUp()中建立数据库连接以及进行一些初始化,在tearDown() 中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的TestCase留下一个干净的环境。关于fixture,还 有一个专门的库函数叫做fixtures,功能更加强大,详细介绍可以查阅相应的函数库资料。
下面以一个小例子来说明一下这几个用法
首先编写需要引入的方法test_Count.py
class Count: def __init__(self,a,b): self.a=int(a) self.b=int(b) def add(self): return self.a+self.b
定义一个Count类,有两个参数,定义一个方法,实现两个参数想加
接着写实现该方法测试脚本test_TestCount.py
rom test_Count import Count import unittest class TestCount(unittest.TestCase): def setUp(self): print("test start") def test_add(self): j=Count(5,6) self.assertEqual(j.add(),11) def test_add2(self): j=Count(12,11) self.assertEqual(j.add(),23) def tearDown(self): print("test end") if __name__=='__main__': suite=unittest.TestSuite() suite.addTest(TestCount("test_add2")) suite.addTest(TestCount("test_add")) runner=unittest.TextTestRunner() runner.run(suite)
首先引入Test_Count中的Count类,接着在引入unittest框架;然后重写TestCase里面的方法,包括setUp()、测试方法、tearDown();最后在在main下调用unittest框架的TestSuite()类来创建测试套件。通过他提供的addTest()方法来添加测试用例“test_add()”、“test_add()”,再调用unittest框架的TextTestRunner()类,通过它下面的runn()方法来运行suite所组装的测试用例
执行结果如下: