本文记录是自己这个小菜鸡Python学习笔记
《Python编程从入门到实践》第十章
#第11章 测试代码
#11.1 测试函数
'''
name_function.py
def get_formatted_name(first, last):
"""Generate a neatly formatted full name."""
full_name = first + ' ' + last
return full_name.title()
'''
'''
from 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("\tNeatly formatted name: " + formatted_name + '.')
'''
'''
Enter 'q' at any time to quit.
Please give me a first name: janis
Please give me a last name: joplin
Neatly formatted name: Janis Joplin.
Please give me a first name: bob
Please give me a last name: dylan
Neatly formatted name: Bob Dylan.
Please give me a first name: q
'''
#单元测试和测试用例
'''
Python标准库中的模块unittest提供了代码测试工具
'''
#可通过的测试
'''
要为函数编写测试用例,可先导入模块unittest以及要测试的函数,
再创建一个继承unittest.TestCase的类,
并编写一系列方法对函数行为的不同方面进行测试
'''
'''
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
"""测试name_function.py"""
def test_first_last_name(self):
"""能够正确地处理像Janis Joplin这样的姓名吗?"""
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
unittest.main()
'''
'''
我们创建了一个名为NamesTestCase的类,用于包含一系列针对get_formatted_name()的单元测试。
你可随便给这个类命名,但最好让它看起来与要测试的函数相关,并包含字样Test。
这个类必须继承unittest.TestCase类,这样Python才知道如何运行你编写的测试
NamesTestCase只包含一个方法,用于测试get_formatted_name()的一个方面。
我们将这个方法命名为test_first_last_name(),因为我们要核实的是只有名和姓的姓名能否被正确地格式化。
我们运行test_name_function.py时,所有以test_打头的方法都将自动运行。
在这个方法中,我们调用了要测试的函数,并存储了要测试的返回值
我们使用了unittest类最有用的功能之一:一个断言方法。
断言方法用来核实得到的结果是否与期望的结果一致。
在这里,我们知道get_formatted_name()应返回这样的姓名,
即名和姓的首字母为大写,且它们之间有一个空格,因此我们期望formatted_name的值为Janis Joplin。
为检查是否确实如此,我们调用unittest的方法assertEqual(),并向它传递formatted_ name和'Janis Joplin'。
代码行self.assertEqual(formatted_name, 'Janis Joplin')的意思是说:
“将formatted_name的值同字符串'Janis Joplin'进行比较,如果它们相等,就万事大吉,如果它
们不相等,跟我说一声!”
'''
'''
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
'''
#不能通过的测试
'''
import unittest
from name_function2 import get_formatted_name
class NamesTestCase(unittest.TestCase):
"""测试name_function.py"""
def test_first_last_name(self):
"""能够正确地处理像Janis Joplin这样的姓名吗?"""
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
unittest.main()
'''
#测试未通过时怎么办
'''
import unittest
from name_function3 import get_formatted_name
class NamesTestCase(unittest.TestCase):
"""测试name_function.py"""
def test_first_last_name(self):
"""能够正确地处理像Janis Joplin这样的姓名吗?"""
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
unittest.main()
'''
'''
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
'''
#添加新测试
'''
import unittest
from name_function3 import get_formatted_name
class NamesTestCase(unittest.TestCase):
"""测试name_function.py """
def test_first_last_name(self):
"""能够正确地处理像Janis Joplin这样的姓名吗?"""
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
def test_first_last_middle_name(self):
"""能够正确地处理像Wolfgang Amadeus Mozart这样的姓名吗?"""
formatted_name = get_formatted_name(
'wolfgang', 'mozart', 'amadeus')
self.assertEqual(formatted_name, 'Wolfgang Amadeus Mozart')
unittest.main()
'''
'''
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
'''
#11.2 测试类
#各种断言方法
'''
Python在unittest.TestCase类中提供了很多断言方法。
前面说过,断言方法检查你认为应该满足的条件是否确实满足。
如果该条件确实满足,你对程序行为的假设就得到了确认,你就可以确信其中没有错误。
如果你认为应该满足的条件实际上并不满足,Python将引发异常。
方 法 用 途
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中
'''
'''
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('- ' + response)
'''
'''
from survey import AnonymousSurvey
#定义一个问题,并创建一个表示调查的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()
'''
'''
what language did you first learn to speak?
Enter 'q' at any time to quit.
Language: English
Language: Spanish
Language: English
Language: Mandarin
Language: q
Thank you to everyone who participated in the survey!
Survey results:
- English
- Spanish
- English
- Mandarin
'''
#测试AnonymousSurvey类
'''
import unittest
from survey import AnonymousSurvey
class TestAnonmyousSurvey(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)
unittest.main()
'''
'''
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
'''
'''
import unittest
from survey import AnonymousSurvey
class TestAnonmyousSurvey(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)
unittest.main()
'''
'''
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
'''
#方法 setUp()
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()
'''
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
'''