Python自动化测试框架之unittest使用详解!

这篇文章主要介绍了Python接口自动化浅析unittest单元测试原理,文中描述了单元测试,unittest模块特性、大致流程、源码及实战例子这几个模块,有需要的朋友可以借鉴参考下

以下主要介绍unittest特性、运行流程及实际案例。


一、单元测试三连问

1、什么是单元测试?
按照阶段来分,一般就是单元测试,集成测试,系统测试,验收测试。

单元测试是对单个模块、单个类或者单个函数进行测试。

将访问接口的过程封装在函数里面;

接口测试就变成了单元测试;

单元测试就是通过传参,对某个模块、某个类、某个函数进行结果输出后验证的测试。


2、为什么要做单元测试?
1.单元测试之后,才是集成测试,单个的功能模块测试通过之后,才能把单个功能模块集成起来做集成测试,为了从底层发现bug,减少合成后出现的问题。

2.越早发现bug越好,否则问题累计到后期,如果做错了就要推倒重来,对于时间和人力成本来说非常耗费精力。

对于我们测试来说:单元测试是为了执行测试用例。


3、怎么做单元测试?
Python里有两个单元测试类:

1.Unittest(Python自带);

2.Pytest(下载安装);

前者多用于接口自动化项目用,后者多用于WEB自动化项目、APP自动化项目。


二、unittest模块说明

1、unittest简介
unittest是Python自带的单元测试框,具备编写用例、组织用例、执行用例、输出报告等自动化框架的条件,可以用来作自动化测试框架的用例组织执行框架。

unittest框架的特性:

提供用例组织与执行:当测试用例只有几条的时候可以不考虑用例的组织,但是当测试用例数量较多时,此时就需要考虑用例的规范与组织问题。unittest单元测试框架就是用来解决这个问题的。
提供丰富的断言方法:既然是测试,就有一个预期结果和实际结果的比较问题。比较就是通过断言来实现,unittest单元测试框架提供了丰富的断言方法,通过捕获返回值,并且与预期值进行比较,从而得出测试通过与否。
提供丰富的日志:每一个失败用例我们都希望知道失败的原因,所有用例执行结束我们有希望知道整体执行情况,比如总体执行时间,失败用例数,成功用例数。unittest单元测试框架为我们提供了这些数据。

2、unittest组成
unittest单元测试中最核心的四个部分是:

TestCase(测试用例)

TestSuite(测试套件)

TestRunner(测试运行器)

TestFixture(测试环境数据准备和清理)

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:822269834

1.TestCase(测试用例):
一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程。包括测试前准备环境的搭建(setUp)、实现测试过程的代码(run),以及测试后环境的还原(tearDown)。

单元测试(Unittest)的本质也就在这里,一个测试用例就是一个完整的测试单元,通过运行这个测试单元,可以对某一个功能进行验证。


2.TestSuite(测试套件):
一个功能的验证往往需要多个测试用例,可以把多个测试用例集合在一起执行,这就产生了测试套件TestSuite的概念。TestSuite用来组装单个测试用例。可以通过addTest加载TestCase到TestSuite中,从而返回一个TestSuite实例。

而且TestSuite也可以嵌套TestSuite。


3.TestLoader(测试用例加载器):
用来加载TestCase到TestSuite中的,其中loadTestsFrom__()方法用于寻找TestCase,并创建它们的实例,然后添加到TestSuite中,返回TestSuite实例;


4.TextTestRunner(执行测试用例):
用来执行测试用例,其中run(test)会执行TestSuite/TestCase中的run(result)方法,并将测试结果保存到TextTestResult实例中,包括运行了多少测试用例,成功多少,失败多少等信息;


5.Test Fixture(测试环境数据准备和清理):
一个测试用例的初始化准备及环境还原,主要是setUp() 和 tearDown()方法;

比如说在测试用例中需要访问数据库,那么可以在setUp()中建立数据库连接以及进行一些初始化,

在tearDown()中清除在数据库中产生的数据,然后关闭连接。

注意tearDown的过程很重要,要为以后的TestCase留下一个干净的环境。


3、unittest核心工作原理
unittest的静态类图:

大体流程:编写TestCase,由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,最后将运行的结果保存在TextTestResult中。


三、unittest单元测试

1、实现思路
1.导入unittest模块、 被测文件或者其中的类;

2.创建一个测试类,并继承unittest.TestCase方法;

3.重写setUp和tearDown方法(如果有初始化条件和结束条件)。若setup()成功运行,无论测试方法是否成功,都会运行tearDown ();

4.定义测试函数,函数名以test_开头,以识别测试用例;

5.调用unittest.main()方法运行测试用例;

