这回还是先把整个的代码附上吧
import unittest
from check_work import get_formatted_name
from check_work import AnonymousSurvey
class NameTestCase(unittest.TestCase):
def test_first_last_name(self):
formatted_name=get_formatted_name('janis','joplin')
#unittest中最有用的功能之断言方法,核实得到的结果与期望的结果是否一致,如果一致万事大吉,如果不一致,则需要告诉程序
self.assertEqual(formatted_name,'Janis-Joplin')
#再添加一个新的测试
def test_first_middle_last_name(self):
formatted_name=get_formatted_name('yang','hui','zhao')
self.assertEqual(formatted_name,'Yang-Zhao-Hui')
class TestAnonymousSurvey(unittest.TestCase):
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_response(self):
question='What language did you first learn to speak?'
my_survey=AnonymousSurvey(question)
responses=['English','Chinese','Spanish']
for response in responses:
my_survey.store_response(response)
for response in responses:
self.assertIn(response,my_survey.responses)
#这里的__name__是一个特殊变量,如果这个文件被作为主程序执行,那么__name__将会被设置为__main__,如果文件被作为测试框架导入的话,就不会调用后面的unittest.main()
if __name__=='__main__':
unittest.main()
要测试代码,肯定要有被测试的代码嘛:
#测试代码
#想要学习测试,就先要有测试的代码
def get_formatted_name(first,last,middle=''):
if middle:
full_name=f"{first}-{middle}-{last}"
else:
full_name=f"{first}-{last}"
return full_name.title()
#我们再写一个类的代码进行测试
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_result(self):
print("Survey results:")
for response in self.responses:
print(f"-{response}")
我们现在开始介绍一下(这部分我也是第一次学习,可能抓不住重点)。
测试函数
在学习测试函数之前,我们判断一个函数写的对不对的测试方法是调用运行,在输入参数之后看输出是否和我们预计的一致,但是这种方法相对繁琐,而Python提供了一种自动测试函数输出的方式,通过Python标准库中的unittest部分,实现代码的测试。
测试代码需要创建一个继承自unittest的类,在这个类中,我们调用要测试的函数,提供预期的结果,之后使用unittest中的断言方法,进行结果是否正确的判断,而最下面的__name__==__main__的判断,是判断是否以该文件作为一个主程序来执行,只有以主程序执行才会调用测试方法。原因在注释上也有一些声明。
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK
这个是运行后的结果截图,点表示运行成功,OK表示所有单元测试都通过了。
测试类
在具体说测试类的部分之前,我们需要先聊一下各种断言方法,这对之后的代码有很关键的作用。
assertEqual(a,b): 断言a和b是否相等,相等则测试用例通过。
assertNotEqual(a,b): 断言a和b是否相等,不相等则测试用例通过。
assertTrue(x): 断言x是否True,是True则测试用例通过。
assertFalse(x): 断言x是否False,是False则测试用例通过。
assertIn(a,b): 断言a是否在b中,在b中则测试用例通过。
assertNotIn(a,b): 断言a是否在b中,不在b中则测试用例通过。
目前的话,先了解这些就够了。
之后我们编写了一个待测试的类(见上面的代码)
测试类的方法和测试函数类似,我们首先导入unittest模块并继承,之后编写一个方法,调用待测试类生成一个实例,之后在按照预期对实例进行操作和预期结果的判断。
但是,在这里我们发现,如果我们有多个测试类的方法,那么每个方法都是需要调用待测试类生成实例的。这就会造成代码部分重复。所以我们可以使用setup方法生成实例,之后测试方法直接使用setup方法生成的实例即可。这样可以使代码功能区分更加明确。
这是修改后的测试类的模块。
class TestAnonymousSurvey(unittest.TestCase):
#创建一个调查对象和一组答案,供使用的测试方法使用
def setUp(self):
question='What language did you first learn to speak?'
self.my_survey=AnonymousSurvey(question)
self.responses=['English','Chinese','Spanish']
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_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)
这样一来,我们就已经完成了Python最基本语法和规则的学习,接下来我们会通过一些实际操作的项目来加深前面所学习的知识并且学习到新的技能。