一、单元测试的含义
unittest单元测试框架的设计灵感来源于Junit(Java语言的单元测试框架),它与其他语言的单元测试框架风格相类似,支持自动化测试、为测试共享setUp和shutDown、它可以在将测试用例聚合到一起形成一个集合一起执行的同时在测试报告中展示独立的测试结果。
为了达到此目的,unittest支持几个重要的面向对象式的概念:
1、test fixture
一个test fixture所做的事情是执行单个或多个测试用例时的准备工作和执行结束后的一些相关清理工作,这包括:创建临时或代理数据库、目录或开始服务器进程。
2、test case
一个test case 是一个独立的测试单元,针对于一组特定的输入得到的特殊相应的验证,通过继承unittest提供的基类TestCase, 然后可以创建新的测试用例
3、test suite
一个test suite 是一组测试用例的集合,也可以是一组test suite的集合,也可以两者混合的集合,test suite就是用来聚合你想要一起执行的测试用例的
4、test runner
一个test runner 是一个协调测试执行并向用户提供执行结果的组建,它可以使用图形界面、文本界面或返回一个特殊值标识测试执行的结果
二、实例代码
下面我们看Python官方给的一个简单的小例子,来测试三个字符串
import unittest class TestStringMethods(unittest.TestCase): # 测试类继承了unittest.TestCase类,因此在该类里可以创建新的测试用例 def test_upper(self): self.assertEqual('foo'.upper(), 'FOO') # ‘foo’是一个字符串,upper()方法会将这个字符串转成大写,assertEqual是unittest提供的一个断言方法,用来比较逗号前后两个值是否相等 def test_isupper(self): self.assertTrue('FOO'.isupper()) # assertTrue也是unittest提供的断言方法,用来判断括号内的内容是真是假,如果是真则断言成功,否则为失败,'FOO'是个字符串并且是大写,调用isupper()方法,返回结果 self.assertFalse('Foo'.isupper()) # assertFalse则正好相反,如果括号内返回为假则断言成功,否则为失败 def test_split(self): s = 'hello world' self.assertEqual(s.split(), ['hello', 'world']) # check that s.split fails when the separator is not a string with self.assertRaises(TypeError): s.split(2) if __name__ == '__main__': unittest.main()
代码解析:
在第三个用例里,定义了一个字符串,s='hello world', 然后进行了断言,断言的条件里调用了一个split()方法,实际上初学者看到这会比较懵,s.split()到底返回的是什么,它是否等于逗号后边['hello', 'world']?
学这个东西就是要多试试,那么接下来我们进行一个尝试
启动命令行CMD,进入python环境
那么如果我们print(s.split())呢,结果应该是['hello', 'world'], 到此我们就得到了答案,第三条用例里的断言self.assertEqual(s.split(), ['hello', 'world'])是成功,继续向split()对字符串'hello world'做了什么?
最后的unittest.main(),有了它我们就有了一个简单的方式执行这个脚本,unittest.main()提供了命令行界面运行脚本的方式
如果我们执行python testingunit.py -v 又是什么结果?