python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)
简介
大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的。对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行。虽然或许通过代码实现了,也是稀里糊涂的一知半解,这样还好,好歹自己鼓
捣出了,但是时间和效率并不是很高,下次遇到还是老样子。那么本篇通过最简单案例来给给为小伙伴详细讲解、演示一下 unittest 执行顺序。
实例代码

参考代码
# coding=utf-
#.先设置编码,utf-8可支持中英文,如上,一般放在第一行 #.注释:包括记录创建时间,创建人,项目名称。
'''
Created on --
@author: 北京-宏哥
Project:学习和使用unittest框架编写测试用例执行顺序
'''
#.导入unittest模块
import unittest
#.执行顺序和运行测试
import unittest class TestLogin(unittest.TestCase): def test_login_blog(self):
"""登录博客园 :return:
""" def test_add_essay(self):
""" 添加随笔 :return:
""" def test_release_essay(self):
""" 发布随笔 :return:
""" def test_quit_blog(self):
"""退出博客园 :return:
"""
if __name__ == "__main__()":
unittest.main()
这是一个标准的使用unittest进行测试的例子,写完后心里美滋滋,嗯,就按照一贯思路代码会按照这个顺序测就可以了。结果一运行。就傻眼了


这时候自己心里犯嘀咕,这是什么鬼,怎么回事呢。执行的顺序乱了。第一个执行的测试用例并不是登录博客园,而是添加随笔,此时用户还没登录博客园,进行添加随笔的话会直接报错,导致用例失败。
到这里有些小伙伴可能会说,为什么要让测试用例之间有所依赖呢?
的确,如果完全没依赖,测试用例的执行顺序是不需要关注的。但是这样对于用例的设计和实现,要求就高了许多。而对博客园来说,一个系统内的操作,是有很大的关联性的。以添加随笔为例,随笔内的每个操作都有一个前提,你需要
登录博客园才能添加随笔。所以要实现用例之间的完全解耦,需要每个用例开始之前,检测用户的登录状态。
如果可以控制测试用例的执行顺序,按照功能流程一遍走下来,节省的代码量是非常可观的,阅读测试用例也会清晰明了许多。
如何控制unittest用例执行的顺序呢?
1、带大家先看看源码,unittest是怎么样对用例进行排序的。在loader.py的loadTestsFromTestCase方法里边,调用了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方法,按顺序加载测试用例

参考代码
# coding=utf-
#.先设置编码,utf-8可支持中英文,如上,一般放在第一行 #.注释:包括记录创建时间,创建人,项目名称。
'''
Created on --
@author: 北京-宏哥
Project:学习和使用unittest框架编写测试用例执行顺序
'''
#.导入unittest模块
import unittest
#.执行顺序和运行测试
import unittest class TestLogin(unittest.TestCase): def setUp(self):
pass
def test_login_blog(self):
"""登录博客园 :return:
"""
print("登录博客园")
def test_add_essay(self):
""" 添加随笔 :return:
"""
print("添加随笔")
def test_release_essay(self):
""" 发布随笔 :return:
"""
print("发布随笔")
def test_quit_blog(self):
"""退出博客园 :return:
"""
print("退出博客园") def tearDown(self):
pass
if __name__ == '__main__':
# 启动单元测试
# unittest.main() # 获取TestSuite的实例对象
suite = unittest.TestSuite() # 将测试用例添加到测试容器中
suite.addTest(TestLogin('test_login_blog'))
suite.addTest(TestLogin('test_add_essay'))
suite.addTest(TestLogin('test_release_essay'))
suite.addTest(TestLogin('test_quit_blog')) # 创建TextTestRunner类的实例对象
runner = unittest.TextTestRunner()
runner.run(suite)
#unittest.TextTestRunner(verbosity=).run(suite)
方式2,通过修改函数名的方式

