python在unittest.TestCase类中提供了很多断言的方法,前面说过,断言方法是用来检验该满足的条件是否得到满足,如果该条件确实得到了满足,那么程序行为的假设就得到了确认,可以确定其中没有错误。如果我们认为应该满足的条件实际上并不满足,python将引发异常。
使用这些方法可核实返回的值等于或不等于预期的值,返回的值为True或False,以及返回的值在列表中或不在列表中。
只能在继unittest.TestCase的类中使用这些方法,随后来看看如何在测试类时可使用其中之一。
类的测试与函数的测试相似,你所做的大部分工作是测试类中的方法的行为。不过还是存在一些不同之处
举例:
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}")
要创建该类的实例,只需要提供一个问题即可。
为了证明 AnonymousSurvey类能够正确工作,编写一个使用它的程序:
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 test_name_function import AnonymousSurvey
question="你会那些语言?"
my_survey=AnonymousSurvey(question)
my_survey.show_question()
print("Enter 'q' at any time to quit.\n")
while True:
response=input("lanuage:")
if response=='q':
break
my_survey.store_response(response)
print("\n谢谢你参与到本次调查之中!")
my_survey.show_results()
你会那些语言?
Enter 'q' at any time to quit.
lanuage:汉语
lanuage:法语
lanuage:西班牙语
lanuage:q
谢谢你参与到本次调查之中!
Survey results
-汉语
-法语
-西班牙语
下面编写一个测试,对 AnonymousSurvey类的行为的一个方面进行验证,如果用户面对调查问题只提供一个答案,这个答案被存储起来,现在我们通过使用assertIn()验证该答案确实在答案列表中。
import unittest#导入测试模块
from test_name_function import AnonymousSurvey#导入测试的类
class TestAnonymousSurvey(unittest.TestCase):#针对TestAnonymousSurvey的测试
def test_store_singnle_response(self):#测试的方法
question="你会哪些语言?"
my_survey=AnonymousSurvey(question)
my_survey.store_response('汉语')#传递单独的语言
self.assertIn('汉语',my_survey.responses)#核实汉语是否在list中
if __name__=='__main__':
unittest.main()
测试通过!
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
但如果想实现测试两个及以上的语言是否在其中呢?
具体操作如下:
import unittest#导入测试模块
from test_name_function import AnonymousSurvey#导入测试的类
class TestAnonymousSurvey(unittest.TestCase):#针对TestAnonymousSurvey的测试
def test_store_singnle_response(self):#测试单一语言是否被存储的方法
question="你会哪些语言?"
my_survey=AnonymousSurvey(question)
my_survey.store_response('汉语')#传递单独的语言
self.assertIn('汉语',my_survey.responses)#核实汉语是否在list中
def test_store_three_response(self):#测试多个语言是否被存储的方法
question="你会那些语言?"
my_survey=AnonymousSurvey(question)
responses=["英语","汉语","西班牙语"]
for response in responses:
my_survey.store_response(response)
for response in responses:
self.assertIn(response,my_survey.responses)
if __name__=='__main__':
unittest.main()
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
两个测试都通过了,但是该测试不够简洁,下面我们用unittest的另一种方法进行改进。
import unittest#导入测试模块
from test_name_function import AnonymousSurvey#导入测试的类
class TestAnonymousSurvey(unittest.TestCase):#针对TestAnonymousSurvey的测试
def setUp(self):#在unittest.TestCase类中包含的setUp方法,创建调查对象和答案列表
#使下面的测试方法不用自主进行对象的创建和答案的生成
question="你会哪些语言?"
self.my_survey=AnonymousSurvey(question)
self.responses=["英语","汉语","西班牙语"]
def test_store_singnle_response(self):#测试单一语言是否被存储的方法
self.my_survey.store_response(self.responses[0])
self.assertIn(self.responses[0],self.my_survey.responses)#核实self.responses[0]是否在list中
def test_store_three_response(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()
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
注意:运行测试用例时,每完成一个单元测试,Python都打印一个字符,测试通过时打印一个句点,测试引发错误时,打印一个E,而测试导致断言失败时,则打印一个F,这就是你运行测试用例时,在输出的第1行中看到的句点和字符数量各不相同的原因,如果测试用例包含很多单元测试,需要运行很长时间就可以观察这些结果来获悉有多少个测试通过了