本系列是对入门书籍《Python编程:从入门到实践》的笔记整理,属于初级内容。标题顺序采用书中标题。
本章主要学习如何使用Python标准库中的unittest模块对代码进行简单的测试。
1. 前言
作为初学者,并非必须为你尝试的所有项目编写测试;但参与工作量较大的项目时,你应对自己编写的函数和类的重要行为进行测试。这样你就能够更加确定自己所做的工作不会破坏项目的其他部分,你就能够随心所欲地改进即有代码。如果不小心破坏了原来的功能,你马上就会知道,从而能够轻松地修复问题。相比于等到Bug出现后再去改,在测试未通过时采取措施要容易得多。而且,如果你想要分享你的项目,有测试的代码更容易让人接受。
2. 测试函数
2.1 一个能通过的测试
以下是一个将用户输入的姓与名拼接的函数:
当然你也可以将if语句下面的代码单独放在一个文件中,并在该文件开头带入函数。
对的补充:
在Python中,模块就是对象,所有模块都有一个内置属性,当该模块被导入时,该模块的属性会被置为模块名,当直接运行该模块,或者说直接运行该文件时,该属性就会使用默认值,可以用一句经典的话总结这个用法:
语句下面的代码相当于对上面的函数的测试,不过这样的测试每次都需要我们自己输入数据,并自己根据结果判断代码是否工作正常,如果代码稍微多一点,稍微复杂一点,这样的测试方法将会很繁琐,所以,我们使用模块了测试代码。
这里先明确两个概念:
单元测试:用于核实函数在某个方面没有问题
测试用例:一组单元测试,这些单元测试一起核实函数在各种情况下的行为都符合要求。
也就是说,你可以将上述代码中的看做单元测试,而将看做测试用例。
一般测试文件单独放在一个文件夹中,也可以将测试都放在一个文件中。
为函数编写测试用例,可先导入模块和要测试的函数,再创建一个继承的类,并编写一系列方法对函数行为的不同方面进行测试。在测试用,我们使用断言(并不是只有这一个断言函数)来判断结果与期望是否相同。在测试类中的每一个测试方法都必须以开头,否则将不会被认定是一个单元测试。最后我们通过来运行这个文件中的所有测试。当测试通过时,结果中会先输出一个实心句点,输出几个句点表示通过了几个单元测试,然后输出单元测试数目,最后输出。
2.2 一个不能通过的测试
外国人的名字还有中间名,以上代码并未考虑这个情况。我们通过将上述代码改成含有中间名的版本来演示测试不通过的情况:
第一行输出了一个字母,指出缺少了参数。如果你检查的条件没错,测试通过了意味着函数的行为是对的,而测试未通过意味着你编写的新代码有错。因此,测试未通过时,不是去修改测试代码,而失去修改你编写的代码。
2.3 添加新测试
以下我们将上述的函数修改为能自动处理中间名的函数,并在测试文件中添加一个单元测试:
3. 测试类
前面讲的都是对函数的测试,这里我们开始对类的测试。在测试之前,先介绍几种常用的断言方法:
下面创建一个匿名调查类:
以下是对该类的测试代码:
这里的方法相当于普通函数的方法,用于初始化这个测试类,减少重复代码,比如,如果不用方法,那么变量在每个测试函数中都要声明一次,十分麻烦低效。你过测试类中包含了方法,Python将先运行它,再运行各个以开头的方法。
至此,Python的基础部分大致结束,后面将是项目部分,以后可能还会对基础部分进行补充。
领取专属 10元无门槛券
私享最新 技术干货