《爆肝整理》保姆级系列教程python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)

news2024/12/26 0:58:38

简介

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

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

一线大厂测试开发讲解的一整套unittest自动化测试框架,全程干货,详细讲解_哔哩哔哩_bilibili一线大厂测试开发讲解的一整套unittest自动化测试框架,全程干货,详细讲解共计13条视频,包括:unittest之框架详解、unittest之单元测试框架对比、unittest之单元测试框架的租用等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV1Ss4y1b7zA/?spm_id_from=333.999.0.0

实例代码

参考代码

 1 # coding=utf-8
 2 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 #2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-4-23
 7 @author: 000
 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: 000
 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: 000
 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: 000
 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()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码。

总结:在测试行业摸爬滚打也有十几年了,在学习的途中也是收藏了很多的学习资源,下面是软件测试到测试开发全职业生涯全套学习资料

【需要的可以点击下方官方推广小卡片扫码备注000免费领取】

 

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

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

相关文章

2023前端二面手写面试题总结

创建10个标签&#xff0c;点击的时候弹出来对应的序号 var a for(let i0;i<10;i){adocument.createElement(a)a.innerHTMLi<br>a.addEventListener(click,function(e){console.log(this) //this为当前点击的<a>e.preventDefault() //如果调用这个方法&#x…

Nordic nRF芯片FDS模块学习

FDS系统学习 文章目录FDS系统学习一、ROM&#xff0c;RAM&#xff0c;FLASH作用二、ROM,RAM和FLASH在单片中的运作原理三、Flash访问模块FDS用法1. FDS在sdk_config.h中的配置2. fds_register()注册3. fds_record_write()写记录4. fds_record_find()查找5. fds_record_open()读…

PWM实验

目录 一、pwm与RGB LCD 二、硬件原理 1、I.MX6U PWM 频率和占空比 2、原理图与数据手册 3、寄存器 PWM1_PWMCR PWM1_PWMIR​编辑 PWM1_PWMSR​编辑 PWM1_PWMPR​编辑 PWM1_PWMSAR​编辑 三、代码编写 1、编写bsp_backlight.h 2、编写bsp_backlight.c 一、pwm与RGB …

物联网平台源码 物联网源码 springmvc+Mysql+Html

IOT智慧物联网大数据平台源码 物联网平台是一套存在于云端的的软件&#xff0c;提供了一种支持将物联网系统中的设备层、网络层和应用层组织在一起的方案模板&#xff0c;物联网平台现已成为物联网生态系统中最重要的组成部分。 一般来讲&#xff0c;完整的物联网平台主要由以…

Linux C/C++或者嵌入式开发到底有没有35岁危机?

一个读者问了一个问题&#xff1a; 我现在25岁&#xff0c;双非一本本科。在深圳上班&#xff0c;做嵌入式开发&#xff0c;打算走Linux C/C开发&#xff0c;工资目前一般。读了前辈写的很多博客之后&#xff0c;觉得很棒。我现在有一些疑问。 1.最近互联网裁员很厉害嘛&#x…

【selenium自动化测试】如何定位页面元素,及对页面元素的操作方法

selenium元素定位 ​selenium定位元素的方式有8种。 fild_element(by,value)&#xff1a;by表示使用的定位方式&#xff0c;定位方式可以参见By类。value表示值&#xff0c;例如&#xff1a;根据id定位 By.ID&#xff0c;valueid属性的值。该方法返回元素对象&#xff0c;返…

【Linux学习笔记】3.Linux 忘记密码解决方法及远程登录

前言 本章介绍Linux的忘记密码解决方法及远程登录。 Linux 忘记密码解决方法 很多朋友经常会忘记Linux系统的root密码&#xff0c;linux系统忘记root密码的情况该怎么办呢&#xff1f;重新安装系统吗&#xff1f;当然不用&#xff01;进入单用户模式更改一下root密码即可。 …

【Leetcode 剑指Offer】第 4 天 查找算法(简单)

查找剑指 Offer 03. 数组中重复的数字剑指 Offer 53 - I. 在排序数组中查找数字 I二分法题目链接剑指 Offer 03. 数组中重复的数字 题&#xff1a;在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数…

一个列表引发的思考(简单版)

最近老板让我按照设计图写一个页面&#xff0c;不嫌丢人的说这是我第一次写页面&#xff0c;哈哈哈。 然后设计图里有一个这样的需求&#xff0c;感觉挺有意思的。 为什么感觉有意思呢&#xff0c;因为这个列表它前面是图片&#xff0c;然后单行和双行的不一样。&#xff08;请…

