概述
- 单元测试只是对工程中的代码单元(通常细化到每个函数)进行正确性验证的工作;
- 对自己写的模块和类进行必要的单元测试,保证严谨正确,既是良好的开发习惯,也是一种规范;
- Python中的标准库中单元测试的模块是单元测试;
import unittest
单元测试
待测试的工具类
# 待测的工具类
class MathUtil:
# a,b相加
def sum(self, a, b):
return a + b
# a,b相减
def sub(self, a, b):
return a - b
# 判断a是否大于b
def gt(self, a, b):
return a > b
测试用例类,有以下几个要点:
- 测试用例类必须继承unittest.TestCase生成生成
- 具体的测试项函数必须以的的testXXX来命名
- 设置()方法会在每个测试项执行前调用,如有必要的初始化工作可以通过覆写该方法来实现
- TEARDOWN()方法会在每个测试项结束后调用,如有善后工作可以通过覆写该方法来实现
- 在具体的测试项函数中,使用的测试用例的assertXXX系列函数预言结果
- 如果程序执行结果与预测的一致,测该单项测试通过,否则不通过
# 测试用例类,必须继承于unittest.TestCase
class MathUtilTest(unittest.TestCase):
'''MathUtil工具类测试用例'''
# 测试项初始化方法
def setUp(self):
print("MathUtilTest setUp")
self.mu = MathUtil()
# 测试项结束时调用
def tearDown(self):
print("MathUtilTest tearDown")
'''
一系列的测试方法,都必须以testxxx命名
'''
# 测试MathUtil的sum方法
def testSum(self):
print("testSum...")
# 断言相等
self.assertEqual(self.mu.sum(3, 4), 7)
# 测试MathUtil的sub方法
def testSub(self):
print("testSub...")
# 断言相等
self.assertEqual(self.mu.sub(3, 4), -1, "testSub failed!!!")
# 测试MathUtil的gt方法
def testGt(self):
print("testOthers...")
# 断言真假
self.assertTrue(self.mu.gt(5, 4))
self.assertFalse(self.mu.gt(4, 5))
# 断言抛出异常
with self.assertRaises(TypeError):
self.mu.sum(1, "2")
执行单元测试
if __name__ == '__main__':
# 运行当前模块中的所有测试用例
unittest.main()
本次测试全部通过
修改MathUtil的总和()方法,使其逻辑错误,观察这一次的单元测试结果
class MathUtil:
def sum(self, a, b):
return a - b
结果下显示testSum这一单项测试失败:AssertionError:-1!= 7结果结果-1与预测值7不相符:
测试套件
- unittest.main()方法会执行当前模块中的所有测试用例类中的所有测试项,这显得不太灵活;
- unittest.TestSuite类是一个测试用例容器,可以按需添加测试用例于其中,使得单元测试既可以批量进行,又可以自主增减测试项目;
import unittest
from unittest.runner import TextTestRunner
# 定义一个测试套件
suite = unittest.TestSuite()
# 往测试套件里新增用例类下的所有测试项
suite.addTest(unittest.makeSuite(MathUtilTest))
suite.addTest(unittest.makeSuite(MyTest2))
suite.addTest(unittest.makeSuite(MyTest3))
# 执行测试套件
runner = TextTestRunner()
ret = runner.run(suite)
print(ret)
概述
- 单元测试只是对工程中的代码单元(通常细化到每个函数)进行正确性验证的工作;
- 对自己写的模块和类进行必要的单元测试,保证严谨正确,既是良好的开发习惯,也是一种规范;
- Python中的标准库中单元测试的模块是单元测试;
import unittest
单元测试
待测试的工具类
# 待测的工具类
class MathUtil:
# a,b相加
def sum(self, a, b):
return a + b
# a,b相减
def sub(self, a, b):
return a - b
# 判断a是否大于b
def gt(self, a, b):
return a > b
测试用例类,有以下几个要点:
- 测试用例类必须继承unittest.TestCase生成生成
- 具体的测试项函数必须以的的testXXX来命名
- 设置()方法会在每个测试项执行前调用,如有必要的初始化工作可以通过覆写该方法来实现
- TEARDOWN()方法会在每个测试项结束后调用,如有善后工作可以通过覆写该方法来实现
- 在具体的测试项函数中,使用的测试用例的assertXXX系列函数预言结果
- 如果程序执行结果与预测的一致,测该单项测试通过,否则不通过
# 测试用例类,必须继承于unittest.TestCase
class MathUtilTest(unittest.TestCase):
'''MathUtil工具类测试用例'''
# 测试项初始化方法
def setUp(self):
print("MathUtilTest setUp")
self.mu = MathUtil()
# 测试项结束时调用
def tearDown(self):
print("MathUtilTest tearDown")
'''
一系列的测试方法,都必须以testxxx命名
'''
# 测试MathUtil的sum方法
def testSum(self):
print("testSum...")
# 断言相等
self.assertEqual(self.mu.sum(3, 4), 7)
# 测试MathUtil的sub方法
def testSub(self):
print("testSub...")
# 断言相等
self.assertEqual(self.mu.sub(3, 4), -1, "testSub failed!!!")
# 测试MathUtil的gt方法
def testGt(self):
print("testOthers...")
# 断言真假
self.assertTrue(self.mu.gt(5, 4))
self.assertFalse(self.mu.gt(4, 5))
# 断言抛出异常
with self.assertRaises(TypeError):
self.mu.sum(1, "2")
执行单元测试
if __name__ == '__main__':
# 运行当前模块中的所有测试用例
unittest.main()
本次测试全部通过
修改MathUtil的总和()方法,使其逻辑错误,观察这一次的单元测试结果
class MathUtil:
def sum(self, a, b):
return a - b
结果下显示testSum这一单项测试失败:AssertionError:-1!= 7结果结果-1与预测值7不相符:
测试套件
- unittest.main()方法会执行当前模块中的所有测试用例类中的所有测试项,这显得不太灵活;
- unittest.TestSuite类是一个测试用例容器,可以按需添加测试用例于其中,使得单元测试既可以批量进行,又可以自主增减测试项目;
import unittest
from unittest.runner import TextTestRunner
# 定义一个测试套件
suite = unittest.TestSuite()
# 往测试套件里新增用例类下的所有测试项
suite.addTest(unittest.makeSuite(MathUtilTest))
suite.addTest(unittest.makeSuite(MyTest2))
suite.addTest(unittest.makeSuite(MyTest3))
# 执行测试套件
runner = TextTestRunner()
ret = runner.run(suite)
print(ret)