单元测试框架
一、单元测试的定义
1:什么是单元测试?
还记不记得我们软件测试学习的时候,按照定义:单元测试就是对单个模块或者是单个函数进行测试,一般是开发做的,按照阶段来分,一般就是单元测试,集成测试,系统测试,验收测试。
2:为什么要做单元测试?
- 单元测试之后,才是集成测试,单个单个的功能模块测试通过之后,才能把单个功能模块集成起来做集成测试,为了从底层发现bug,减少合成后出现的问题。
- 越早发现bug越好,这样可以早点发现问题,不然问题累计到后面,如果做错了就要推到重来,对于时间和经费来说是非常浪费的。
对于我们测试来说:我们就单元测试是为了执行测试用例
输入测试数据à输出测试结果
二、unittest框架以及原理介绍
1、unittest框架最核心的四个概念:
TestCase:一个testcase的实例就是一个测试用例:
TestSuite:多个测试用例集合在一起。TestLoader:用来加载TestCase到TestSuite中的
TextTestRunner:用来执行测试用例的。
fixture:测试用例环境的搭建和销毁,测试前准备环境的搭建(setup),执行测试代码(run)
以及测试后环境的还原(tearDown)
我们会一个一个的来讲解,这些理论是怎么跟时间结合起来的。
2、单元测试案例
测试需求一
-
def login_check(username,password):
-
“””
-
登录校验的函数
-
:param username:账户
-
:param password:密码
-
:return:
-
“””
-
if 6 <= len(password) <= 18:
-
if username == ‘python18’ and password == ‘123456’:
-
return {“code”:0,”msg”:”登录成功”}
-
else:
-
return{“code”:1,”msg”:”账号或密码不正确”}
-
else:
-
return {“code”:1,”msg”:”密码长度在6-18位之间”}
设计用例测试上面的登录校验功能是否正常?
“””
账号、密码正确 à {“code”:0,”msg”:”登录成功”}
账号正确,密码在6-18之间(不正确) à{“code”:1,”msg”:”账号或密码不正确”}
账号正确,密码长度少于6 à{“code”:1,”msg”:”密码长度在6-18位之间”}
账号正确,密码长度大于18 à{“code”:1,”msg”:”密码长度在6-18位之间”}
错误的账户,密码正确 à{“code”:1,”msg”:”密码长度在6-18位之间”}
…
三、编写测试用例
1、TestCase类编写测试用例
继承unittest里面的TestCase类,继承这个类,写能写测试用例。每个用例我们都要记得引入fixture,做一些准备以及结束的工作。
编写用例步骤如下:
- 导入unittest模块、被测文件或者其中的类
- 创建一个测试类,并继承unittest.TestCase
- 重写setUp和tearDown方法(如果有初始化条件和结束条件)
- 定义测试函数,函数名以test开头。测试用例
- 调用unittest.main()方法运行测试用例。
-
class LoginCheckTes(unittest.TestCase):
-
#登录校验测试
-
def setUp(self):
-
print(‘每条用例开始执行’)
-
def test_login(self):
-
def test_password_error(self):
-
def test_user_error(self):
2、用例的执行顺序
执行顺序是按照ASCII编码来的
四:测试集合
1、TestSuite&TestLoader的使用
TestSuite:测试集,把所有的用例都存进来。常用方法如下:
unittest.TestSuite()
方法一:addTest()添加一个测试用例
unittest.TestLoader()
方法二:unittest.TestLoader.loadTestsFromModule(模块名)不需要加引号(注意要导入模块)
方法三:unittest.TestLoader.loadTestsFromTestCase(测试类名)不需要加引号
总结与疑问:
1:定义的测试类和测试套件写在不同的模块里,为什么?
2:为何引入测试集,方便批量进行单元测试
完整的单元测试很少只执行一个测试用例,开发人员通常需要编写多个测试用例才能对某一软件功能进行比较完整的测试,这些相关的测试用例称为一个测试用例集,用TestSuite类来表示的,用到的是TestSuie(),用addTest
五:unitest断言介绍
断言方法
六:执行用例&生成报告
1、TextTestRunner的用法
测试用例已经集合完毕,如何来执行用例?
需要用到TextTestRunner,执行测试集,用到的是TextTestRunner(),用run方法。
#创建runner对象,
runner=unittest.TextTestRunner()
#这里传入测试集合执行
runner.run(suite)
测试结果怎么看?
. 表示用例通过 一个点表示一个用例
E表示出错了
F表示不通过
- 生成测试报告
text类型报告:
#创建一个文件,以写的方式打开
html类型报告:
now = time.strftime(‘%Y-%m-%d%H%M%_%S’)#随机生成时间
需要下载HTMLTestRunnerNew
七:综合运用
每个用例写的代码都是一样的?有没有优化的方法?
用例的数据可不可独立出来?
注意点,每条用例是一条TestCase类的对象,创建对象初始化时需要注意__init__方法