十一、代码测试
11.1 测试函数
学习测试之前,需要有测试的代码。下面编写一个简单的函数。
name_function.py
1 | def get_formatted_name(first, last): |
names.py
1 | from name_function import get_formatted_name |
- 单元测试和测试用例
Python
标准库中的模块unittest
提供了代码测试工具。单元测试用于核实函数的某个方面没有问题;测试用例是一组单元测试,这些单元测试一起核实函数在各种情况z下的行为都符合要求。
- 可通过的测试
创建测试用例的语法需要一段时间才能习惯,但测试用例创建以后,再添加针对函数的单元测试就很简单了。
为函数编写测试用例,可先导入模块unittest
以及要测试的函数,再创建一个继承 unittest.TestCase
的类,并编写一系列方法对函数行为的不同方面进行测试。
test_name_function.py
1 | import unittest |
运行:
首先,导入了unittest
模块和测试函数;创建一个NameTestCase的类,可以随便命名,需要继承unittest.TestCase
;编写函数测试,注意,在测试函数中,所有test_
打头的方法都会自动运行。
之后使用了一个断言方法,unittest
类的功能之一。断言方法用来核实得到的结果是否与期望的结果一致。
- 不能通过的测试
修改函数,让其可以出来中间名。先故意不做判断让其一般情况不能通过,查看结果。
1 | def get_formatted_name(first, middle, last): |
传入的值不变,查看输出:
其中,E
指出测试用例中有一个单元测试导致了错误。
- 测试未通过时怎么办
测试未通过,意味着编写的代码有错,因此需要修改导致测试不能通过的代码,而不是修改测试。
name_function.py
1 | def get_formatted_name(first, last, middle = ''): |
这样,根据不同的情况,有中间名和没有,函数都可以进行处理了,测试就自然可以通过了。
- 添加新测试
再添加一个测试,用来测试包含中间名的。这时就会发现继续添加函数测试就十分简单和方便了。
1 | import unittest |
11.2 测试类
- 各种断言方法
方法 | 用途 |
---|---|
assertEqual(a, b) |
核实 a == b |
assertNotEqual(a, b) |
核实 a != b |
assertTrue(x) |
核实 x 为 True |
assertFalse(x) |
核实x 为False |
assertIn(item, list) |
核实item 在lisst 中 |
assertNotIn(item, list) |
核实item 不在list 中 |
- 一个要测试的类
sruvey.py
1 | class AnonymousSurvey(): |
编写简单的使用程序
language_survey.py
1 | from survey import AnonymousSurvey |
- 测试
AnonymousSurvey
类
test_survey.py
1 | import unittest |
当用户提供三个答案时:
1 | import unittest |
当然,我们还可以继续提高效率。
- 方法
setUp()
unittest.TestCase
类包含方法setUp()
,让我们只需创建这些对象一次,并在每个测试方法中使用它们。如果在TestCast
类中包含了方法setUp()
,Python
会先运行它,然后再运行各个以test_
打头的方法。
1 | import unittest |
注意:运行测试用例时,每完成一个单元测试,Python
都打印一个字符:通过测试时打印一个句点(.
);测试引发错误时打印一个E
;测试导致断言失败打印一个F
。