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文件的内容是字典,字典的键名将会作为测试用例名的后缀,字典的值将会作为测试数据,如果这样的话,如果键名字 ...
随机推荐
- 初识Redis,看这一篇就够了
环境的搭建和安装网上有很多教程,在这里就不再重复了. 1. Redis是什么? Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写. ...
- HDU 3068 最长回文 (Manacher最长回文串)
Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输 ...
- EMC networker nmm can restore and recover sqlserver as different name to different location
EMC networker nmm can restore and recover sqlserver as different name to different location That is ...
- Iptables netstat 防御简单dos攻击
DoS攻击或者DDoS攻击是试图让机器或者网络资源不可用的攻击.这种攻击的攻击目标网站或者服务通常是托管在高防服务器比如银行,信用卡支付网管,甚至根域名服务器,DOS攻击的实施通常迫使目标重启计算机或 ...
- Cacti 安装插件
Cacti本身可以以图形化界面显示出流量状态,cacti也可以安装插件,通过插件,cacti的功能被进一步强大:可以监控服务器状态:发送邮件通知:短信通知等. 0.88之 ...
- Kvm 简介 安装 使用 桥接网络
KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor: 它由 ...
- 向C++之父Bjarne Stroustrup致敬
2013-04-25 21:30 (分类:社会人生) 非常好的文章 C ++ 的 背 影 ——C++之父Bjarne Strou ...
- 记录KVM虚拟机常用操作管理命令
环境说明 centos7中的KVM NAT方式是kvm安装后的默认方式.它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机. 检查当前的网络设置 # virsh net-li ...
- 在线使用iconfont字体图标
登录https://www.iconfont.cn 把需要的图标加入购物车,然后加入项目 打开我的项目,生成代码 有3中方式使用图标 unicode和font class本质都是使用字体,好处在于兼容 ...
- ES6学习笔记(二):教你玩转类的继承和类的对象
继承 程序中的继承: 子类可以继承父类的一些属性和方法 class Father { //父类 constructor () { } money () { console.log(100) } } c ...