什么是单元测试
测试开发编写的代码
单元测试的单位是函数
Unittest是单元测试 框架工具,是python自带工具,由4个部分组成
测试用例(一个单元测试用例就是一个函数)
测试套(多条用例的集合)
测试固件(测试用例准备工作setUp函数表示,测试用例结束工作tearDown函数表示)
TestRunner:测试执行器(对象unittest.main())作用就是执行设定的测试用例得出测试结果交给测试人员
程序员自测的缺点:
- 不方便组织多条测试用例
- 不方便结论日志产出
- 不方便用例顺序组合
编写测试用例
快速入门
测试这个计算器
class count:
def __init__(self,name,a,b):
self.name=name
self.a=a
self.b=b
def add(self):
return self.a+self.b
def sun(self):
return self.a-self.b
if __name__=="__main__":
aa=count("卡西欧",1,2)
print(aa.add())
使用如下代码
from study1 import count
class Mytest(unittest.TestCase):#unittest.TestCase为固定格式
def test_1(self):#test为固定格式不可更改
c=count("张飞",10,20)#建立对象
vir_1=c.add()#对象调用方法
self.assertEqual(30,vir_1,msg="第一天用例失败")#参数1和参数2比较,msg=为断言,失败输出输出msg中内容,断言成功,不做输出(只关心失败输出)
#建立一个错误结果
def test_2(self):
c = count("张飞", 11, 22) # 建立对象
vir_1 = c.add() # 对象调用方法
self.assertEqual(99, vir_1, msg="第二天用例失败")
# 测试执行器
if __name__=="__main__":
unittest.main()#基本测试执行器
用测试执行器的原因:在pycharm中,自带了单元测试的基本执行器,不编写unittest.main()照样执行代码,编写代码的原则应与IDE无关(通用性),无法使用其他的执行器,推荐用命令行执行文件
命令行执行
.代表用例通过,f表示失败
setUp与tearDown
每次用例都会执行
测试用例顺序
数字小的先执行,数字大的后执行
字母小的先执行,字母大的后执行
强制控制顺序
#强制控制用例顺序
#1编写测试套(多个用例组合)
aaasuit = unittest.TestSuite()
#2往测试套中追加用例顺序
aaasuit.addTest(Mytest("test_2"))
aaasuit.addTest(Mytest("test_1"))
#追加的顺序就是执行顺序
#再用执行器执行即可
runner = unittest.TextTestRunner()#执行测试套的固定格式
runner.run(aaasuit)#执行测试套的固定格式
常见断言
assertEqual(a,b):判断a,b是否相等,相等通过,不等失败
assertNotEqual(a,b):判断a,b是否不相等,相等,测试失败
assertTrue(x):判断bool(x)是否为True,如果不是true,测试失败
assertFalse(x):判断bool(x)是否为False,如果不是False,测试失败
assertIN(a,b):判断a是否在b中,如不在,则失败
assertNotIn(a,b):判断a是否在b中,如在,则失败
测试类找被测试包
- 要点1:被测代码和测试代码放不同的包下
- 要点2:运行报错
原因:unittest在找包的时候默认从当前目录下找
解决:import sys(导入系统配置)以及sys.path.append(“…”)
append追加,找不到会从(上层目录)…找