电子技术——稳定性问题

电子技术——稳定性问题 本节我们讨论稳定性问题。 反馈放大器的传递函数 在考虑频率响应的情况下&#xff0c;开环增益 AAA 通常是关于复频率 sss 的函数 。那么 A(s)A(s)A(s) 就称为 开环传递函数 。同时&#xff0c; β\betaβ 也可能是一个关于复频率 sss 的函数。我们称…

Element表单嵌套树形表格的校验问题

如图&#xff0c;第一次遇到属性表格的校验问题 曾经写过单纯的表格校验是这样的 <el-form ref"forms" :model"forms"><el-table ref"multipleTable" :data"forms.tableData" tooltip-effect"dark" border style&…

关于iframe一些通讯的记录(可适用工作流审批)

一.知识点(1).我们可以通过postMessage(发送方)和onmessage(接收方)这两个HTML5的方法, 来解决跨页面通信问题&#xff0c;或者通过iframe嵌套的不同页面之间的通信a.父页面代码如下<div v-if"src" class"iframe"><iframeref"iframe"id…

SpringBoot集成Redis实现分布式会话

在单体应用的时代&#xff0c;Session 会话直接保存在服务器中&#xff0c;实现非常简单&#xff0c;但是随着微服务的流行&#xff0c;现代应用架构基本都是分布式架构&#xff0c;请求随机的分配到后端的多个应用中&#xff0c;此时session就需要共享&#xff0c;而存储在red…

【运动控制】CNC三轴小线段路径规划

CNC三轴小线段路径规划 文章目录CNC三轴小线段路径规划一、项目说明二、具体实现1、速度规划2、小线段插补3、运动学逆解刀轴插补点4、差分处理得到实际的速度和加速度5、加速度滑动平均6、实现的效果如图所示三、Reference写在前面&#xff0c;本文是作为一个练手小项目的总结…

2023年阿里云ECS服务器S6/C6/G6/N4/R6/sn2ne/sn1ne/se1ne处理器CPU性能详解

阿里云ECS服务器S6/C6/G6/N4/R6/sn2ne/sn1ne/se1ne处理器CPU性能怎么样&#xff1f;阿里云服务器优惠活动机型有云服务器S6、计算型C6、通用型G6、内存型R6、云服务器N4、云服务器sn2ne、云服务器sn1ne、云服务器se1ne处理器CPU性能详解及使用场景说明。 1、阿里云服务器活动机…

Ollydbg简明使用指南

OllyDebug&#xff0c;简称OD&#xff0c;一种反汇编软件&#xff0c;动态追踪工具&#xff0c;将IDA与SoftICE结合起来的思想&#xff0c;Ring 3 级的调试器。OllyDebug的使用界面是可视化操作。 英文版 Read this for quick start. Consult help file for details and more …

Hive窗口函数

概述 窗口函数&#xff08;window functions&#xff09;也叫开窗函数、OLAP函数。 如果函数具有over子句&#xff0c;则它是窗口函数 窗口函数可以简单地解释为类似于聚合函数的计算函数&#xff0c;但是通过group by 子句组合的 常规聚合会隐藏正在聚合的各个…

task与function

task和function主要是有助于代码的可重用性&#xff0c;都可以在module-endmodule之外声明。 1.function 1.1.function逻辑的综合 function&#xff1a;一个只有1个wire型输出值、全是组合逻辑的函数&#xff0c;且函数名即输出信号名&#xff0c;小括号中按顺序例化输入信号。…

C语言中#include<...>和#include“...“的区别

C语言文章更新目录 C语言学习资源汇总&#xff0c;史上最全面总结&#xff0c;没有之一 C/C学习资源&#xff08;百度云盘链接&#xff09; 计算机二级资料&#xff08;过级专用&#xff09; C语言学习路线&#xff08;从入门到实战&#xff09; 编写C语言程序的7个步骤和编程…

深入浅出C++ ——哈希的应用

文章目录一、位图1. 位图的概念2. STL中的位图3. 位图的特点4. 位图的应用5. 位图的实现6. 位图的使用二、布隆过滤器1. 布隆过滤器提出2. 布隆过滤器概念3. 布隆过滤器的设计思路4. 布隆过滤器的插入5. 布隆过滤器的查找6. 布隆过滤器删除7. 布隆过滤器的优缺点8. 布隆过滤器的…