本篇博客主要讲述一下如何利用python中的unittest中的工具来测试代码。
1.普通测试函数
# edit.py文件内容
def user_names(first_name, family_name):
full_name = first_name + family_name
return full_name.title()
# test.py 文件内容
from edit import user_names
# 测试函数
print('请输入q退出~')
while True:
first_names1 = input('please input your first_name:')
if first_names1 == '':
print('信息不能为空')
break
else:
if first_names1 == 'q':
break
family_names1 = input('please input your family_name:')
if family_names1 == '':
print('信息不能为空')
break
else:
if family_names1 == 'q':
break
name = user_names(first_names1, family_names1)
print(name)
效果:
请输入q退出~
please input your first_name:da
please input your family_name:ming
Daming
please input your first_name:ling
please input your family_name:ling
Lingling
please input your first_name:q
对于普通的测试函数而言就是上述这种写法,一旦我们改变了edit.py文件里面的函数参数个数,我们这个测试函数也就要发生相应的变化,否则就要出错了。但是每改变一次函数,就要重新运行一次测试函数,并且测试函数也要发生相应的变化,简直太麻烦了。幸运的是python()提供了一种***自动测试函数输出***的高效方式,下面我们就一起学习一下。
2.unittest
我觉得这个单元测试是处女座,因为我感觉它在细节方面拿捏得死死的~,先看这段正确的代码:
# edit.py里面的内容
def user_names(first_name, family_name):
full_name = first_name + ' ' + family_name
return full_name.title()
# test.py文件里面的内容
# 导入依赖的模块以及函数
import unittest
from edit import user_names
# 建立专门的测试类,注意这里函数的命名要带有test字样,因为所有以test_打头的方法都自动运行
class NameTestCase(unittest.TestCase):
# 测试user_names()
def test_first_last_name(self):
# 是否能够正确处理像Da Ming这样的姓名?
formatted_name = user_names('da', 'ming')
# 在这里我们使用了unittest类最有用的功能之一:一个断言方法。断言方法可以用来核实我们得到的结果和期望的结果是否能够保持一致
self.assertEqual(formatted_name, 'Da Ming')
# 让python运行这个文件内的测试
unittest.main()
成功界面:
第一行的句点表明有一个测试通过了。接下来的一行指出了python运行了一个测试,消耗的时间不到0.001秒。最后的OK表示该测试用例中的所有单元测试都通过了。
下面我们来展示一下错误界面,我们对这行代码做个修改,故意将期望得到的结果和实际得到的结果设置的不一样:
self.assertEqual(formatted_name, 'DaMing')
第一个字母指明了单元测试出现了错误,并且接着指出了是哪一个单元测试出现了错误,通过一个标准的traceback,指出函数调用user_names(‘da’,‘ming’)有问题,因为得到的结果之间包含一个空格~,这么小的细节竟然拿捏得死死的,着实厉害,要是想修改错误的话,要么我们修改我们得到数据的格式,要么重新再添加一个测试函数。
最后一行表明单元测试中发生的错误个数
3.unittest总结
我们总结一下单元测试的套路:
(1)导入依赖的模块以及函数
import unittest
from edit import user_names
(2)建立专门的测试类,这个类是unittest.TestCase的子类,不要忘记继承奥
class NameTestCase(unittest.TestCase):
(3)建立测试函数,测试函数命名要以test打头才可以,才能确保自动运行
def test_first_last_name(self):
(4)调用被测试的函数,将得到的结果与期望结果进行比较
formatted_name = user_names('da', 'ming')
# 在这里我们使用了unittest类最有用的功能之一:一个断言方法。断言方法可以用来核实我们得到的结果和期望的结果是否能够保持一致
self.assertEqual(formatted_name, 'Da Ming')
(5)利用***unittest.main()***让python自动执行这个测试函数