Python编程-第十一章-测试代码
测试函数
# name_funciton.py
def get_formatted_name(first, last):
"""Generates neat names. """
full_name = f"{first} {last}"
return full_name.title()
# main.py
from function.name_function import get_formatted_name
print("Enter 'q' at any time to quit.")
while True:
first = input("\nPlease give me a first name:")
if first == 'q':
break
last = input("Please give me a last name: ")
if last == 'q':
break
formatted_name = get_formatted_name(first, last)
print((f"\tNeatly formatted name: {formatted_name}."))
Warning
这种测试方式,许哟啊每次修改get_formatted_name() 函数,调试比较玛法。
单元测试和测试用例
import unittest
from function.name_function import get_formatted_name
class NameTestCase(unittest.TestCase):
"""test name_function.py."""
def test_first_last_name(self):
"""能够正确处理Janis Joplin这样的姓名?"""
formatted_name = get_formatted_name('janis', 'jopin')
""""""
self.assertEqual(formatted_name, 'Janis Jopin')
if __name__ == '__main__':
unittest.main()
❶ E
======================================================================
❷ ERROR: test_first_last_name (__main__.NamesTestCase)
----------------------------------------------------------------------
❸ Traceback (most recent call last):
File "test_name_function.py", line 8, in test_first_last_name
formatted_name = get_formatted_name('janis', 'joplin')
TypeError: get_formatted_name() missing 1 required positional argument: 'last'
----------------------------------------------------------------------
❹ Ran 1 test in 0.000s
❺ FAILED (errors=1)
测试未通过时怎么办
测试未通过时怎么办呢?如果你检查的条件没错,测试通过意味着函数的行为是对
的,而测试未通过意味着编写的新代码有错。因此,测试未通过时,不要修改测
试,而应修复导致测试不能通过的代码:检查刚刚对函数所做的修改,找出导致函
数行为不符合预期的修改。
def get_formatted_name(first, last, middle=''):
"""Generates neat names. """
if middle:
full_name = f"{first} {middle} {last}"
else:
full_name = f"{first} {last}"
return full_name.title()
添加新测试
import unittest
from function.name_function import get_formatted_name
class NameTestCase(unittest.TestCase):
"""test name_function.py."""
def test_first_last_name(self):
"""能够正确处理Janis Joplin这样的姓名?"""
formatted_name = get_formatted_name('janis', 'jopin')
""""""
self.assertEqual(formatted_name, 'Janis Jopin')
def test_frist_last_middle_name(self):
"""能够正确处理像Wolfgang Amadeus Mozart这样的姓名么?"""
formatted_name = get_formatted_name('wolfang', 'mozart', 'amadeus')
self.assertEqual(formatted_name,'Wolfang Amadeus Mozart')
if __name__ == '__main__':
unittest.main()
练习题
import unittest
from function.city_function import get_formatted_country_name
class NameTestCase(unittest.TestCase):
"""test name_function.py."""
def test_city_country(self):
"""能够正确处理Janis Joplin这样的姓名?"""
formatted_name = get_formatted_country_name('santiage', 'chile')
""""""
self.assertEqual(formatted_name, 'Santiage Chile')
if __name__ == '__main__':
unittest.main()
city_function.py
def get_formatted_country_name(city, country):
"""Generates neat names. """
city_name = f"{city} {country}"
return city_name.title()
import unittest
from function.city_function import get_formatted_country_name
class NameTestCase(unittest.TestCase):
"""test name_function.py."""
def test_city_country(self):
"""能够正确处理Janis Joplin这样的姓名?"""
formatted_name = get_formatted_country_name('santiage', 'chile')
""""""
self.assertEqual(formatted_name, 'Santiage, Chile.')
def test_city_population(self):
formatted_name = get_formatted_country_name('santiage', 'chile', '400')
self.assertEqual(formatted_name, 'Santiage, Chile - Population 400.')
if __name__ == '__main__':
unittest.main()
city_function.py
def get_formatted_country_name(city, country, population=''):
"""Generates neat names. """
if population:
city_name = f"{city}, {country} - population {population}."
else:
city_name = f"{city}, {country}."
return city_name.title()
测试类
断言方法
表 unittest 模块中的断言方法。
| 方法 | 用途 |
|---|---|
| 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 中 |
创建一个测试类
创建一个调查问卷的类
class_survey.py
class AnonymousSurvey:
def __init__(self, question):
"""Store a question, And prepare for storing the answer. """
self.question = question
self.responses = []
def show_question(self):
"""Display the questionnaire. """
print(self.question)
def store_response(self, new_response):
"""Store a single copy of the questionnaire. """
self.responses.append(new_response)
def show_results(self):
"""Displays all answers collected. """
print("Survey results:")
for response in self.responses:
print(f"- {response}")
创建一个程序,调用类。进行测试
language_survey.py
from _class.class_survey import AnonymousSurvey
# define a problem, and create a survey.
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
# Display the question and store the answer.
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)
# Display the survey results.
print("\nThank you to everyone who participated in the survey!")
my_survey.show_results()
测试AnonymousServey 类
只测试一个方法的类
import unittest
from _class.class_survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
"""A test for the Anonymous Survey class. """
def test_store_single_response(self):
"""Test individual answers are stored properly. """
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
my_survey.store_response('English')
self.assertIn('English', my_survey.responses)
if __name__ == '__main__':
unittest.main()
测试三个答案的类
import unittest
from _class.class_survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
"""A test for the Anonymous Survey class. """
def test_store_single_response(self):
"""Test individual answers are stored properly. """
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_response(self):
"""Test individual answers are stored properly. """
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()
方法setUp()
import unittest
from _class.class_survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
"""A test for the Anonymous Survey class. """
def setUp(self):
"""Create a survey object and a set of answers, Test method for use. """
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):
"""Test individual answers are stored properly. """
self.my_survey.store_response(self.responses[0])
self.assertIn(self.responses[0], self.my_survey.responses)
def test_store_three_response(self):
"""Test individual answers are stored properly. """
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()
- 方法setUp() 做了两件事情
- 创建一个调查对象,以及创建一个答案列表。
- 存储这两个变量名都包含前缀self ,所以可以在任何地方使用
练习题
from _class.Employee import Employee
import unittest
class TestEmloyee(unittest.TestCase):
def setUp(self) -> None:
self.my_employee = Employee('chen', 'cheng', '3000')
def test_give_default_raise(self):
self.my_employee.give_raise()
def test_give_custom_raise(self):
self.my_employee.give_raise('500')
if __name__ == '__main__':
unittest.main()
test_empployee.py
class Employee:
def __init__(self, first_name, last_name, salary):
self.first_name = first_name
self.last_name = last_name
self.salary = salary
def give_raise(self, salary ='5000'):
if salary != 5000:
self.salary += salary
else:
self.salary += 5000