一篇文章向你解释什么是Unittest单元测试框架
Posted 测试baby
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇文章向你解释什么是Unittest单元测试框架相关的知识,希望对你有一定的参考价值。
01 单元测试
软件测试一般按阶段划分为:单元测试,集成测试,系统测试。单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证。单元测试中单元的含义,单元就是人为规定的最小的被测功能模块,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。在实际项目中,单元测试往往由开发人员完成。
02 单元测试框架
单元测试其实就是构造数据使用一段代码去测试另一段代码,理论上来说,不使用单元测试框架也能进行单元测试。但如果用于单元测试的代码(即测试用例)增多,在没有测试框架的情况下会变得拥挤、不可管理,这个时候引入测试框架就变得尤为重要。
单元测试框架提供了一种统一的编程模型,可以将测试定义为一些简单的类,这些类中的方法可以调用希望测试的应用程序代码。利用单元测试框架,可以很轻松地插入、设置和分解有关测试的功能,可以直观方便地管理测试用例。
主流的单元测试框架,如Java的Junit、TestNg,python的Unittest、Pyunit、Pytest,通用的自动化测试框架Robot Framework等。
03 单元测试框架作用
1)提供用例组织与执行
2)提供丰富的断言方法
3)提供丰富的日志与测试结果
01 Unittest 简介
Unittest是Python自带的单元测试框架,不仅适用于单元测试,还可用于Web、Appium、接口自动化测试用例的开发与执行。该测试框架可组织执行测试用例,并且提供丰富的断言方法,判断测试用例是否通过,并最终生成测试结果。
Unittest官方文档:http://docs.python.org/3/library/unittest.html
02 Unittest 核心要素
TestCase:即测试用例,Unittest提供testCase类来编写测试用例,一个TestCase的实例就是一个测试用例。一条测试用例就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown),通过运行一条测试用例,可以对某一个问题进行验证。
Fixture:即测试固件,用于测试用例环境的搭建和销毁。在测试步骤执行前需要为该测试用例准备环境(SetUp),如启动app或打开浏览器,测试步骤执行后需要恢复环境 (TearDown),如关闭app或浏览器,这时候就需要用到Fixture,使代码更简洁。
TestSuite:即测试套件,把需要执行的测试用例集合在一起就是TestSuite。使用TestLoader来加载TestCase到TestSuite中。
TextTestRunner:即测试执行器,用于执行测试用例。该模块中提供run方法执行TestSuite中的测试用例,并返回测试用例的执行结果,如运行的用例总数、用例通过数、用例失败数。
report:即测试报告。unittest框架没有自带的用于生成测试报告的模块或接口,需要使用第三方的扩展模块HTMLTestRunner。
03 Unittest 断言
断言在自动化测试脚本中是很重要的内容,只有设置正确合适的断言才能获取正确的测试结果。Unittest框架提供了自己的断言方法,如下:
注意:
如果断言成功则该条测试用例通过,断言失败则该条测试用例执行失败,且会抛出AssertionError错误。
以上提供的断言方法中,都有一个msg参数,默认为None。如果msg参数有对应的值,则断言失败后该msg的值会作为失败信息返回,如 assertEqual(a, b, msg=“a与b不相等!”) 。
01 测试需求
测试对象:构造一个类Math,其中包含整数的加、减法运算。
calculator.py
class Math():
def __init__(self, a, b):
self.a = int(a)
self.b = int(b)
def sum(self):
'''和'''
return self.a + self.b
def sub(self):
'''差'''
return self.a - self.b
测试需求:对Math类进行单元测试。接下来针对这个测试需求,使用unittest框架编写测试用例。
项目目录结构:后面的例子中,项目结构如下所示。
02 编写TestCase(测试用例)
在Unittest框架下创建测试用例,步骤如下:
1)导入unittest模块。
2)创建测试类。测试类的命名不做要求,但需要继承unittest.TestCase类。
3)添加setUp()、tearDown()函数,即测试固件。当然还有setUpClass()、tearDownClass() 函数,区别后面会有介绍。
4)定义测试方法,即测试用例。测试方法名称必须以test开头,否则测试时该方法将不会被执行。测试方法里需要添加断言。
5)调试执行测试用例。执行当前模块的测试用例时,调用unittest.main()方法,该方法会搜索该模块下所有以test开头的测试用例方法,并执行。其他方法后面介绍。
针对测试需求,编写测试用例。目录结构如下:
test_sum.py
import unittest
from calculator import Math
class SumTest(unittest.TestCase):
'''测试Math类中的sum函数'''
def setUp(self):
print("开始执行测试用例{}...".format(self))
def test_sum01(self):
m = Math(3, 4)
self.assertEqual(m.sum(), 7)
def test_sum02(self):
m = Math(2, 8)
self.assertEqual(m.sum(), 11)
def tearDown(self):
print("测试用例{}执行结束...".format(self))
if __name__ == '__main__':
unittest.main()
运行结果:
.F
======================================================================
FAIL: test_sum02 (__main__.SumTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:/Users/xiaoqq/Desktop/test_project/demo/testSum.py", line 15, in test_sum02
self.assertEqual(m.sum(), 11)
AssertionError: 10 != 11
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)
开始执行测试用例test_sum01 (__main__.SumTest)...
测试用例test_sum01 (__main__.SumTest)执行结束...
开始执行测试用例test_sum02 (__main__.SumTest)...
测试用例test_sum02 (__main__.SumTest)执行结束...
Process finished with exit code 0
结果显示:
1)test_sum01通过,test_sum02失败。点"."表示通过,"F"表示失败。
2)测试类中每个测试方法(即测试用例)执行前,都先执行setUp()方法,每个测试方法执行完毕后都要执行tearDown()方法。
3)断言失败会返回一个AssertionError。
这里给大家整理了一份《软件测试工程师进阶的技术栈》,包含了诸多技术栈,希望能帮助在升级打怪中提供中坚力量
给大家推荐下我自己建的软件测试交流学习群: 902061117 ,群里都是搞软件测试的,如果你正在学习测试 ,小编欢迎你加入,大家都是测试党,群内不定期分享干货(都是软件测试相关的),包括我自己整理的一份2021最新的进阶自动化资料。
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你
关注我的微信公众号【伤心的辣条】免费获取~
送上一句话:
世界的模样取决于你凝视它的目光,自己的价值取决于你的追求和心态,一切美好的愿望,不在等待中拥有,而是在奋斗中争取。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
好文推荐:
以上是关于一篇文章向你解释什么是Unittest单元测试框架的主要内容,如果未能解决你的问题,请参考以下文章