参考代码
# coding=utf-
#.先设置编码,utf-8可支持中英文,如上,一般放在第一行 #.注释:包括记录创建时间,创建人,项目名称。
'''
Created on --
@author: 北京-宏哥
Project:学习和使用unittest框架编写测试用例执行顺序
'''
#.导入unittest模块
import unittest
#.执行顺序和运行测试
import unittest class TestLogin(unittest.TestCase): def setUp(self):
pass
def test_1_login_blog(self):
"""登录博客园 :return:
"""
print("登录博客园")
def test_2_add_essay(self):
""" 添加随笔 :return:
"""
print("添加随笔")
def test_3_release_essay(self):
""" 发布随笔 :return:
"""
print("发布随笔")
def test_4_quit_blog(self):
"""退出博客园 :return:
"""
print("退出博客园") def tearDown(self):
pass
if __name__ == '__main__':
# 启动单元测试
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 开头的用例
参考代码
# coding=utf-
#.先设置编码,utf-8可支持中英文,如上,一般放在第一行 #.注释:包括记录创建时间,创建人,项目名称。
'''
Created on --
@author: 北京-宏哥
Project:学习和使用unittest框架编写测试用例思路
'''
#.导入unittest模块
import unittest #.执行顺序和运行测试
import time
class Test(unittest.TestCase):
def setUp(self):
print ("start!")
def tearDown(self):
time.sleep()
print ("end!")
def test01(self):
print ("执行测试用例 01")
def test03(self):
print ("执行测试用例 03")
def test02(self):
print ("执行测试用例 02")
def addtest(self):
print ("add 方法")
if __name__ == "__main__":
unittest.main()
小结
1、这个执行顺序,看似简单,实则不简单,只有掌握最简单的才可以应付最复杂的。
2、setUp()和tearDown()方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码。
python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)的更多相关文章
- python接口自动化(十八)--重定向(Location)(详解)
简介 在实际工作中,有些接口请求完以后会重定向到别的url,而你却需要重定向前的url.URL主要是针对虚拟空间而言,因为不是自己独立管理的服务器,所以无法正常进行常规的操作.但是自己又不希望通过主域 ...
- python接口自动化(十二)--https请求(SSL)(详解)
简介 本来最新的requests库V2.13.0是支持https请求的,但是一般写脚本时候,我们会用抓包工具fiddler,这时候会 报:requests.exceptions.SSLError: [ ...
- python接口自动化(十一)--发送post【data】(详解)
简介 前面登录博客园的是传 json 参数,由于其登录机制的改变没办法演示,然而在工作中有些登录不是传 json 的,如 jenkins 的登录,这里小编就以jenkins 登录为案例,传 data ...
- python接口自动化(十)--post请求四种传送正文方式(详解)
简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...
- 【pytest官方文档】解读fixtures - 11. fixture的执行顺序,3要素详解(长文预警)
当pytest要执行一个测试函数,这个测试函数还请求了fixture函数,那么这时候pytest就要先确定fixture的执行顺序了. 影响因素有三: scope,就是fixture函数的作用范围,比 ...
- python接口自动化(二十八)--html测试 报告——下(详解)
简介 五一小长假已经结束了,想必大家都吃饱喝足玩好了,那就继续学习吧.一天不学习,自己知道:两天不学习,对手知道:三天不学习,大家知道:一周不学习,智商输给猪.好了开个玩笑都逗大家一乐,但是想想还是有 ...
- python接口自动化(十六)--参数关联接口后传(详解)
简介 大家对前边的自动化新建任务之后,接着对这个新建任务操作了解之后,希望带小伙伴进一步巩固胜利的果实,夯实基础.因此再在沙场实例演练一下博客园的相关接口.我们用自动化发随笔之后,要想接着对这篇随笔操 ...
- python接口自动化(十五)--参数关联接口(详解)
简介 我们用自动化新建任务之后,要想接着对这个新建任务操作,那就需要用参数关联了,新建任务之后会有一个任务的Jenkins-Crumb,获取到这个Jenkins-Crumb,就可以通过传这个任务Jen ...
- python接口自动化(十四)--session关联接口(详解)
简介 上一篇cookie绕过验证码模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等等,这时候如何保持会话呢?这里我以jenkins平台为例,给小伙伴们在沙场演练一下. se ...
随机推荐
- unity零基础开始学习做游戏(五)看看你的完成度,进度条了解一下?
-------小基原创,转载请给我一个面子 上回书说道,英雄和魔王都做完了,子弹也能发射了,就是不知道啥时候能干死魔王.那小基得做个血条来展示一下,他离死不远了(•౪• ) 其实血条也可以看作是进度条 ...
- JDK安装:CentOS和Windows环境
Windows上JDK安装 1:下载jdk. 地址在 http://www.oracle.com/index.html >downloads>se>Ja ...
- ASP.NET中直接用C# 动态修改CSS样式
ASP.NET中直接用C# 动态修改CSS样式 wonsoft (wonsoft@163.com) 使用JavaScript控制CSS样式有点麻烦,还是觉得直接使用C#操作更方便快捷,本文通过两个B ...
- Laravel 框架 基础(一)
Laravel 框架 laravel 5.2 在 5.1 基础上继续改进和优化,添加了许多新的功能特性:多认证驱动支持.隐式模型绑定.简化 Eloquent 全局作用域.可选择的认证脚手架.中间件组. ...
- JavaScript (一、ECMAScript )
一.js简介和变量 1.JavaScript的概述组成和特点 a.JavaScript 是脚本语言,是世界上最流行的编程语言,这门语言可用于 HTML 和 web,更可广泛 用于服务器.PC.笔记本电 ...
- QT5:C++实现基于multimedia的音乐播放器(二)
今天接着上一篇来实现播放器的槽函数. 先来实现播放模式,槽函数如下: //播放模式 void Music::musicPlayPattern() { //z=++z%3; ) { //顺序播放 pla ...
- mock测试之powermock
由于公司框架依赖别的模块, 导致我们开发老是需要跟着他们的脚步, 所以我的上级领导提出这个方案说直接跳过他们,我们自己在本地测试,然后就找了它, 导入相关jar <dependency> ...
- PAT1011:World Cup Betting
1011. World Cup Betting (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Wit ...
- 快速失败(fail-fast)和安全失败(fail-safe)的区别
1.fail-fast和fail-safe比较 Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响.java.util包下面的所有的集合类都是快速失败的,而java.ut ...
- JAVA远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果.这个请求包括一个参数集和一个文本集,通常形成&qu ...