Python+Selenium+Unittest 之Unittest3(TestSuite()和TextTestRunner())

news2024/11/26 4:30:38

目录

1:addTest()

2、addTests()

3:discover()


        上一篇说了Unittest的一个基本的执行顺序,那如果我们想要调整用例的执行先后顺序的话,可以用TestSuite()和TextTestRunner()了,可以这么理解,比如一个班级里有50个学生(50条用例),其中有10个学生获得了评优(10条需要执行),然后需要单独叫出来领奖,然后这10个学生领奖的时候需要按照一定顺序进行排队上台(进行用例的先后顺序排列),TestSunit()的作用就可以把这10个学生叫出来并且排好队,然后这会该上台了,这时候就需要搭配上TextTestRunner()来使用了,可以把TextTestRunner()当成老师,你们用TestSunite()排好队了,然后听TextTestRunner()指挥来按顺序上台(按之前排好的顺序进行运行)。

        下面重点说下怎么对学生进行排队(怎么添加需要执行的用例)。

1:addTest()

        添加需要执行用例时,可以使用addTest()的方式一个一个的去添加,具体用法在addTest()里写上类和对应用例即可(addTest(类(方法))  )。

import unittest       #导入unittest的框架
class Atmunit_case(unittest.TestCase):       #定义一个class类的名称,并且继承unittest的框架
    def setUp(self):
        print("----用例开始了-----")
    def test_111(self):        #只能以小写test开头,一个def就可以理解成一个测试用例,但是这里的命名必须是以test开头,这个会区分大小写,必须是全部小写的test
        print("用例1")    #用例内容
    def test_222(self):        #定义第二个测试用例,不是以test开头,这个不会被执行
        print("用例2")    #用例内容
    def ddd(self):       #写一个ddd的方法,看会不会运行
        print(11111)
    def tearDown(self):    #结束的执行
        print("-------执行结束了-----")

if __name__ == '__main__':     #运行unittest框架
    suite = unittest.TestSuite()    #把TestSuite实例化
    suite.addTest(Atmunit_case('test_222'))   #调整执行顺序,优先执行test_222用例,括号里需要填写类名(class后面的名字)和对应的函数名(def后面的名字)
    suite.addTest(Atmunit_case('test_111'))   #然后执行test_11用例
    suite.addTest(Atmunit_case('ddd'))    #写上ddd看会不会执行(结果是会运行的,但是这样不太符合unittest的规范,最好少出现这样的写法)
    runner = unittest.TextTestRunner()    #实例化TextTestRunner()
    runner.run(suite)       #执行上述用例

执行结果为:

----用例开始了-----
用例2
-------执行结束了-----
----用例开始了-----
用例1
-------执行结束了-----
----用例开始了-----
11111
-------执行结束了-----

执行截图:

2、addTests()

        下面说下addTests()的方法,用法和addTest()没啥太大区别,这个可以把需要执行的用例提前定义下,test = (类(方法1),类(方法2),类(方法3)),然后把test传到addTests()里即可。

import unittest       #导入unittest的框架
class Atmunit_case(unittest.TestCase):       #定义一个class类的名称,并且继承unittest的框架
    def setUp(self):
        print("----用例开始了-----")
    def test_111(self):        #只能以小写test开头,一个def就可以理解成一个测试用例,但是这里的命名必须是以test开头,这个会区分大小写,必须是全部小写的test
        print("用例1")    #用例内容
    def test_222(self):        #定义第二个测试用例,不是以test开头,这个不会被执行
        print("用例2")    #用例内容
    def ddd(self):       #写一个ddd的方法,看会不会运行
        print(11111)
    def tearDown(self):    #结束的执行
        print("-------执行结束了-----")


if __name__ == '__main__':     #运行unittest框架
    suite = unittest.TestSuite()    #把TestSuite实例化
    testcase = (Atmunit_case('test_222'),Atmunit_case('test_111'),Atmunit_case('ddd'))    #把用例传入到testcase中
    suite.addTests(testcase)     #使用addTests()的方法批量添加用例
    runner = unittest.TextTestRunner()    #实例化TextTestRunner()
    runner.run(suite)       #执行上述用例

执行结果为:

----用例开始了-----
用例2
-------执行结束了-----
----用例开始了-----
用例1
-------执行结束了-----
----用例开始了-----
11111
-------执行结束了-----

执行截图;

3:discover()

        当有多个测试文件需要执行时,也可以选择discover()的方式,具体用法为:

unittest.defaultTestLoader.discover(start_dir='.',
                                    pattern="test_case*.py",
                                    top_level_dir=None)