6.用例执行后,需要判断用例是Pass还是Fail,可以用unittest.TestCase模块的:断言

断言就是比对预期结果。如果不加断言,没有结果对比,需要手动去检查运行的结果是否符合预期。


2、使用介绍
1.要想使用unittest单元测试框架,必须得先导入:import unittest

2.查看unittest源码;

1

2

import unittest

print(help(unittest))

 从打印结果中提取出unittest简易的例子:

import unittest

class IntegerArithmeticTestCase(unittest.TestCase):

    def testAdd(self):  # test method names begin with 'test'

        self.assertEqual((1 + 2), 3)

        self.assertEqual(0 + 1, 1)

    def testMultiply(self):

        self.assertEqual((0 * 10), 0)

        self.assertEqual((5 * 8), 40)

if __name__ == '__main__':

    unittest.main()

四、unittest实例

1、TestCase(测试用例)

看了官方代码后,我们自己写个例子熟悉下,并总结出规律:

import unittest

class TestDemo(unittest.TestCase):

    # test_sub用例

    def test_sub(self):

        self.assertEqual(2-1,1)

    # test_add用例

    def test_add(self):

        self.assertEqual(2+1,3)

if __name__ == "__main__":

    # unittest.main()是运行主函数

    unittest.main(verbosity=2)
运行结果为:

test_add (__main__.TestDemo) ... ok
test_sub (__main__.TestDemo) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK

接下来,我们来总结一些规律:

使用unittest前,需导入unittest框架。
TestDemo这个类必须继承unittest.TestCase,TestCase类,所有测试用例类继承的基类。
类内的方法必须以test开头,比如test_add。
断言:assertEqual用来断言预期结果和实际结果是否一致。当然unittest还包含很多其他断言方法,后面统一介绍。
用例执行顺序。在代码中test_sub方法写在test_add前,但实际,test_add比test_sub先运行。为什么呢?unittest执行测试用例,默认是根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。
verbosity是一个选项,表示测试结果的信息复杂度,有0、1、2 三个值。verbosity=0 : 你只能获得测试用例数总的结果;verbosity=1 (默认模式): 在每个成功的用例前面有个“.” 每个失败的用例前面有个 “F”;verbosity=2 (详细模式):测试结果会显示每个测试用例的所有相关的信息。
如下,在测试用例中写入断言:

import unittest

#测试MathMethod类

class TestMathMethod(unittest.TestCase):

    #编写测试用例

    def test_add_two_positive(self): #测试两个正数相加

        res=MathMethod(1,1).add()

        print("1+1的结果是:",res)

        self.assertEqual(2,res,"两个正数相加出错!") #断言

    def test_add_two_zero(self): #测试两个0相加

        res = MathMethod(0, 0).add()

        print("0+0的结果是:", res)

        self.assertEqual(0, res, "两个0相加出错!") #断言

    def test_add_two_negative(self): #测试两个负数相加

        res = MathMethod(-1, -1).add()

        print("-1+(-1)的结果是:", res)

        self.assertEqual(-2, res, "两个负数相加出错!") #断言

if __name__ == '__main__':

    unittest.main()

测试用例里面的setUp函数与tearDown函数的使用:

class TestMathMethod(unittest.TestCase):

def setUp(self):

    print("开始准备执行测试用例!")

     

def tearDown(self):

    print("结束!")

     

#编写测试用例

def test_add_two_positive(self): #测试两个正数相加

    res=MathMethod(1,1).add()

    print("1+1的结果是:",res)

setUp函数:初始化环境(执行每条用例之前,都要执行setUp函数下面的代码,每次都要执行);

tearDown函数:清洗环境(执行每条用例之后,都要执行tearDown函数下面的代码,每次都要执行);

setUp()、tearDown()是TestCase里的方法,写在测试类中,就是方法的重写。

执行顺序是:setUp->testA->tearDown->setUp->testB>tearDown


2、TestSuit(测试集)
当测试用例全部写完,但是只想执行其中部分,可以使用TestSuit()来收集测试用例。

import unittest

from xxx import xxx      #测试用例的类

suite=unittest.TestSuit()

suite.addTest(测试用例的类("用例名称1"))    #用例名称用字符串的形式传入

suite.addTest(测试用例的类("用例名称2"))

suite.addTest(测试用例的类("用例名称3"))

.....
3、TestLoader(加载测试用例)

方式一:通过测试类来加载用例(loadTestsFromTestCase)

一次性加载测试用例类名1下的所有用例。

import unittest

    from xxx import xxx      #测试用例的类

    suite=unittest.TestSuit()

    loader=unittest.TestLoader()

    suite.addTest(loader.loadTestsFromTestCase(测试用例类名1)) 

    #测试用例类名直接传入
