Selenium实战(四)——unittest单元测试3(测试用例的执行顺序)
一、测试用例的执行顺序
层级:多个测试目录 > 多个测试文件 > 多个测试类 > 多个测试方法(测试用例)。在这里以一个测试执行顺序的脚本为例test_order.py
import unittest
class TestBdd(unittest.TestCase):
def setUp(self):
print("test TestBdd")
def test_ccc(self):
print("test ccc")
def test_aaa(self):
print("test aaa")
class TestAdd(unittest.TestCase):
def setUp(self):
print("test TestAdd")
def test_bbb(self):
print("test bbb")
if __name__ == '__main__':
unittest.main()

无论执行多少次,结果都是一样。因为unittest默认分局ASCII码的顺序加载测试用例(数字与字母的顺序为0~9,A~Z,a~z),所以TestAdd类会优先于TestBdd类被执行,test_aaa()方法会优先于test_ccc()方法被执行,也就是说,它并不是按照测试用例的顺序从上到下执行的。
那么要想不被命名限制,自己指定执行顺序,就要用到测试套件TestSuit类,通过addTest()方法按照一定的顺序来加载测试用例。修改以上测试用例如下:
if __name__ == '__main__':
# 构造测试集
suite = unittest.TestSuite()
suite.addTest(TestBdd("test_aaa")) suite.addTest(TestAdd("test_bbb"))
suite.addTest(TestBdd("test_ccc")) # 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
执行结果如下:

不过当测试用例非常多时,不推荐用这种方法创建测试套件,最好的办法是通过命名控制执行顺序。如果测试用例在设计时不产生相互依赖,那么测试用例的执行顺序就没那么重复了。
Tips: 如果使用discover()方法要执行某测试文件夹下子目录中的测试文件,可在每个子目录下放一个__init__.py文件(作用是将一个目录标记成一个标准的Python模块)
二、跳过测试和预期失败
在运行测试时,有时需要直接跳过某些测试用例,或者当测试用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败。unittest提供了实现这些需求的装饰器。
unittest.skip(reason)

无条件地跳过装饰的测试,需要说明跳过测试的原因。
unittest.skipIf(condition, reason)

如果条件为真,则跳过装饰的测试
unittest.skipUnless(condition,reason)

当条件为真时,执行装饰的测试
unittest.exceptedFailure()

不管执行结果是否失败,都将测试标记为失败。下面是测试用例:test_skip.py文件:
import unittest
class MyTest(unittest.TestCase):
@unittest.skip("直接跳过测试")
def test_skip(self):
print("test aaa")
@unittest.skipIf(3 > 2, "当条件为真时跳过测试")
def test_skip_if(self):
print("test bbb")
@unittest.skipUnless(3 > 2, "当条件为真时执行测试")
def test_skip_unless(self):
print('test ccc')
@unittest.expectedFailure
def test_expected_failure(self):
self.assertEqual(2, 3)
if __name__ == '__main__':
unittest.main()
执行结果如下:

当然,这些方法同样适用于测试类,只需将它们针对测试类装饰即可。
import unittest
@unittest.skip("直接跳过,不测试该类")
class MyTest(unittest.TestCase):
#……
三、Fixture
可以将测试套件比作夹心饼干,setUp/tearDown是两片饼干,测试用例是中间的奶油。test_fixture.py文件:
import unittest def setUpModule():
print("test module start >>>>>>>>>>>>>") def tearDownModule():
print("test module end >>>>>>>>>>>>>>>") class MyTest(unittest.TestCase): @classmethod
def setUpClass(self):
print("test class start ============>") @classmethod
def tearDownClass(self):
print("test class end ==============>") def setUp(self):
print("test case start ------------->") def tearDown(self):
print("test case end --------------->") def test_case1(self):
print("test case1") def test_case2(self):
print("test case2") if __name__ == '__main__':
unittest.main()

