单元测试的基本单位就是测试用例,也就是所谓的test case。case里面包含了执行代码以及结果正确性的校验方案。在unittest中,测试用例通过TestCase类实现。通过编写TestCase的子类实现我们自己的自定义测试用例
自定义测试类中,所有的测试方法需要使用test关键字开头
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue("FOO".isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = "hello world"
self.assertEqual(s.split(), ['hello', 'world'])
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
setUp()
如果我们需要给多个测试方法使用相同的前置操作,那我们就需要重写TestCase类的setUp()方法,将我们需要的前置操作代码移动到setUp()中。为了演示效果,我们在setUp函数中编写一个输出语句,然后在每一个case中也各自编写一个输入语句。我们可以看到很明显的效果,setUp()函数中的输出语句,在每一个case的输出语句前都出现了
import unittest
class TestStringMethods(unittest.TestCase):
def setUp(self):
print("这里是所有test的case会使用的前置操作")
def test_upper(self):
print("test_upper")
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
print("test_isupper")
self.assertTrue("FOO".isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
print('test_split')
s = "hello world"
self.assertEqual(s.split(), ['hello', 'world'])
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
case的运行顺序是按照测试名排序的结果决定的,比如我的第一个测试case是test_upper,但是反而确实最后一个执行的,因为是按照case名排序,u的顺序实在i和s的后面,所以test_upper最后执行
tearDown():
和setUp()方法类似的,TestCase提供了另一个方法tearDown()用来处理测试case运行完成之后的清扫工作
位置就是在代码的最后面
import unittest
class TestStringMethods(unittest.TestCase):
def setUp(self):
print("这里是所有test的case会使用的前置操作")
def test_1upper(self):
print("test_upper")
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
print("test_isupper")
self.assertTrue("FOO".isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
print('test_split')
s = "hello world"
self.assertEqual(s.split(), ['hello', 'world'])
with self.assertRaises(TypeError):
s.split(2)
def tearDown(self):
print("这里是test的case的清扫操作")
if __name__ == '__main__':
unittest.main()
执行结果如下
从以上的包含有setUp()和tearDown()方法的函数,我们可以看到,每个case在执行前都会调用一次setUp(),执行完成之后都会调用一次tearDown()
配置测试集 testSuite
使用上面代码的话就会有一个问题,每次都会将所有的测试方法都全部执行一遍,如果我们只想执行特定的测试方法的话,那我们就需要组件自己的测试集 testSuit。
测试集的使用需要使用TestSuit类,实例化测试集对象,完成用例的添加。测试集合testsuite的执行需要使用unittest提供的测试运行类来操作
def suite():
suite = unittest.TestSuite()
suite.addTest(TestStringMethods("test_split"))
suite.addTest(TestStringMethods('test_upper'))
return suite
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())