各种断言方法:
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类:
下面编写一个测试,对 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的另一种方法进行改进。
方法setUp():
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行中看到的句点和字符数量各不相同的原因,如果测试用例包含很多单元测试,需要运行很长时间就可以观察这些结果来获悉有多少个测试通过了