python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)

news2024/11/17 11:53:02

简介

  大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的。对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行。虽然或许通过代码实现了,也是稀里糊涂的一知半解,这样还好,好歹自己鼓

捣出了,但是时间和效率并不是很高,下次遇到还是老样子。那么本篇通过最简单案例来给给为小伙伴详细讲解、演示一下 unittest 执行顺序。

实例代码

如果你想学习接口自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的接口自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386   

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1.【接口自动化】目前软件测试的市场行情以及测试人员能力标准。、2.【接口自动化】全面熟练Requests库以及底层方法调用逻辑、3.【接口自动化】接口自动化实战及正则和JsonPath提取器的应用等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337&vd_source=488d25e59e6c5b111f7a1a1a16ecbe9a 

参考代码

 1 # coding=utf-8
 2 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 #2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-4-23
 7 @author: 北京-宏哥
 8 Project:学习和使用unittest框架编写测试用例执行顺序
 9 '''
10 #3.导入unittest模块
11 import unittest
12 #4.执行顺序和运行测试
13 import unittest
14 
15 class TestLogin(unittest.TestCase):
16 
17     def test_login_blog(self):
18         """登录博客园
19 
20         :return:
21         """
22 
23     def test_add_essay(self):
24         """ 添加随笔
25 
26         :return:
27         """
28 
29     def test_release_essay(self):
30         """ 发布随笔
31 
32         :return:
33         """
34 
35     def test_quit_blog(self):
36         """退出博客园
37 
38         :return:
39         """
40 if __name__ == "__main__()":
41     unittest.main()

这是一个标准的使用unittest进行测试的例子,写完后心里美滋滋,嗯,就按照一贯思路代码会按照这个顺序测就可以了。结果一运行。就傻眼了 

这时候自己心里犯嘀咕,这是什么鬼,怎么回事呢。执行的顺序乱了。第一个执行的测试用例并不是登录博客园,而是添加随笔,此时用户还没登录博客园,进行添加随笔的话会直接报错,导致用例失败。

到这里有些小伙伴可能会说,为什么要让测试用例之间有所依赖呢?

的确,如果完全没依赖,测试用例的执行顺序是不需要关注的。但是这样对于用例的设计和实现,要求就高了许多。而对博客园来说,一个系统内的操作,是有很大的关联性的。以添加随笔为例,随笔内的每个操作都有一个前提,你需要

登录博客园才能添加随笔。所以要实现用例之间的完全解耦,需要每个用例开始之前,检测用户的登录状态。

如果可以控制测试用例的执行顺序,按照功能流程一遍走下来,节省的代码量是非常可观的,阅读测试用例也会清晰明了许多。

如何控制unittest用例执行的顺序呢?

1、带大家先看看源码,unittest是怎么样对用例进行排序的。在loader.pyloadTestsFromTestCase方法里边,调用了getTestCaseNames方法来获取测试用例的名称

2、从源码可以清楚地看到,getTestCaseNames方法对测试用例的名称进行了排序

 3、一步一步跟进去,查看其排序方法

4、根据排序规则,unittest执行测试用例,默认是根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。

5、做个小demo,看看是不是我们所说的那种排序规则

6、从上边的运行结果,我们可以看出是:unittest执行测试用例,默认是根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。

7、基于unittest的机制,如何控制用例执行顺序呢?查了一些网上的资料,主要介绍了两种方式:

方式1,通过TestSuite类的addTest方法,按顺序加载测试用例

参考代码

 1 # coding=utf-8
 2 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 #2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-4-23
 7 @author: 北京-宏哥
 8 Project:学习和使用unittest框架编写测试用例执行顺序
 9 '''
10 #3.导入unittest模块
11 import unittest
12 #4.执行顺序和运行测试
13 import unittest
14 
15 class TestLogin(unittest.TestCase):
16 
17     def setUp(self):
18         pass
19     def test_login_blog(self):
20         """登录博客园
21 
22         :return:
23         """
24         print("登录博客园")
25     def test_add_essay(self):
26         """ 添加随笔
27 
28         :return:
29         """
30         print("添加随笔")
31     def test_release_essay(self):
32         """ 发布随笔
33 
34         :return:
35         """
36         print("发布随笔")
37     def test_quit_blog(self):
38         """退出博客园
39 
40         :return:
41         """
42         print("退出博客园")
43 
44     def tearDown(self):
45         pass
46 if __name__ == '__main__':
47     # 启动单元测试
48     # unittest.main()
49 
50     # 获取TestSuite的实例对象
51     suite = unittest.TestSuite()
52 
53     # 将测试用例添加到测试容器中
54     suite.addTest(TestLogin('test_login_blog'))
55     suite.addTest(TestLogin('test_add_essay'))
56     suite.addTest(TestLogin('test_release_essay'))
57     suite.addTest(TestLogin('test_quit_blog'))
58 
59     # 创建TextTestRunner类的实例对象
60     runner = unittest.TextTestRunner()
61     runner.run(suite)
62     #unittest.TextTestRunner(verbosity=3).run(suite)

