python - 代码测试
单元测试用于核实函数的某个方面没有问题。
测试用例是一组单元测试,核实函数在各种情形下都符合要求。
全覆盖的测试用例包含了一整套单元测试,涵盖了各种可能的函数使用方式。
1. 对函数进行测试
name_function.py
def get_formatted_name(first, last):
"""生成整洁的姓名"""
full_name = f"{first.title()} {last.title()}"
return full_name
test_name_function.py
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
"""测试get_formatted_name()函数"""
def test_first_last_name(self):
"""能够正确处理Tom Hanks这样的姓名吗?"""
formatted_name = get_formatted_name('tom', 'hanks')
self.assertEqual(formatted_name, 'Tom Hanks') # 断言
if __name__ == '__main__':
unittest.main()
2. 对类进行测试
2.1 各种断言方法
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中
2.2 待测试的类
survey.py
class AnonymousSurvey:
"""收集匿名调查问卷的答案。"""
def __init__(self, question):
"""存储一个问题,并为存储答案做准备。"""
self.question = question
self.responses = []
def show_question(self):
"""显示调查问卷"""
print(self.question)
def store_response(self, new_response):
"""存储单份调查答卷。"""
self.responses.append(new_response)
def show_results(self):
"""显示收集到的所有答卷"""
print("Survey results:")
for response in self.responses:
print(f"- {response}")
language_survey.py
from survey import AnonymousSurvey
# 定义一个问题,并创建一个调查。
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
# 显示问题并存储答案
my_survey.show_question()
print("Enter 'q' at any time to quit.\n")
while True:
response = input("Language: ")
if response == 'q':
break
my_survey.store_response(response)
# 显示调查结果
print("\nThank you to everyone who participated in the survey!")
my_survey.show_results()
2.3 测试代码
import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
"""针对AnonymousSurvey类的测试"""
def test_store_single_response(self):
"""测试单个答案会被妥善地存储"""
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
my_survey.store_response('English')
self.assertIn('English', my_survey.responses)
def test_store_three_responses(self):
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
responses = ['English', 'Spanish', 'Mandarin']
for response in responses:
my_survey.store_response(response)
for response in responses:
self.assertIn(response, my_survey.responses)
if __name__ == '__main__':
unittest.main()
2.3 测试代码优化
setUp()方法先运行,再运行test_打头的方法
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)
if __name__ == '__main__':
unittest.main()
运行测试用例时,每完成一个单元测试,python都打印一个字符:测试通过打印一个句点,测试引发错误打印一个E,测试导致断言失败打印一个F。

浙公网安备 33010602011771号