selenium——unittest框架
目录
- 一、unittest框架基本介绍
- 二、unittest框架解析
- 三、unittest框架使用方法
- 1.测试固件
- 2.测试套件
- 3.用例的执行顺序
- 4.忽略测试用例中的方法
- 5.unittest断言
- 6.HTML报告生成
一、unittest框架基本介绍
在进行selenium IDE脚本录制导出的脚本中,我们发现其中多了很多代码,这些代码正是unittest测试框架。unittest 是web界面的功能测试框架,白盒测试测试框架是Junit。unittest 单元测试提供了创建测试用例、测试套件以及批量执行的方案。unittest 在安装python 以后就直接自带了,调用import unittest 就可以使用。
二、unittest框架解析

1.test fixture(测试固件):存了类里面固定的方法,初始化和清理测试环境,比如创建临时的数据库,文件和目录等
2.test case:单元测试用例,TestCase 是编写单元测试用例最常用的类
3.test suite(测试套件):把测试方法放到容器里,单元测试用例的集合,TestSuite 是最常用的类
4.test runner:执行单元测试
5.test report:生成测试报告
三、unittest框架使用方法
1.测试固件
一个方法一个方法的去写。
setup()进行初始化
teardown() 进行清理
Self 代表实例
Class 继承父类
from selenium import webdriver
import unittest
import time
from selenium.common.exceptions import NoAlertPresentException
from selenium.webdriver.common.by import By#setup和teardown在每次运行test_程序之前和之后都会默认运行
class testCase1(unittest.TestCase):#初始化def setUp(self):self.driver = webdriver.Chrome()self.url = "http://www.baidu.com/"self.driver.get(self.url)time.sleep(3)self.driver.maximize_window()time.sleep(3)#关闭以及清理def tearDown(self):self.driver.quit()#自动默认运行前面加test_def test_baidu1(self):driver = self.driverdriver.find_element(By.ID, "kw").send_keys("星黛露")driver.find_element(By.ID, "su").click()time.sleep(3)#调用才使用def is_alert_exist(self):try:self.driver.switch_to.alertexcept NoAlertPresentException as e:return Falsereturn Trueif __name__ == "__main__ ":unittest.main(verbosity=0)
2.测试套件
测试套件:通俗来讲就是存放测试用例(测试方法)的一个容器。
(1)类里面一个方法一个方法添加
test001和test002都是文件,testCase1和testCase2是文件里的类可以称之为测试用例,test_baidu1和test_baidu2是类里的方法。
Addtest
import unittest
from src0303 import test001, test002#创建一个测试套件
def createsuite():suite=unittest.TestSuite()suite.addTest(test001.testCase1("test_baidu1"))suite.addTest(test002.testCase2("test_baidu1"))return suiteif __name__ == "__main__":suite = createsuite()runner = unittest.TextTestRunner(verbosity=2)runner.run(suite)
(2)一个类一个类的添加
makeSuite():只是添加文件里的类,类里的方法不用一个一个的添加。
import unittest
from src0303 import test001, test002def createsuite():suite=unittest.TestSuite()suite.addTest(unittest.makeSuite(test001.testCase1))suite.addTest(unittest.makeSuite(test001.testCase2))return suiteif __name__ == "__main__":suite = createsuite()runner = unittest.TextTestRunner(verbosity=1)runner.run(suite)
(3) 一个文件一个文件的测试
适用于文件非常多的时候,文件要是一定格式命名的。
discover()
#src202201文件夹,找到test00*.py开头的文件夹
import unittest
def createSuite():discover=unittest.defaultTestLoader.discover('../src202201',pattern='test00*.py',top_level_dir=None)if __name__=="__main__":suite = createsuite()runner = unittest.TextTestRunner(verbosity=1)runner.run(suite)
注:Verbosity=1或者2表示打印方法很详细,如下:

