• python-UnitTest学习笔记


    本文的主要结构
    第一部分: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, "成功!")
    
    • 1
    • 2
    • 3

    setUp函数是测试用例的公共部分,类似一个全局变量,供其他函数调用,其他函数不用再重复定义,直接通过变量self.url调用。

    (三)测试套件

    测试套件主要用来添加测试用例,添加用例的方式,本文主要介绍三种:
    1.通过TestSuite()添加用例

    def suite():
        """
        定义suit()函数,用来返回已经创建好的测试套件实例
        :return:
        """
        #调用TestSuite()函数生成一个测试套件实例
        suite = unittest.TestSuite()
        #使用addTest方法添加单个测试用例
        suite.addTest(testSet0Setup("test_set0_0"))
        # 使用addTests方法添加多个测试用例
        suite.addTests([testSet0Setup("test_set0_1"),testSet0Setup("test_set0_2"),testSet0Setup("test_set0_3")])
    
        return suite
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行代码

    if __name__ =="__main__":
        #构建一个运行器对象
        runner = unittest.TextTestRunner()
        #run()调用suite()构建的测试用例
        runner.run(suite())
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    通过addTest添加用例,适合测试用例比较少的情况,如果用例比较多,可以考虑其他方式。

    2.通过makeSuite()添加用例

    def suite():
        #makeSuite()可以直接表明某个类下面,用例名已test开头的测试用例添加到测试套件中
        suite =unittest.makeSuite(testSet0Setup,"test")
        return suite
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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语法,需要将文件进行如下修改:

    行号修改前修改后
    94import StringIOimport io
    539StringIO.StringIO()io.StringIO()
    631print >>sys.stderr, ‘\nTime Elapsed: %s’ % (self.stopTime-self.startTime)print(sys.stderr, ‘\nTime Elapsed: %s’ % (self.stopTime-self.startTime))
    642if not rmap.has_key(cls):if not cls in rmap :
    766uo = o.decode(‘latin-1’)uo =e
    772ue = e.decode(‘latin-1’)uo =e
    778output = 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    运行文件可以生成如下报告:
    在这里插入图片描述

    在生成测试报告部分时,遇到不可以生成测试报告的情况,具体解决方法可参考如下文章:
    https://blog.csdn.net/qq_44801116/article/details/125444133?spm=1001.2014.3001.5501

  • 相关阅读:
    二次封装element select,通过computed计算属性解决v-model父子组件传递值问题
    国家开放大学 模拟试题训练
    【Dubbo3高级特性】「框架与服务」自定义Dubbo服务容器及扩展容器实现分析
    【华为OD机试】选修课【2023 B卷|100分】
    一个 curl 配置引发的惨案
    求助!什么软件可以人声分离?手机上可以进行人声分离操作吗?
    java 的三种 Base64
    应急电源、储能电源欧盟CE认证标准EN62133申请要求
    mysql 问题解决 3
    Node.js中的文件系统(file system)模块
  • 原文地址:https://blog.csdn.net/qq_44801116/article/details/125323197