方式2,通过修改函数名的方式

参考代码

 1 # coding=utf-8
 2 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 #2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-4-23
 7 @author: 北京-宏哥
 8 Project:学习和使用unittest框架编写测试用例执行顺序
 9 '''
10 #3.导入unittest模块
11 import unittest
12 #4.执行顺序和运行测试
13 import unittest
14 
15 class TestLogin(unittest.TestCase):
16 
17     def setUp(self):
18         pass
19     def test_1_login_blog(self):
20         """登录博客园
21 
22         :return:
23         """
24         print("登录博客园")
25     def test_2_add_essay(self):
26         """ 添加随笔
27 
28         :return:
29         """
30         print("添加随笔")
31     def test_3_release_essay(self):
32         """ 发布随笔
33 
34         :return:
35         """
36         print("发布随笔")
37     def test_4_quit_blog(self):
38         """退出博客园
39 
40         :return:
41         """
42         print("退出博客园")
43 
44     def tearDown(self):
45         pass
46 if __name__ == '__main__':
47     # 启动单元测试
48     unittest.main()

 拓展练习

1、实例

2、运行结果

3、运行结果分析

1、从运行结果可以看出执行顺序:

  start!-执行测试用例 01-end!

  start!-执行测试用例 02-end!

  start!-执行测试用例 03-end!

2、从执行结果可以看出几点

  --先执行的前置 setUp,然后执行的用例(test*),最后执行的后置 tearDown

  --测试用例(test*)的执行顺序是根据 01-02-03 执行的,也就是说根据用例名称来顺序执行的

  --addtest(self)这个方法没执行,说明只执行 test 开头的用例

参考代码

 1 # coding=utf-8
 2 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 #2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-4-23
 7 @author: 北京-宏哥
 8 Project:学习和使用unittest框架编写测试用例思路
 9 '''
10 #3.导入unittest模块
11 import unittest
12 
13 #4.执行顺序和运行测试
14 import time
15 class Test(unittest.TestCase):
16     def setUp(self):
17         print ("start!")
18     def tearDown(self):
19         time.sleep(1)
20         print ("end!")
21     def test01(self):
22         print ("执行测试用例 01")
23     def test03(self):
24         print ("执行测试用例 03")
25     def test02(self):
26         print ("执行测试用例 02")
27     def addtest(self):
28         print ("add 方法")
29 if __name__ == "__main__":
30     unittest.main()

小结

1、这个执行顺序,看似简单,实则不简单,只有掌握最简单的才可以应付最复杂的。

2、setUp()tearDown()方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于深度学习的高精度Caltech行人检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度Caltech数据集行人检测识别系统可用于日常生活中或野外来检测与定位行人目标,利用深度学习算法可实现图片、视频、摄像头等方式的行人目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv…

部署HAproxy + Nginx负载均衡集群

目录 一、常规Web集群调度器 HAproxy概念(主要特性) HAproxy负载均衡八种策略 二、LVS、Nginx、HAproxy区别 Nginx服务 LVS服务 HAproxy服务 三、部署HAproxy Nginx负载均衡集群 第一步 关闭防火墙和安全机制 第二步 安装依赖环境 第三步 导…

基于paddelOCR的车票识别以及在PCB板上应用

基于paddelOCR的车票识别 任务简介 车牌识别就是从图片或者视频中提取车牌信息 任务难点 尺度差异大,悬挂位置不固定;角度倾斜,图片模糊,光照不足,过曝等问题;边缘和端测场景应用对模型大小有限制&#…

C++之装饰器适配器模式

目录 一、装饰器模式 模式思想 模式简介 模式优点 模式缺点 代码实现 情景模拟 代码实现 运行结果 二、适配器模式 模式简介 介绍 优点 缺点 代码实现 情景模拟 一、装饰器模式 模式思想 模式简介 装饰器模式(Decorator Pattern)允许向…

前端基础(三十六):读取本地音视频设备并进行播放

效果 navigator.mediaDevices.enumerateDevices 请求媒体输入和输出设备的列表,例如麦克风,摄像机,耳机设备等 navigator.mediaDevices.getUserMedia 会提示用户给予使用媒体输入的许可,媒体输入会产生一个MediaStream&#xff0c…

伺服系统行业发展