3.用例的执行顺序
unittest框架(文件名,类名,方法名-)默认加载测试用例的顺序是根据ASCII码的顺序,数字与字母的顺序为:0-9,A-Z,a-z。例如:Testadd比Testade优先执行。
4.忽略测试用例中的方法
适用于书写方法太多,但是只想执行少数测试用例的情况。在想忽略的方法前加标签@。
@unittest.skip("skipping")
5.unittest断言
(1)断言概念
断言是为了判断实际和预期结果是否一致。自动化的测试中, 对于每个单独的case来说,一个case的执行结果中, 必然会有期望结果与实际结果, 来判断该case是通过还是失败, 在unittest 的库中提供了大量的实用方法来检查预期值与实际值, 来验证case的结果, 一般来说, 检查条件大体分为等价性, 逻辑比较以及其他, 如果给定的断言通过, 测试会继续执行到下一行的代码, 如果断言失败, 对应的case测试会立即停止或者生成错误信息( 一般打印错误信息即可) ,但是不要影响其他的case执行。
(2)常用断言方法
| 断言方法 | 断言描述 |
|---|---|
| assertEqual(arg1, arg2, msg=None) | 验证arg1=arg2,不等则fail |
| assertNotEqual(arg1, arg2, msg=None) | 验证arg1 != arg2, 相等则fail |
| assertTrue(expr, msg=None) | 验证expr是true,如果为false,则fail |
| assertFalse(expr,msg=None) | 验证expr是false,如果为true,则fail |
| assertIs(arg1, arg2, msg=None) | 验证arg1、arg2是同一个对象,不是则fail |
| assertIsNot(arg1, arg2, msg=None) | 验证arg1、arg2不是同一个对象,是则fail |
| assertIsNone(expr, msg=None) | 验证expr是None,不是则fail |
| assertIsNotNone(expr, msg=None) | 验证expr不是None,是则fail |
| assertIn(arg1, arg2, msg=None) | 验证arg1是arg2的子串,不是则fail |
| assertIn(arg1, arg2, msg=None) | 验证arg1不是arg2的子串,是则fail |
| assertIsInstance(obj, cls, msg=None) | 验证obj是cls的实例,不是则fail |
| assertNotIsInstance(obj, cls,msg=None) | 验证obj不是cls的实例,是则fail |
| 以第一个断言举例: |
class testCase1(unittest.TestCase):#初始化def setUp(self):self.driver = webdriver.Chrome()self.url = "http://www.baidu.com/"self.driver.get(self.url)time.sleep(3)self.driver.maximize_window()time.sleep(3)#关闭以及清理def tearDown(self):self.driver.quit()#自动默认运行前面加test_def test_baidu1(self):driver = self.driverdriver.find_element(By.ID, "kw").send_keys("星黛露")driver.find_element(By.ID, "su").click()time.sleep(3)#判断title(星黛露的百度搜索)与"星黛露_百度搜索"是否相同,若不相同输出“not equal”并调用is_alert_exist(self)报异常,此处是相等的。self.assertEqual(driver.title,"星黛露_百度搜索",msg="not equal!")#调用才使用def is_alert_exist(self):try:self.driver.switch_to.alertexcept NoAlertPresentException as e:return Falsereturn Trueif __name__ == "__main__ ":unittest.main(verbosity=0)
6.HTML报告生成
将控制台结果整理成结果,涉及失败的原因和结果。将HTMLTestRunner.py放到安装python的lib文件夹里。
未完待更新…
相关文章:
selenium——unittest框架
目录 一、unittest框架基本介绍二、unittest框架解析三、unittest框架使用方法1.测试固件2.测试套件3.用例的执行顺序4.忽略测试用例中的方法5.unittest断言6.HTML报告生成 一、unittest框架基本介绍 在进行selenium IDE脚本录制导出的脚本中,我们发现其中多了很多…...
matlab频谱分析详解
频谱分析是一种用于分析信号频率特征的方法,常用于信号处理、音乐分析、谐波产生等领域。MATLAB是一种功能强大的数字信号处理软件,提供了许多用于频谱分析的函数和工具箱。 本文将介绍如何使用MATLAB进行频谱分析,包括信号预处理、选择合适…...
用layui写用户登录页面遇到的问题
用layui写用户登录页面遇到的问题 1.在layui-row下面的layui-col-md还是换行 原因:link标签和script标签中的type属性没写,导致应该是script或者这个css没有识别出来 解决办法:link标签里面加上type为text/css, script标签中加上type为 2…...
NMOS双向转换电路实测以及上升沿尖峰处理
NMOS双向转换电路实测以及上升沿尖峰处理 NMOS双向转换电路 🔧采用的是5V供电的STC8H单片机输出PWM波形,经过上面的电平转换电路测量低压端的波形。 ✨在做3.3V <>5V 电平转换电路方案验证时,输入5V PWM波形和输出波形的波形上升沿有尖…...
【数据结构】选择排序(详细)
选择排序 1. 直接选择排序2. 堆排序2.1 堆2.2 堆的实现(以大根堆为例)2.3 堆排序 3. 堆排序(topK问题) 1. 直接选择排序 思想 以排升序为例。以a[i]为最大值(或最小值),从a[i1]到a[n-1-i]比较选…...
什么是企业内容管理?
为什么出现企业内容管理? 在数字经济的宏观背景下,企业建立了各种应用系统以满足企业各业务的管理需求,这些系统每天都在产生大量的数据和信息资源,但在企业实践中存在很多数据或资源无法被应用系统获取、处理和共享。 比如发票…...
机器学习:分类、回归、决策树
分类:具有明确的类别 如:去银行借钱,会有借或者不借的两种类别 回归:不具有明确的类别和数值 如:去银行借钱,预测银行会借给我多少钱,如:1~100000之间的一个数值 不纯度࿱…...
java常见的异常,下一篇写如何正确处理异常
当我们编写Java程序时,经常会遇到各种异常情况。异常是指在程序执行过程中发生的一些错误或意外情况,它会打断程序的正常执行流程,并且需要被适当地处理。在Java中,异常被分为两种类型:可检查异常(Checked …...
C#开发的OpenRA游戏之网络协议打包和解包
C#开发的OpenRA游戏之网络协议打包和解包 OpenRA游戏里,由于这是一个网络游戏,那么与服务器通讯就缺少不了, 既然要通讯,那么就需要协议,有协议就需要对数据进行打包和解包, 这个过程其实就是序列化与反序列化的过程。 游戏里很多命令都需要发送给服务器,以便服务器同…...
K8S通过Ansible安装集群
K8S通过Ansible安装集群 K8S集群安装可参考https://gitee.com/open-hand/kubeadm-ha.git、https://github.com/easzlab/kubeasz.git 安装高可用集群 git clone https://gitee.com/open-hand/kubeadm-ha.git && cd kubeadm-ha升级内核,非必需,默认不升级&…...
ChatGPT辩证观点:“人才不是一个企业的核心竞争力,对人才的管理能力才是一个企业的核心竞争力”
一、问: “人才不是一个企业的核心竞争力,对人才的管理能力才是一个企业的核心竞争力”这句话的理解和误解,这句话有哪个中心论点转移和变化 二、ChatGPT答: 这句话的理解和误解: 理解:这句话的意思是说…...
windows11 永久关闭windows defender的方法
1、按键盘上的windows按键,再点【设置】选项。 2、点击左侧菜单的【隐私和安全性】,再点击列表的【Windows安全中心】选项。 3、点击界面的【病毒和威胁保护】设置项。 4、病毒保护的全部关闭 5、别人的图(正常是都开着的) 6、终极…...
继承的基本知识
概念 假设基于A类,创建了B类,那么称A为B的父类,B为A的子类 子类会继承父类的成员变量及成员函数,但是不能继承构造、析构、运算符重载 假设又基于B创建了C,那么称B为C的直接基类,A为C的间接基类 继承按…...
【Frida-实战】EA游戏平台的文件监控(PsExec.exe提权)
▒ 目录 ▒ 🛫 问题描述环境 1️⃣ 代码编写开源代码搜索自己撸代码procexp确定句柄对应的文件名并过滤 2️⃣ PsExec.exe提权定位找不到EABackgroundService.exe的问题 PsExec.exe提权PsExec.exe原理 🛬 结论📖 参考资料 🛫 问题…...
可视化和回归分析星巴克咖啡在中国的定价建议
可视化和回归分析星巴克咖啡在中国的定价建议。星巴克的拿铁大杯Tall 在各国的价格。 Claude AI | 代码自动生成的数据可视化代码 选择Claude AI 而非 ChatGPT的理由是前者更懂中文!具体可以参见我前面的两篇文章对比两者的中英文翻译的表现及使用安装等难易程度…...
热门影片怎么买票比较便宜,低价买电影票的方法,纯攻略!
有时候真的有被自己蠢到!看电影看了这么多年,竟然不知道电影票价格才9.9元、19.9元就能买到。之前我看电影动不动就是几十上百块,感觉好亏啊。 其实,我也不敢相信的,通过这些平台,同时在节假日甚至春节档期…...
Python通过SWIG调用C++时出现的ImportError问题解析
摘要 win10系统,编译器为mingw,按照教程封装C的一个类并用python调用,一步步进行直到最后一步运行python代码时,在python代码中import example时报错ImportError: DLL load failed while importing _example: The specified modul…...
3ds Max云渲染有多快,3ds Max云渲染怎么用?
本地渲染效果图和动画3D项目是一个非常耗时的过程,当在场景中使用未优化的几何体或在最终渲染中使用大量多边形模型时,诸如此类的变量最终会增加渲染项目所需的时间和处理器能力。随着提供的渲染服务的云渲染平台出现,越来越多动画师、艺术家…...
Java之线程安全
目录 一.上节回顾 1.Thread类常见的属性 2.Thread类中的方法 二.多线程带来的风险 1.观察线程不安全的现象 三.造成线程不安全现象的原因 1.多个线程修改了同一个共享变量 2.线程是抢占式执行的 3.原子性 4.内存可见性 5.有序性 四.解决线程不安全问题 ---synchroni…...
我有一个方法判断你有没有编程天赋
我有一个方法判断你有没有编程天赋 一 前言 基于知识的诅咒的原理 做一个敲击者很难。问题在于敲击者已拥有的知识(歌曲题目)让 他们想象不到缺乏这种知识会是什么情形。当他们敲击的时候,他 们不能想象听众听到的是那些独立的敲击声而不是…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
