Chapter 11
测试代码
- 使用Python标准库中模块
unittest
提供的测试工具。
#name.py
def get_full_name(first, last, middle=''):
"""获取全名"""
if middle == '':
full_name = first.title() + ' ' + last.title()
else:
full_name = first.title() + ' ' + middle.title() + ' ' +last.title()
return full_name
#test.py
import unittest
from name import get_full_name
class NameTestCase(unittest.TestCase):
"""测试name.py"""
def test_first_last_name(self):
full_name = get_full_name('ming', 'xing')
self.assertEqual(full_name, 'Ming Xing')
def test_first_last_middle_name(self):
full_name = get_full_name('ming', 'xing', 'xiao')
self.assertEqual(full_name, 'Ming Xiao Xing')
unittest.main()
注意:
1.NameTestCase
是继承unittest.TestCase
的。
2.test_first_last_name
是一个单元测试
,许多单元测试
组成测试用例
。单元测试的名称,必须
以test_
开头,这样Python才能自动运行它们。另外,单元测试的名称是描述性的,必须高度概括测试内容,方便后续Debug。
3.self.assertEqual(full_name, 'Ming Xing')
这是unittest
中的一个断言方法
,断言方法用来判断结果与我们的预期是否一致。断言方法只能在继承unittest.TestCare
中的类中使用。
下面介绍六种常见的断言方法
assertEqual(a, b)
核实a == b
assertNotEqual(a, b)
核实a != b
assertTrue(x)
核实x == True
assertFalse(x)
核实x == False
assertIn(Item,List)
核实Item in List
assertNotIn(Item,List)
核实Item not in List
4. 如果程序正常运行,输出是这样的
.. ---------------------------------------------------------------------- Ran 2 tests in 0.000s
注意:
如果
test_first_last_middle_name
发生错误,另一个正确,输出是这样的
E. ====================================================================== ERROR: test_first_last_middle_name (__main__.NameTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/xxx/Desktop/CODE/test.py", line 10, in test_first_last_middle_name full_name = get_full_name('ming', 'xing', 'xiao') File "/Users/xxx/Desktop/CODE/name.py", line 6, in get_full_name full_name = first.title() + ' ' + middle.title() + ' ' +last.title TypeError: must be str, not builtin_function_or_method ---------------------------------------------------------------------- Ran 2 tests in 0.000s FAILED (errors=1)
关于上面两个输出结果:
E
表示一个单元测试引发错误,F
表示一个单元测试导致断言失败,.
表示一个单元测试通过。unittest.main()
让Python运行这个文件中的测试。
- 测试类
与上面的测试函数类似。只不过,在每一个单元测试中,我们都先要对类实例化,并设置其属性。为了减少工作量,可以在单元测试之前使用setUP()
,这样,我们只需创建一次实例,就可以在每个测试方法中使用它们。
#此处省略AnonymousSurvey类
import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
""" 对AnonymousSurvey类的测试"""
def setUp(self):
question = "What language did you first learn to speak?"
self.my_survey = AnonymousSurvey(question)
self.responses = ['English', 'Spanish', 'Mandarin']
def test_store_single_response(self):
self.my_survey.store_response(self.responses[0])
self.assertIn(self.responses[0], self.my_survey.responses)
def test_store_three_responses(self):
for response in self.responses:
self.my_survey.store_response(response)
for response in self.responses:
self.assertIn(response, self.my_survey.responses)
unittest.main()
-
注意:
不建议在for循环
中修改列表!
如果需要类似的情形,可以再建一个空列表,把新元素根据需要append()
进去。如果要删除列表元素,可以这样:for star in stars.sprites().copy(): stars.remove(star)
还有,下面的程序只有暂时效果,是
修改不了
列表的!list = ['ni', 'hao', 'liang', 'cong'] for item in list: item = 'hi' #实际上并不能修改!只有list[x] = y才能修改!