1、单元测试的意义
- 作用 用来对一个函数、一个类或者一个模块来进行正确性检测的工具
- 结果
- 单元测试通过,说明我们测试的这个函数能够正常工作
- 单元测试不通过,要么有bug,要么测试条件输入不正确
- 意义
- 假设对函数的代码进行了修改,只需要在跑一次单元测试,如果通过,说明此时的修改不会对函数原功能造成影响。如果不通过,说明此次的修改与原功能不一致,要么修改代码,要么修改测试
- 确保一个程序模块的行为符合设计测试的用例,在将来修改的时候可以极大的保证该模块依然正确
2、单元测试之函数
calculater.py
代码语言:javascript复制def mySum(x, y):
ret = x y
return ret
def mySub(x, y):
a = 0
ret = x - y
return ret
创建测试文件test.py
代码语言:javascript复制#测试模块
import unittest
from calculater import mySum, mySub
#测试类
class Test(unittest.TestCase):
# 每个测试开始之前调用
def setUp(self):
print("开始测试……")
# 每个测试结束之后调用
def tearDown(self):
print("结束测试……")
# 测试函数名:tset__待测试函数名
# 注意:其实也可以不是待测试函数名
# 本质:只要是以test__开头的函数就都会被执行
def test_mySum(self):
self.assertEqual(mySum(1,1), 2)
def test__mySub(self):
self.assertEqual(mySub(1, 1), 0)
if __name__ == "__main__":
unittest.main()
main.py
代码语言:javascript复制from calculater import mySum, mySub
if __name__ == "__main__":
ret1 = mySum(1,2)
if ret1 == 3:
print("ret1 = %d"%ret1)
else:
print("我不想看ret1")
print("-------------")
ret2 = mySum(1,2)
# 认为逻辑是正确的
if ret2 == 4:
print("ret2 = %d" % ret2)
else:
print("我不想看ret2")
3、单元测试之类
myDict.py
代码语言:javascript复制class MyDict(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __setattr__(self, key, value):
self[key] = value
def __getattr__(self, item):
try:
return self[item]
except KeyError as e:
raise AttributeError("dict not has the key")
# def run(self):
# print("------------")
创建测试文件test.py
代码语言:javascript复制import unittest
from myDict import MyDict
# 定义测试类,一个测试类只能测试一个类
# 类名:Test待测试的类名
class TestMyDict(unittest.TestCase):
# 每个测试开始之前调用
def setUp(self):
print("开始测试……")
# 每个测试结束之后调用
def tearDown(self):
print("结束测试……")
# 实例化阶段
def test__init(self):
d = MyDict(a=1)
#断言
self.assertEqual(d.a, 1)
self.assertTrue(isinstance(d, dict))
#测试设置值
def test_key(self):
d = MyDict()
d["key"] = 1
self.assertTrue("key" in d)
self.assertEqual(d["key"],1)
def test_attr(self):
d = MyDict()
d.key = 1
self.assertTrue("key" in d)
self.assertEqual(d.key, 1)
#判断
def test_keyerror(self):
d = MyDict()
#通过d["key"]访问不存在的属性抛出KeyError异常
with self.assertRaises(KeyError):
value = d["key"]
def test_attrerror(self):
d = MyDict()
# 通过d.key访问不存在的属性抛出AttributeError异常
with self.assertRaises(AttributeError):
value = d.key
# def test__run(self):
# d = MyDict()
# d.run()
# self.assertEqual(d.run(), 1)
if __name__ == "__main__":
unittest.main()
main.py
代码语言:javascript复制from myDict import MyDict
if __name__ == "__main__":
d = MyDict(a=0)
print(d, type(d))
d.a = 1
if d.a == 1:
print("----------------------")
else:
print("*************")
# d.c = 3
# if d.c == 4:
# print("**********************")
4、文档测试
代码语言:javascript复制# 该模块可以直接提取注释中的代码并执行测试
import doctest
def mySum(x, y):
# doctest严格按照python交互模式命令的输入和输出来判断结果
'''
>>> print(mySum(1,1))
2
'''
return x y 1
print(mySum(1,2))
doctest.testmod()