单元测试

在计算机编程中,单元测试(Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作,所谓的单元是指一个函数,一个模块,一个类等。

在 Python 中,我们可以使用 模块编写单元测试。

下面以官方文档的例子进行介绍,该例子对字符串的一些方法进行测试:

在上面,我们定义了一个 TestStringMethods 类,它从 unittest.TestCase 继承。注意到,我们的方法名都是以 test 开头,表明该方法是测试方法,不以 test 开头的方法测试的时候不会被执行。

  • assertEqual 用于判断两个值是否相等;
  • assertTrue/assertFalse 用于判断表达式的值是 True 还是 False;
  • assertRaises 用于检测异常;

断言方法主要有三种类型:

  • 检测两个值的大小关系:相等,大于,小于等
  • 检查逻辑表达式的值:True/Flase
  • 检查异常

下面列举了部分常用的断言方法:

现在,让我们来运行上面的单元测试,将上面的代码保存为文件 mytest.py,通过 -m unittest 参数运行单元测试:

  1. $ python -m unittest mytest
  2. test_isupper (mytest.TestStringMethods) ... ok
  3. test_split (mytest.TestStringMethods) ... ok

执行结果:

  1. $ python -m unittest -v mytest
  2. test_split (mytest.TestStringMethods) ... ok
  3. test_upper (mytest.TestStringMethods) ... ok
  4. ----------------------------------------------------------------------
  5. Ran 3 tests in 0.000s
  6. OK

上面这种运行单元测试的方法是我们推荐的做法,当然,你也可以在代码的最后添加两行:

然后再直接运行:

  1. $ python mytest.py

setUp 和 tearDown

在某些情况下,我们需要在每个测试方法执行前和执行后做一些相同的操作,比如我们想在每个测试方法执行前连接数据库,执行后断开数据库连接,为了避免在每个测试方法中编写同样的代码,我们可以使用 setUp 和 tearDown 方法,比如:

看看执行结果:

  1. $ python -m unittest -v mytest
  2. tearDown, Bye!
  3. ok
  4. test_split (mytest.TestStringMethods) ... setUp, Hello
  5. tearDown, Bye!
  6. test_upper (mytest.TestStringMethods) ... setUp, Hello
  7. tearDown, Bye!
  8. ok
  9. ----------------------------------------------------------------------
  10. Ran 3 tests in 0.000s

小结

  • 通过从 unittest.TestCase 继承来编写测试类。
  • 使用断言方法判断程序运行的结果是否和预期相符。
  • setUp 在每个测试方法执行前被调用,tearDown 在每个测试方法执行后被调用。

参考资料