#start_dir 表示要搜索的文件路径,通常设置为 .  表示为当前目录
  pattern  表示要搜索的文件的名称格式,*为通配符表示任意内容,这个的意思是以test_case开头然后中间有任意内容,最后以.py结尾的文件
  top_level_dir  表示是否为项目的顶层目录,用于去寻找相对的导入路径,一般默认即可,或者可以不写

        比如截图中的目录,我们有test_case_01、test_case_02、test_case_03、test11_case_04这几个目录,这几个里面分别对应不同的用例。

test_case_01.py里面的内容

import unittest       #导入unittest的框架
class test_case_01(unittest.TestCase):       #定义一个class类的名称,并且继承unittest的框架
    def test_101(self):        #定义test_101的测试方法
        print('test_case_101')
    def test_102(self):        #定义test_102的测试方法
        print('test_case_102')

test_case_02.py里面的内容:

import unittest       #导入unittest的框架
class test_case_02(unittest.TestCase):       #定义一个class类的名称,并且继承unittest的框架
    def test_201(self):        #定义test_201的测试方法
        print('test_case_201')
    def test_202(self):        #定义test_202的测试方法
        print('test_case_202')

test_case_03.py里面的内容:

import unittest       #导入unittest的框架
class test_case_03(unittest.TestCase):       #定义一个class类的名称,并且继承unittest的框架
    def test_301(self):         #定义test_301的测试方法
        print('test_case_301')
    def test_302(self):         #定义test_302的测试方法
        print('test_case_302')

test11_case_04.py里面的内容:

import unittest       #导入unittest的框架
class test11_case_04(unittest.TestCase):       #定义一个class类的名称,并且继承unittest的框架
    def test_401(self):         #定义test_401的测试方法
        print('test_case_401')
    def test_402(self):         #定义test_402的测试方法
        print('test_case_402')

testrunner.py里面的内容:

import unittest

#discover = unittest.defaultTestLoader.discover(start_dir='.',pattern="test_case*.py",top_level_dir=None)#设定需要运行的用例范围

discover = unittest.defaultTestLoader.discover(start_dir='.',pattern="test_case*.py")  #设定需要运行的用例范围
unittest.TextTestRunner().run(discover)  #运行测试用例

        只需要运行testrunner.py即可,他会去找符合的文件,并运行里面的测试用例(test_case开头的方法),因为按着上面的匹配方式来说,test11_case_04.py不符合匹配的条件,所以只运行了test_case_01、test_case_02、test_case_03三个文件里的用例。

运行结果为:

test_case_101
test_case_102
test_case_201
test_case_202
test_case_301
test_case_302

​    ​一般来说每个单独的功能写到一个独立的测试文件中,其命名开头最好都用test开头,这样使用discover()的方式运行运行时匹配的比较准确,discover()为最常用的​用例条件运行方式。


 如果大家在使用过程中遇到了问题,可以在文章下留言,或者关注公众号:刘阿童木的进化记录,进行留言

                   下图为公众号二维码,内容会同步发出,大家可以关注一起学习!

                                

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

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

相关文章

TRON x HTX DAO 2024 香港之夜:共建香港元宇宙金融自由港

4月9日,由波场TRON主办,HTX DAO协办的“TRON x HTX DAO 2024 香港之夜”主题活动在香港盛大举行。多位参与HTX DAO生态建设的项目方代表、委员会成员、知名KOL等出席并就HTX DAO发展及加密业态进行演讲。 活动现场,波场TRON创始人孙宇晨通过视…

WordPress LayerSlider插件SQL注入漏洞复现(CVE-2024-2879)

0x01 产品简介 WordPress插件LayerSlider是一款可视化网页内容编辑器、图形设计软件和数字视觉效果应用程序,全球活跃安装量超过 1,000,000 次。 0x02 漏洞概述 WordPress LayerSlider插件版本7.9.11 – 7.10.0中,由于对用户提供的参数转义不充分以及缺少wpdb::prepare(),…

使用Docker部署开源项目FreeGPT35来免费调用ChatGPT3.5 API

Vercel部署FreeGPT35有严重限制,玩玩就好,真用还是得docker。 限制原因: Vercel的流式响应并不是一开始写流,客户端就能立刻收到响应流,而是先写到一个缓冲区,当流关闭才一股脑的流式响应回来(不是实时流) 因此导致: …

代码随想录Day31:贪心算法Part1

贪心算法的理论基础 主要的思路就是通过想局部最优解然后看能不能推导出全局最优,但是贪心算法没有统一的套路,每一个问题的贪心思路都可以非常不一样 Leetcode 455. 分发饼干 讲解前: 这时第一道贪心算法的题目,所以很简单&am…

Open CASCADE学习|放样建模

在CAD软件中,Loft(放样)功能则是用于创建三维实体或曲面的重要工具。通过选取两个或多个横截面,并沿这些横截面进行放样,可以生成复杂的三维模型。在CAD放样功能的操作中,用户可以选择不同的选项来定制放样…