方式二:通过测试类所在的模块加载用例(loadTestsFromModule)

一次性加载测试用例模块名下的所有用例。

import unittest

from xxx import xxx      #测试用例模块

suite=unittest.TestSuit()

loader=unittest.TestLoader()

suite.addTest(loader.loadTestsFromTestCase(测试用例模块名))   #测试用例模块名直接传入
4、生成测试报告

方式一:使用unittest自带的TextTestRunner生成测试报告(文本格式,不推荐使用)。

TextTestRunner是一个以文本形式展示测试结果的测试运行程序类

stream 输出报告的路径,默认输出控制台;

verbosity 控制输出报告的详细程度,从0-2,越来越详细;


方式二:使用第三方模块HTMLTestRunnerNew(生成HTML格式的测试报告,推荐使用)。
file:文件

verbosity:详细程度

title:标题

description:描述

tester:作者

with open("接口测试报告.html","wb") as file:

    runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file, 

                                              verbosity=2,

                                              title="接口自动化测试报告",

                                              description="接口测试V1",

                                              tester="ITester软件测试小栈")

    runner.run(suite)
方式三:使用unittest.defaultTestLoader.discover() 模糊匹配。
import unittest

import HTMLTestRunnerNew

all_testcases=unittest.defaultTestLoader.discover(contants.testcases_dir, pattern='test_*.py',top_level_dir=None)

#利用上下文管理器自动关闭资源

with open(contants.reports_html,"wb+") as file:    #选择绝对路径,把文件打开,写进内容 (报告的文件名直接写在路径里面)

    runner=HTMLTestRunnerNew.HTMLTestRunner(stream=file,

                                            title="接口自动化测试报告",

                                            description="接口测试V1",

                                            tester="ITester软件测试小栈")

    runner.run(all_testcases)

到此这篇关于Python接口自动化浅析unittest单元测试原理的文章就介绍到这了,更多相关Python接口自动化unittest单元测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持小编!

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

  视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方进群即可自行领取。    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/185292.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【腾讯云云上实验室】探索保护数据之盾背后的安全监控机制

当今数字化时代,数据安全成为了企业和个人最为关注的重要议题之一。随着数据规模的不断增长和数据应用的广泛普及,如何保护数据的安全性和隐私性成为了迫切的需求。 今天,我将带领大家一起探索腾讯云云上实验室所推出的向量数据库&#xff0c…

酵母双杂交服务专题(一)

酵母双杂交系统是一种在酵母这种真核生物模型中执行的实验方法,用于探索活细胞内部蛋白质间的相互作用。这种技术能够敏感地捕捉蛋白质间的细微和短暂相互作用,通过检测报告基因的表达产物来实现。作为一种高度灵敏的技术,酵母双杂交系统被广…

FreeRTOS-FreeRTOS概述

FreeRTOS FreeRTOS目录结构 移植过程 在工程中创建freertos文件夹,在freertos文件夹中创建src文件夹、inc文件夹、port文件夹。 freertos/src存放源码freertos/inc存放头文件freertos/port存放移植平台的相关文件 复制内存管理文件:复制FreeRTOS/Sourc…

井盖位移传感器厂家批发,守护井盖安全

窨井盖广泛分布于城市街道,其管理效果直接反映了城市治理的现代化程度。根据住房和城乡建设部发布的《关于进一步加强城市窨井盖安全管理的通知》,全国各地需加强窨井盖的安全管理。作为市政基础设施的一个重要的组成部分,井盖的管理工作不仅…

COCO类别标签增加80

COCO类别标签增加80 import codecs import ospath H:/Dataset/COCO/train_pbr/000001/labels/ # 标签文件train路径 m os.listdir(path) # 读取路径下的txt文件 for n in range(0, len(m)):t codecs.open(H:/Dataset/COCO/train_pbr/000001/labels/ m[n], moder, encoding…

Photoshop下载秘籍:附送7款不用下载的在线PS工具!

如何下载Photoshop?直接到官网下载PS软件即可。进入Adobe官网wwwww.adobe.com,在搜索框输入“在搜索框中输入”Photoshop“,选择你需要的版本,点击下载按钮,根据提示完成安装。但需要注意的是,Adobe官网的正…

Android Tombstone 与Debuggerd 原理浅谈

一、前言 Android系统类问题主要有stability、performance、power、security。Android集成一个守护进程tombstoned是android平台的一个守护进程,它注册成3个socket服务端,客户端封装在crash_dump和debuggerd_client。 crash_dump用于跟踪定位C crash&am…

echarts设置容器宽度设置为100%只显示100px宽度

