1 测试概述
编写函数或类时,还可为其编写测试。通过测试,可确定代码面对各种输入都能够按要求的那样工作。
在程序中添加新代码时,程序员也可以对其进行测试,确认它们不会破坏程序既有的行为。
Python模块unittest中的工具来测试代码。程序员将学习编写测试用例,核实一系列输入都将得到预期的输出。
2 单元测试和测试用例
Python标准库中的模块unittest提供了代码测试工具。单元测试用于核实函数的某个方面没有问题;测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求。
全覆盖式测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式。
必须继承unittest.TestCase类,这样Python才知道如何运行你编写的测试。
2.1 断言方法
unittest类最有用的功能之一:一个断言方法。断言方法用来核实得到的结果是否与期望的结果一致。
断言方法检查程序员认为应该满足的条件是否确实满足。如果该条件确实满足,那么程序员对程序行为的假设就得到了确认,因此程序员就可以确信其中没有错误。如果程序员认为应该满足的条件实际上并不满足,那么Python将引发异常。
使用这些方法可核实返回的值等于或不等于预期的值、返回的值为True或False、返回的值在列表中或不在列表中。
2.2 测试未通过
检查的条件没错,测试通过了意味着函数的行为是对的,而测试未通过意味着程序员编写的新代码有错。因此,测试未通过时,不要修改测试,而应修复导致测试不能通过的代码:检查刚对函数所做的修改,找出导致函数行为不符合预期的修改。
3 测试类
- 运行测试用例时,每完成一个单元测试,Python都打印一个字符:测试通过时打印一个句点;测试引发错误时打印一个E;
- 测试导致断言失败时打印一个F。这就是程序员运行测试用例时,在输出的第一行中看到的句点和字符数量各不相同的原因。
- 如果测试用例包含很多单元测试,需要运行很长时间,就可通过观察这些结果来获悉有多少个测试通过了。
动手试一试
11-1 城市和国家:
city_functions.py
def city(city_name, county_name):
message = city_name + " " + county_name
return message.title()
test_cities.py
import unittest
from city_functions import city
class CityCountryNameTest(unittest.TestCase):
def test_city_county(self):
name = city('santiago', 'chile')
self.assertEqual(name, 'Santiago Chile')
test = CityCountryNameTest()
test.test_city_county()