【新手指南】创建简单搜索引擎优化报告

搜索引擎优化(SEO)是一项长期投资,需要持续监控,以确保产生您所期望的结果。这就是生成搜索引擎优化报告的重要性所在–这份报告会告诉你哪些有效,哪些无效,哪些需要改进。 如果你从未创建过搜索引擎优化报…

C语言 文件函数

目录 1. 文件的打开和关闭 2. 文件的顺序读写 2.1 顺序读写函数介绍 2.2读文件(读文件只能读一次) 2.3写文件 3. 文件的随机读写 3.1 fseek 3.2 ftell 3.3 rewind 4.文件读取结束的判定 4.1 被错误使误的 feof 我对读写的理解:(从…

SpringBoot 集成H2数据库,启动执行sql, 中文乱码

目录 H2数据库介绍 SpringBoot版本:SpringBoot 2.1.12.RELEASE 快速集成H2,maven依赖 快速集成H2,数据源及关键参数配置 spring.datasource.schema参数(建表SQL脚本) spring.datasource.data参数(更新、…

【鹤城杯 2021】 CRYPTO刷题

easy_crypto 附件easy_crypto.txt,内容是社会核心主义观 公正公正公正诚信文明公正民主公正法治法治诚信民主自由敬业公正友善公正平等平等法治民主平等平等和谐敬业自由诚信平等和谐平等公正法治法治平等平等爱国和谐公正平等敬业公正敬业自由敬业平等自由法治和…

联想电脑VMware虚拟机VT开启虚拟化

以联想电脑为例。 关机重启, 有的电脑是按F2, 有的是按fnF2 进入BIOS,左右键,选择Configuration, 再上下键选择 Intel Virtual Technology 按回车键,再按上下键选择 Enable ,回车确认。 按fn…

【VScode】同时编辑多处

【VScode】同时编辑多处 1. 多光标自定义批量编辑2. 选择多个,同时操作(批量选中局部匹配项)3. 取消选择4. 在不移动光标的情况下滚动屏幕5. 批量选中全局匹配项6.重点6.1 通过上下键选择多行6.2 同时选中所有行的末尾6.3 选中多列另一种方式6.4 通过正则的方式配置…

dockerhub右键快速搜索脚本

Chrome 浏览器扩展的后台脚本,用于创建右键菜单项,并根据用户的操作在新的标签页中打开 Docker Hub 网站或者进行搜索。 // 创建右键菜单项,用于打开 Docker Hub 网站 chrome.contextMenus.create({id: search-home, // 菜单项的唯一标识符t…

移除元素Java实现

题意 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 额外空间 并 原地 修改数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元…

Netty实现udp服务器

1、TCP与UDP通信协议 网络传输层协议有两种,一种是TCP,另外一种是UDP。 TCP是一种面向连接的协议,提供可靠的数据传输。TCP通过三次握手建立连接,并通过确认和重传机制,保证数据的完整性和可靠性。TCP适用于对数据准…

红豆Cat 1开源|项目二: 从0-1设计一款MQTT版本DTU(支持GNSS)产品的软硬件全过程

MQTT版DTU(GNSS)项目概述 DTU 通常指的是数据传输单元,它是一种用于将现场设备的数据通过无线或有线方式传输到远程控制中心的设备。DTU 可以实现设备与控制中心之间的数据通信,以便实时监测和控制设备的运行状态。 产品定义描述…

SpringBoot内容协商快速入门Demo

1.什么内容协商 简单说就是服务提供方根据客户端所支持的格式来返回对应的报文,在 Spring 中,REST API 基本上都是以 json 格式进行返回,而如果需要一个接口即支持 json,又支持其他格式,开发和维护多套代码显然是不合理…

面对DDOS攻击,有哪些解决办法

随着互联网带宽的持续增长以及DDOS黑客技术的发展,DDOS拒绝服务攻击的实施变得愈发容易。商业竞争、打击报复、网络敲诈等多种因素,各行各业的用户都曾受到DDOS攻击的威胁。 一旦遭受到DDOS攻击,随之而来的就是业务宕机,用户无法…

C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组

本文介绍基于C语言GDAL库,批量读取大量栅格遥感影像文件,并生成各像元数值的时间序列数组的方法。 首先,我们来明确一下本文所需实现的需求。现在有一个文件夹,其中包含了很多不同格式的文件,如下图所示。 其中&#x…

机器学习-08-关联规则和协同过滤

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中关联规则和协同过滤。 参考 机器学习(三):Apriori算法(算法精讲) Apriori 算法 理论 重点 MovieLens:一个常用的电影推荐系统领域的数据集 2…