本文的主要结构 第一部分:UnitTest简介 第二部分:基本概念的介绍 第三部分:各个概念详解 第四部分:程序的运行 第五部分:测试报告的输出
一、UnitTest简介
UnitTest是Python自带的测试框架,主要适用于单元测试,并对多个测试用例进行管理和封装。
二、基本概念介绍
(一)测试用例-testcase 测试用例是测试框架最底层的内容(类似,砖是房子最基本的东西) 每一条用例的设计,和功能用例一样,可以尽量包含多个测试点 (二)测试固件-testfixture 测试固件=固定的测试代码(即:测试代码中相同的部分) eg:测试一个接口,接口地址可以通过setup()进行初始化,然后各个测试用例直接调用初始化的接口地址就可以了 例如通过teardown()来结束测试工作。 (三)测试套件-testsuit 测试套件吧多个测试用例集合在一起,可以理解为测试用例的集合。 (四)测试运行器-testrunner 测试运行器是给测试用例提供运行环境的,通过它的run()方法来执行测试用例,并在执行完后将测试结果输出。
三、各个概念详解
(一)测试用例
导入Unittest模块; 定义一个测试类(继承unittest.TestCase基类),一个测试用例封装到一个函数中 一个测试类中可以包含多个测试用例。
(二)测试固件
将重复的代码放在一起, 起到的作用:减少冗余代码;便于后期代码维护 例如上面的登录检查,每个用例中都使用到url, 我们可以通过setup()将url进行初始化
r = requests.post(self.url, json=form)
message = r.json()["message"]
self.assertEqual(message, "成功!")
setUp函数是测试用例的公共部分,类似一个全局变量,供其他函数调用,其他函数不用再重复定义,直接通过变量self.url调用。
(三)测试套件
测试套件主要用来添加测试用例,添加用例的方式,本文主要介绍三种: 1.通过TestSuite()添加用例
def suite():
"""
定义suit()函数,用来返回已经创建好的测试套件实例
:return:
"""
suite = unittest.TestSuite()
suite.addTest(testSet0Setup("test_set0_0"))
suite.addTests([testSet0Setup("test_set0_1"),testSet0Setup("test_set0_2"),testSet0Setup("test_set0_3")])
return suite
运行代码
if __name__ =="__main__":
runner = unittest.TextTestRunner()
runner.run(suite())
通过addTest添加用例,适合测试用例比较少的情况,如果用例比较多,可以考虑其他方式。
2.通过makeSuite()添加用例
def suite():
suite =unittest.makeSuite(testSet0Setup,"test")
return suite
makeSuite(testSet0Setup,“test”)将testSet0Setup中所有以“test”开头的测试用例添加到测试套件中 显然:一行代码就可以添加所有符合要求的用例 但是:不灵活,只能添加全部
测试用例可以分别从多个文件中取,然后通过TestSuite(suite0,suite1)将多个套件合成一个测试套件实例
def suite():
suite0 =unittest.makeSuite(testSet0Setup,"test")
suite1 = unittest.makeSuite(testSet0, "test")
suite = unittest.TestSuite(suite0,suite1)
return suite
3.通过defaultTestLoader.discover()添加测试覆盖范围
(四)测试运行
方式一: runner = unittest.TextTestRunner() #run()调用suite()构建的测试用例 runner.run(suite()) 方式二:还可以将所有操作都封装到一个main(),运行unittest.main()即可
(五)测试报告
unittest测试框架是python内置的框架,但是并没有测试报告输出,需要下载导入一个第三方模块HTMLTestRunner,以HTML形式存放测试结果,并会以报告的形式保存。 HTMLTestRunner扩展模块无法通过pip进行安装,下载地址如下: http://tungwaiyip.info/software/HTMLTestRunner.html 将py文件放到python安装的目录ilb文件夹下面,由于是基于python2开发,为兼容python3语法,需要将文件进行如下修改:
行号 | 修改前 | 修改后 |
---|
94 | import StringIO | import io | 539 | StringIO.StringIO() | io.StringIO() | 631 | print >>sys.stderr, ‘\nTime Elapsed: %s’ % (self.stopTime-self.startTime) | print(sys.stderr, ‘\nTime Elapsed: %s’ % (self.stopTime-self.startTime)) | 642 | if not rmap.has_key(cls): | if not cls in rmap : | 766 | uo = o.decode(‘latin-1’) | uo =e | 772 | ue = e.decode(‘latin-1’) | uo =e | 778 | output = saxutils.escape(uo+ue) | output = saxutils.escape(str(uo)+str(ue)), |
我使用的HTMLTestRunner文件链接如下 链接: https://pan.baidu.com/s/1vHjiHqaqJkeUWKMl6mwy1g 提取码: mqen
if __name__ == "__main__":
filepath = "./htmlreport.html"
fp = open(filepath,"wb")
suite = unittest.TestSuite()
suite.addTest(TestAssert("testAssertIn"))
runner = HTMLTestRunner(stream= fp,title= "测试报告",description="期待成功哈")
runner.run(suite)
fp.close()
运行文件可以生成如下报告:
在生成测试报告部分时,遇到不可以生成测试报告的情况,具体解决方法可参考如下文章: https://blog.csdn.net/qq_44801116/article/details/125444133?spm=1001.2014.3001.5501
|