需要注意的是,setUpClass/tearDownClass为类方法,需要通过@classmethod进行装饰。另外,方法的参数为cls。其实,cls与self没什么本质区别,都指标是方法的第一个参数。
Selenium实战(四)——unittest单元测试3(测试用例的执行顺序)的更多相关文章
- unittest测试用例的执行顺序
unittest的测试顺序为:有几个测试用例,测试固件就会执行多少次. 例如:只有一个测试用例时: setup--testcase1--teardown import unittest class F ...
- mysql第四篇--SQL逻辑查询语句执行顺序
mysql第四篇--SQL逻辑查询语句执行顺序 一.SQL语句定义顺序 SELECT DISTINCT <select_list> FROM <left_table> < ...
- Selenium(十七):unittest单元测试框架(三) 脚本分析、编写Web用例
1. 带unittest的脚本分析 也许你现在心里还有疑问,unittest框架与我们前面所编写的Web自动化测试之间有什么必然联系吗?当然有,既然unittest可以组织.运行测试用例,那么为什么不 ...
- SpringBoot单元测试中的测试方法执行顺序
一.忽略方法@ignore 二.执行顺序@FixMethodOrder(MethodSorter.JVM) 我们在执行JUnit测试用例时,有时需要按照定义顺序执行单元测试方法,比如如在测试数据库相关 ...
- python+unittest 控制用例的执行顺序
unittest的main()方法执行用例的顺序是按照测试类.测试方法的名字的ASCII顺序来执行测试方法.所以可能执行的顺序和你想要的顺序不一样,可能通过下面两种方法修改执行顺序 1. 通过Test ...
- unittest中setUp与setUpClass执行顺序
最基础的概念 1.setUP(self)看下面的执行顺序 import unittest class TestGo(unittest.TestCase): def setUp(self): print ...
- pytest-调整测试用例的执行顺序
场景:未考虑按自然顺序执行时,或想变更执行顺序,比如增加 数据的用例要先执行,再执行删除的用例.测试用例默认是按名 称顺序执行的. • 解决: • 安装:pip install pytest-orde ...
- python unittest控制用例的执行顺序
为什么要进行顺序控制呢?使用过testng的同学就知道,它相对于junit来说有更强大的功能,其中的一个功能就是依赖测试.什么是依赖测试呢?简单的说一下就是,A方法运行时,其中有个变量的取值是B方法的 ...
- ddt读取json文件测试用例的执行顺序
一. 源码的说明 在源码中,ddt的file_data函数下有这样一段话 意思是说,如果json文件的内容是字典,字典的键名将会作为测试用例名的后缀,字典的值将会作为测试数据,如果这样的话,如果键名字 ...
随机推荐
- Owncloud - Can't write into config directory!
Owncloud - Can't write into config directory! Can't write into config directory! This can usually be ...
- 练习2-13 求N分之一序列前N项和 (15 分)
练习2-13 求N分之一序列前N项和 (15 分) 输入在一行中给出一个正整数N. 输出格式: 在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位.题目保证计算结果不超过双精度范 ...
- 非常NB的一款快捷启动软件--Merry
Merry 被设计为了能将日常重复性操作简化为一个快捷键或者命令.Merry 采用完全开放的体系, 可以使用 Lua 或者外部程序来扩展 Merry 的功能. 另附一个自己扩展的LUA脚本: --启动 ...
- C语言中typedef用法
C语言中typedef用法 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等) ...
- Comet OJ Contest #0 解方程(暴力)
题意: 给定自然数n,求满足$\displaystyle \sqrt{x-\sqrt{n}}=\sqrt{z}-\sqrt{y}$的x,y,z,输出解的个数以及所有解 xyz的和 n<=1e9, ...
- 转:JSON与Map互转
JSON字符串与Map互转 //一.map转为json字符串 public static String map2jsonstr(Map<String,?> map){ return J ...
- centos7 安装 iRedmail 后 给nginx添加虚拟主机
iRedmail安装参考官方文档和 https://ywnz.com/linuxyffq/4563.html 准备工作 更新操作系统 yum update -y 安装必要组件 yum install ...
- vue学习(四)登陆、注册、首页模板页区分
按照上面文章配置完毕后,会发现有个问题,我登陆页面.注册页面是不需要视图页的. 开始配置路由 重新配置main.js 引入 import App from './App' //引入vue组件 更改启动 ...
- 软件bug描述(android)
1.bug主题:主要操作+bug主题 主题要简单明了,即开发一看主题就知道该问题. 2.描述: 作用:便于开发重现和定位缺陷的 2.1前置条件 2.2操作步骤 2.3预期结果 2.4实际结果 2.5备 ...
- Starting MySQL... ERROR! The server quit without updating PID file (/home/mysql-5.6.43/data/localhost.localdomain.pid).
启动MySQL出现如下错误 May :: localhost mysqld: Starting MySQL... ERROR! The server quit without updating PID ...