在使用echarts时,写在tab页中的图表宽度明明设成了100%,但是在页面上实际却只有100px宽 原因很简单,在tab页中,图表的父容器div是隐藏的(display:none),图表在执行js初始化的时候找…

井盖位移传感器生产厂家推荐,时刻感知井盖

马路上的井盖虽然看似微不足道,但实际上对于行人的“脚下安全”起着至关重要的作用。这些井盖下连接着供排水、燃气、电力、供热、通信等功能的管路和线路,是城市生命线运行的重要保障。因此保持井盖状态正常、明确管理责任是确保车辆和行人安全通行的重…

【GCC】1:chatgpt:NetworkControllerInterface、GoogCcNetworkController

代码基于 mediasoup-sfu-cpp 中的m77版本。使用chatgpt辅助学习。网络状态估计器:开发中 D:\XTRANS\soup\mediasoup-sfu-cpp\deps\libwebrtc\libwebrtc\api\transport\network_control.h NetworkControllerInterface 网络控制器 此类,使用 网络状态和 通信状态 以 估计网络参…

SQL常见函数整理 _ LAG() 向上偏移

1. 用法 窗口函数,用于访问窗口中当前行之前的行的数据。该函数可以根据需要计算当前行之前的值,使我们能够轻松地比较不同行之间的差异和变化。 2. 基本语法 LAG(column, offset, default_value) OVER (ORDER BY column)column:代表在返回…

Ubuntu 安装 JMeter:轻松上手

Apache JMeter 是一个开源的负载测试工具,可以用于测试静态和动态资源,确定服务器的性能和稳定性。在本文中,我们将讨论如何下载和安装 JMeter。 安装 Java(已安装 Java 的此步骤可跳过) 要下载 Java,请遵…

pytorch训练模型内存溢出

1、训练模型命令命令 如下所示是训练命名实体识别的命令,在win10系统下执行 activate pytorch cd F:\Python\github\ultralytics-main\submain\pytorch_bert_bilstm_crf_ner-main f: python main.py --bert_dir"../model_hub/chinese-bert-wwm-ext/" --…

Linux 排查必看文件

目录 1. 登录日志 1.1 /var/log/wtmp 1.2 /var/log/btmp.* 1.3 /var/log/lastlog 1.4 /var/log/faillog 1.5 /var/log/secure 1.6 /var/log/auth.log 2. 系统日志 2.1 /var/log/cron.* 2.2 /var/log/syslog 2.3 /var/log/audit/audit.*log 3. 历史命令 3.1 ~/…

Linux基本命令操作 —— 文件夹/文件的创建,删除,查看,重命名......(简单理解 快速上手)

目录 1. 基础命令 1.1 显示当前目录:pwd 1.2 改变当前目录:cd 2. 文件夹的操作命令 2.1 创建文件夹:mkdir 2.2 查看文件夹:ls 2.3 删除文件夹:rmdir (不推荐) 2.4 复制文件夹&#xff1…

数据分析基础之《matplotlib(2)—折线图》

一、折线图绘制与保存图片 1、matplotlib.pyplot模块 matplotlib.pyplot包含了一系列类似于matlab的画图函数。它的函数作用于当前图形(figure)的当前坐标系(axes) import matplotlib.pyplot as plt 2、折线图绘制与显示 展示城…

科普:多领域分布式协同仿真

分布式协同仿真是一种在分布式计算环境中进行协同工作的仿真方法。使用该方法进行协同仿真时,仿真任务将被分发到多个计算节点上,并且这些节点可以同时工作以模拟完整的系统行为。分布式协同仿真已被广泛应用于工程、科学和军事领域,以便更好…

交叉导轨在光学工作台起什么重要作用?

光学工作台常常需要承载和移动各种光学元件和仪器,如望远镜、显微镜、光谱仪等,这些设备需要在空间中进行精确的定位和稳定支撑,而交叉导轨作为一种高精度、高刚度的直线传动元件,为光学工作台提供了重要的支撑和导向。 1>交叉…

Python开源项目之人工智能老照片修复算法学习

文章目录 前言项目环境搭建conda虚拟环境创建激活环境Pytorch安装Synchronized-BatchNorm-PyTorch repository安装Global目录Synchronized-BatchNorm-PyTorch项目部署检测预处理模型下载下载脸部增强模型文件下载依赖完整部署后项目结构 项目使用验证一下总结关于Python技术储备…

万宾科技可燃气体监测仪的功能有哪些?

随着城市人口的持续增长和智慧城市不断发展,燃气作为一种重要的能源供应方式,已经广泛地应用于居民生活和工业生产的各个领域。然而燃气泄漏和安全事故的风险也随之增加,对城市的安全和社会的稳定构成了潜在的威胁。我国燃气管道安全事故的频…