在Python 标准库中的模块unittest提供了我们代码测试工具。单元测试用于核实函数的某个方面没有问题;测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求。全覆盖式测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式。对于大型项目,要实现全覆盖可能很难,所以在最初,只要针对代码的重要行为编写测试即可,等项目被广泛使用时再考虑全覆盖。
要为函数编写测试用例,可先导入模块unittest以及要测试的函数,再创建一个继承unittest.TestCase的类,并编写一系列方法对函数行为的不同方面进行测试。
如下,只包含了一个方法的测试用例,它检查函数get_formatted_name()在给定名和姓时,能否正确的工作:

import unittest


def get_formatted_name(first,last):
    """Generate a neatly formatted full name."""
    full_name = first + ' ' + last
    return full_name


class NamesTestCase(unittest.TestCase):
    """测试name_function"""
    def test_first_last_name(self):
        formatted_name = get_formatted_name('jason', 'james')
        self.assertEqual(formatted_name, 'Jason James')

unittest.main()

而测试结果为:

teststand测试python_python


在代码中,assertEqual是unittest类的功能之一:断言方法。这个方法用来核实得到的结果是否与期望的结果一致。在这里,我们知道get_formatted_name()应该返回这样的姓名,即小写的首字母的名和姓,且它们之间应该有一个空格。为检查是否确实如此,我们调用unittest得到方法assertEqual(),并向它传递formatted_name和 ‘Jason James’。代码self.assertEqual(formatted_name, 'Jason James')的意思是说,将formatted_name的值同字符串’Jason James’进行比较,如果它们相等,就GG, 如果不相等,就提示。

如果检查条件没错,测试通过了意味着函数的行为是对的,而测试未通过意味着编写的新代码有错。因此,测试未通过时,不要修改测试,而应修复导致测试不能通过的代码:检查刚对函数所做的修改,找出导致函数行为不符合预期的修改。

更多的核实方法:

方法

用途

assertEqual(a,b)

核实 a == b

assertNotEqual(a,b)

核实 a != b

assertTrue(x)

核实x为True

assertFalse(x)

核实x为False

assertIn(item,list)

核实item在list中

assertNotIn(item,list)

核实item不再list中