# -*- coding: utf-8 -*-
"""
Created on Wed Mar 11 13:33:17 2020
@author: 86159
"""
# use #%% to create cells;Run current cell(ctrl+enter)
#%%
#测试代码:模块unittest
#运行测试用例时,每完成一个单元测试,Python都打印一个字符:
#测试通过时打印一个句点
#测试引发错误时打印一个E
#测试导致断言失败时打印一个F
#%%
from name_function import get_formatted_name
print("Enter 'q' to quit.")
while True:
first=input("Please give me your first name:")
if first.lower()=='q':
break
last=input("Please give me your last name:")
if last.lower()=='q':
break
formatted_name=get_formatted_name(first,last)
print("Neatly formatted name:"+formatted_name+'.')
#%%
#针对单个函数的测试
#test_name_function.py
#在每次修改函数后进行测试,看修改后的代码是否依旧能符合要求
#导入模块unittest和要测试的函数get_formatted_name()
import unittest
from name_function import get_formatted_name
#可随便命名,最后看起来与要测试的函数相关,并包含字样Test,这个类必须继承unittest.TestCase类
class NamesTestCase(unittest.TestCase):#这个类,包含一系列针对get_formatted_name()的单元测试
'''测试name_function.py'''
#方法名必须以test_打头,这样才会在运行这个程序时自动运行
def test_first_last_name(self):#运行test_name_function.py时,所有以test_打头的方法都将自动运行
'''能否正确处理Janis Joplin这样的姓名'''
formatted_name=get_formatted_name('janis','joplin')
self.assertEqual(formatted_name,'Janis Joplin')#断言方法:用来合适得到的结果是否与期望的结果一致
def test_fml_name(self):
'''能否正确处理Amy Ladje Smith这样的姓名'''
formatted_name=get_formatted_name('amy','smith','ladje')
self.assertEqual(formatted_name,'Amy Ladje Smith')
unittest.main()
'''可通过的测试 输出如下'''
#. #句点表明有一个测试通过了
#----------------------------------------------------------------------
#Ran 1 test in 0.000s #指出python运行了一个测试,消耗的时间不到0.001秒
#
#OK #OK表明该测试用例中的所有单元测试都通过了
#上述输出表明,给定包含名和姓的姓名时,函数get_formatted_name()总是能正确的处理
'''不能通过的测试 输出如下'''
#E #指出测试用例中有一个单元测试导致了错误
#======================================================================
#ERROR: test_first_last_name (__main__.NamesTestCase) #ERROR指出发生错误的地方在哪里
#能否正确处理Janis Joplin这样的姓名
#----------------------------------------------------------------------
#Traceback (most recent call last): #指出具体的错误类型
# File "<ipython-input-4-6f1b61570d0f>", line 10, 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.016s #运行了一个单元测试
#
#FAILED (errors=1) #指出整个测试用例都未通过,因为运行该测试用例时发生了一个错误
#此时,不应修改测试,应修复导致测试不能通过的代码
'''测试带有middle name的用例'''
#把函数get_formatted_name()中的middle设置为可选的,这样第一个用例也会成功
#.. #两个成功用例
#----------------------------------------------------------------------
#Ran 2 tests in 0.000s
#
#OK
'''一个失败用例,一个成功用例'''
#把函数get_formatted_name()中的middle设置为普通的形参即可,这样第一个用例就会失败
#E. #第一个用例失败,第二个用例成功
#======================================================================
#ERROR: test_first_last_name (__main__.NamesTestCase)
#能否正确处理Janis Joplin这样的姓名
#----------------------------------------------------------------------
#Traceback (most recent call last):
# File "<ipython-input-7-893b1b474807>", line 10, in test_first_last_name
# formatted_name=get_formatted_name('janis','joplin')
#TypeError: get_formatted_name() missing 1 required positional argument: 'middle'
#
#----------------------------------------------------------------------
#Ran 2 tests in 0.000s
#
#FAILED (errors=1)
#%%
from survey import AnonymousSurvey as ASy
#定义一个问题,并创建一个表示调查的AnonymousSurvey对象
question="What language did you first learn to speak?"
my_survey=ASy(question)#创建一个AnonymousSurvey类实例
#显示问题并存储答案
my_survey.show_question()
print("Enter 'q' to quit.")
while True:
response=input("Language:")
if response.lower()=='q':
break
else:
my_survey.store_response(response)
#显示调查结果
my_survey.show_results()
#%%
#针对类的测试
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=['Englis','Chinese','Japanese']
for response in responses:
my_survey.store_response(response)
for response in responses:
self.assertIn(response,my_survey.responses)
unittest.main()
#%%
#方法setUp():只需创建这些对象一次,并在每个测试方法中使用它们
#前面的测试方法中都创建了一个AnonymousSurvey实例,并在每个方法中都创建了答案
#若在TestCase中包含了方法setUp(),Python将先运行它,再运行各个以test_打头的方法
#在编写的每个测试方法中都可以使用在方法setUp()中创建的对象
#测试自己编写的类时,方法setUp()让测试方法编写起来更容易:可在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(即存储在属性中),因此可在这个类的任何地方使用
self.my_survey=AnonymousSurvey(question)
self.responses=['Englis','Chinese','Japanese']#与self.my_survey.responses不是同一个东西
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:
my_survey.store_response(response)
for response in self.responses:
self.assertIn(response,my_survey.responses)
unittest.main()
name_function.py
def get_formatted_name(first,last,middle=""):#将中间名设置成可选的
'''组合成全名'''
if middle:
full_name=first+' '+middle+' '+last
else:
full_name=first+' '+last
return full_name.title()
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)