伺服系统行业发展 1 介绍1.1 概述1.2 一般应用1.3 分类按系统功率分类按动力来源分类 1.4 工业控制中的伺服系统1.5 数字信号驱动与模拟信号驱动对比1.6 发展历史 2 伺服系统厂家工业机械臂移动AMR 3 关键指标及难点4 三相交流逆变器(直流电转换为交流电&#xff09…

创建 Code Interpreter Demo: 一次实践的探索

好消息,好消息,Code Interpreter可以测试使用了!!! 在这篇文章中,我们将探索如何创建一个 Code Interpreter Demo。提交一个2023年1-5月份的融资记录数据,让它来帮我们分析一下这些数据。 执行…

TCP 重传机制 滑动窗口 流量控制 拥塞控制 学习总结!

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 这篇博客主要记录 tcp 的基础知识的学习总结相关内容!备注:图片均来自作者:小林哥 tcp 的三大特性 tcp 大家都不陌生&#xff0c…

Python制作gif表情包生成工具,斗图再也不会输啦

在当前无表情包不会聊天的时代,怎么也不能输在表情包数量不足上啊,今天咱们就来制作一个 gif 生成工具,用来制作表情包也太好用啦 先来看看整体效果 技术交流 技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人…

如何解决PostgreSQL执行语句长时间卡着不动,不报错也不执行的问题?

1 问题现象 执行SQL语句,卡着不动,不成功也不执行,就像挂住了一样。 truncate table simple; 2 原因分析 一般来说,语句呈现卡着的状态,主要会是两种原因比较多, 原因1:SQL语句是一个耗时操…

Java8新特性——lambda表达式、函数式接口、方法引用、Stream API与Optional类

目录 一、lambda表达式 (一)lambda相关概念 (二)lambda示例 (三)lambda用法 1.语法格式一:无参,无返回值 2.语法格式二:有参数,无返回值 3.数据类型可以省略,因为可由编译器推断得出,称为”类型推断…

统计数据记录

分红20% 分红22% 分红25%

手把手教大家实现 npm 包,并发布 npm 仓库,搭建文档(二)

昨天写了第一篇文章,反响平平 一个 NPM 包,帮助数十万程序员提高数十倍效率,难道不开源出来?(一) 首先贴下我们的官网 【预览页】 https://kennana.github.io/toolkit-use/ 我们的推特 【toolkituse】 https://twitter.com/Toolkituse 我们的github 【toolkit-u…

实现一个周选择器组件

1、需求: 默认每个月的第一个周一为该月的第一周开始,规则如图所示 2、使用到的工具: vue2vant2momentjs 3、父组件: data中定义涉及到的参数 minDate: new Date(this.$moment().subtract(12,month)) maxDate: new Date(),…

OpenCV 入门教程:全局阈值处理

OpenCV 入门教程:全局阈值处理 导语一、全局阈值处理二、示例应用2.1 图像二值化2.2 图像去噪 总结 导语 全局阈值处理是图像处理中常用的技术之一,用于将图像转换为二值图像,从而提取感兴趣的目标区域。在 OpenCV 中,全局阈值处…

Mathtype公式编号,章节号修改

正常插入公式时,选择有编号没有任何问题,但是,当需要根据章节编号时,这个如何处理呢,这个时候需要 公式编号-章节-修改分隔符,然后会弹出一个对话框,这时可以修改章节开始序号。 此外&#xff…

【力扣周赛】第 353 场周赛

文章目录 Q1:6451. 找出最大的可达成数字(脑筋急转弯?)思路竞赛时代码 Q2:6899. 达到末尾下标所需的最大跳跃次数(DP)思路竞赛时代码 Q3:6912. 构造最长非递减子数组(DP&…

Openssh升级方法

文章目录 Openssh升级方法一.安装openssh模拟未升级版本二.查看当前的ssh服务版本 三.启动telnet、安装rzsz工具、创建普通账号,防止因为卸载openssh而导致无法登录主机四.卸载openssh的rpm安装包(备注:此处未卸载ssl安装包)&…

【WebGIS初学到入职】(15)入职一年的总结与分享

题外话 看看大纲可以怎么写,问问ChatGPT: ……算了,还是随便写写吧。 所以时间过得也是有够快的,这就一年了。 平淡 入职一年,已经看到好些位女同事结婚了(男同事一个没有)。领导和同事都挺…

汽车网站建设:开启汽车行业数字化转型的大门

随着科技的进步和互联网的普及,越来越多的汽车企业开始意识到一个强大的在线存在的重要性。汽车网站的兴起为汽车行业带来了新的机遇和好处。本文将简要介绍什么是汽车网站,探讨汽车网站的好处,并提供一些快速制作搭建汽车网站的方法。 汽车网…