unittest
为什么要学习unittest
提供用例组织与执行提供丰富的比较方法
断言提供丰富的日志
有点类似与Junit,这是python语言自带的
实例1
计算类calculator.py
class Count:
def __init__(self,a,b):
self.a=a
self.b=b
def add(self):
return self.a+self.b
测试类test.py
from calculator import Count
import unittest
class TestCount(unittest.TestCase):
def setUp(self):
print('test start')
def test_add(self):
j=Count(2,3)
self.assertEqual(j.add(),5)
def tearDown(self):
print('test end')
if __name__=='__main__':
unittest.main()
解读:
- 单元测试类必须集成unittest.TestCase
- 运行单元测试的方法可以使用unittest.main()
- setUp、tearDown 是运行测试前、后的方法
- 测试方法名称前缀必须是test
实例2
from calculator import Count
import unittest
class TestCount(unittest.TestCase):
def setUp(self):
print('test start')
def test_add(self):
j=Count(2,3)
def t_add2(self):
j=Count(4,5)
self.assertEqual(j.add(),9)
def tearDown(self):
print('test end')
if __name__=='__main__':
# 构造测试套件
suite = unittest.TestSuite()
suite.addTest(TestCount("test_add"))
suite.addTest(TestCount("t_add2"))
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
解读:
- unittest.TestSuite() 是测试套件,可以往里面添加要测试的方法,方法名不是test开头的也可以添加进去
- unittest.TextTestRunner() 是第二种执行测试的方法runner.run(测试套件)
实例3
calculator.py
class Count:
def __init__(self, a, b):
self.a = a
self.b = b
def add(self):
return self.a+self.b
def sub(self):
return self.a-self.b
mytest.py
import unittest
class MyTest(unittest.TestCase):
def setUp(self):
print('test case start')
def tearDown(self):
print('test case end')
testadd.py
from calculator import Count
from mytest import MyTest
import unittest
class TestAdd(MyTest):
def test_add(self):
j = Count(2, 3)
self.assertEqual(j.add(), 5, 'result is not 5')
def test_add2(self):
j = Count(4, 5)
self.assertEqual(j.add(), 8, 'result is not 9')
if __name__ == '__main__':
unittest.main()
testsub.py
from calculator import Count
from mytest import MyTest
import unittest
class TestSub(MyTest):
def test_sub(self):
j = Count(2, 3)
self.assertEqual(j.sub(), -1)
def test_sub2(self):
j = Count(4, 5)
self.assertEqual(j.sub(), -1)
if __name__ == '__main__':
unittest.main()
runtest.py
import unittest
# 加载测试文件
from testadd import TestAdd
from testsub import TestSub
# 构造测试类
suite = unittest.TestSuite()
suite.addTest(TestAdd("test_add"))
suite.addTest(TestAdd("test_add2"))
suite.addTest(TestSub("test_sub"))
suite.addTest(TestSub("test_sub2"))
if __name__ == '__main__':
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
解读:
- 自定义MyTest 是测试类的父类,里面编写了 fixture 也就是 测试前和测试后要做的工作;
- 把测试add和sub的方法专门提取成各自文件,使目录更加清晰
- 将runtest独立成一个文件,方便管理要测试方法
实例4
在实例3的基础上修改runtest
import unittest
# 加载测试文件,不需要手动加载测试文件了
start_dir='./'
suite = unittest.defaultTestLoader.discover(start_dir,'test*.py',None)
if __name__=='__main__':
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
解读:
- discover(start_dir,pattern='test*.py',top_level_dir=None) 找到指定目录下所有测试模块,返回suite
补充:
- 用例的执行顺序 是按照add的顺序 如果使用discover 按照字母的排序
- 跳过测试和标记为失败不管是不是成功 @unittest.skip()

浙公网安备 33010602011771号