软件测试之 自动化测试 基于Python语言使用Selenium、ddt、unitTest 实现自动化测试

news2024/11/23 17:00:07

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee

如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^)

想看更多 那就点个关注吧 我会尽力带来有趣的内容

本文档是一年前学后记得笔记 现在居然还记得很清楚 基于黑马程序员的 软件测试web自动化测试,Web自动化流程精讲和移动自动化测试环境_哔哩哔哩_bilibili 这套技术

目前 本人对软件测试技术已经有了更深刻的理解,如果你想看,可以在评论区告诉我,我会安排上。刚才扫了两眼之前自己写的这份文档,感觉学的很浅

自动化测试

自动化测试-Selenium 的操作

python中的self对象相当于java中的this

https://selenium.dev/downloads/

驱动下载

image-20231022110556905

image-20231022110610036

  • 使用css_selector来定位元素时,前面不加就是元素本名,加上.就是id

image-20231022110634382

元素操作

image-20231017212955914

浏览器操作

image-20231017213026229

获取元素信息

image-20231017213054578

鼠标操作

**image-20231017213125507 **

键盘操作

image-20231017213156817

隐式等待

image-20231017213236803

显示等待

image-20231017213315150

image-20231017213331763

lambda表达式

image-20231017183619026

  • 以上代码等同于
f = lambda x: x * x
print(f(5)) # 25

该表达式相当于一行函数的表达式

显示等待,使用lambda解决问题
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 显示等待
from selenium.webdriver.support.wait import WebDriverWait

driver=webdriver.Chrome()
driver.implicitly_wait(10)
url=r"E:\课堂素材\注册A.html"
driver.get(url)
driver.maximize_window()

#此处WebDriverWait将传入的driver赋值给self._driver(一个实例对象的中的属性),until方法调用了self._driver,因此,x为driver
a=WebDriverWait(driver,timeout=10,poll_frequency=0.4).until(lambda x:x.find_element(By.ID,'userA'))
a.send_keys("aaa")
# 隐式等待
下拉框

image-20231017213400775

弹出框

image-20231017213548282

image-20231017213601946

注册条

image-20231017213635935

frame切换

image-20231017213656392

image-20231017213705726

多窗口切换

image-20231017213741235

image-20231017213803705

窗口截屏

image-20231017213831957

获取cooke来通过验证码

image-20231017213902453

image-20231017213925134

自动化测试- unitTest框架

image-20231018092314691

TestCase
import unittest
#核心要素一
# 待测试的函数
def add(x,y):
 return x+y

# 定义测试类 并继承来达成使用的目的(python中使用括号加.的方式来继承)
class Test01(unittest.TestCase):# 将光标定在类上,就可以执行这个类下面的函数
 def test_add(self): # 光标定在方法上,点击运行,只会执行一个函数
     # 要调用的函数
     print("结果",add(1,2))
 def test_add12(self):
     # 要调用的函数
     print("结果",add(11,2))
 def ttttt(self):# 名称不是test开头不会运行
     print("aaa")
if __name__ == '__main__':
 # 这样没有用,if的条件不通过 __name__中,如果运行的模块是主模块,
 # 那么打印__mian__,不是则存放启动模块的值
	# 在测试方法test中打印——name——的值会发现出现的是启动模块(文件)的值
 unittest.main()
  • 运行是将该类交给TestCase来运行,
TestSuite

image-20231018105603989

TestLoader

image-20231018103452245

image-20231018105241372

image-20231018105325527

TextTestRunner

image-20231018105739216

Fixture

image-20231018103040567

image-20231018103056352

image-20231018103103814

image-20231018103134287

image-20231018110715337

  • 使用setupclass需要加上@classmethod注解

使用 @classmethod 装饰器将 setUpClass 标识为类方法,它的第一个参数通常被命名为 cls,并允许你访问和操作类级别的资源,类方法需要该装饰器

image-20231018111624483

image-20231018112057546

箭头 -> None 不是Python函数定义的一部分,而是类型注释(type hinting)的一部分。它表示函数的返回类型。在这种情况下,-> None 意味着该函数没有返回值,即返回的是 None

在Python中,函数的返回类型通常不需要显式声明,因为Python是一种动态类型语言,函数可以返回各种不同类型的值。然而,类型注释是一种提供额外信息以帮助代码阅读和静态代码分析的机制。在类型注释中,-> None 表示函数的返回值是 None,即没有返回值。

数据断言

image-20231018113337532

image-20231018113355488

断言方法参数要求作用
assertEqual(a, b)a 和 b 需要是可比较的,通常是相同类型。检查 a 和 b 是否相等。
assertNotEqual(a, b)a 和 b 同样需要是可比较的,通常是相同类型。检查 a 和 b 是否不相等。
assertTrue(x)x 应该是一个布尔值(True 或 False)。检查 x 是否为 True。
assertFalse(x)x 应该是一个布尔值(True 或 False)。检查 x 是否为 False。
assertIs(a, b)a 和 b 应该是对象,用于检查对象的身份。检查 a 和 b 是否是相同的对象(身份相同)。
assertIsNot(a, b)a 和 b 应该是对象,用于检查对象的身份。检查 a 和 b 是否不是相同的对象(身份不同)。
assertIn(a, b)a 和 b 可以是可迭代的对象,其中 a 是 b 的一个元素。检查 a 是否在 b 中存在。
assertNotIn(a, b)a 和 b 可以是可迭代的对象,其中 a 不是 b 的一个元素。检查 a 是否不在 b 中存在。
assertIsNone(x)x 可以是任何对象,用于检查它是否为 None。检查 x 是否为 None。
assertIsNotNone(x)x 可以是任何对象,用于检查它是否不为 None。检查 x 是否不为 None。

可迭代对象是指能够被迭代遍历的数据结构,通常是包含多个元素的集合。在Python中,许多数据类型都是可迭代的,包括但不限于:

  1. 列表(List):有序的元素集合,可以按照索引访问。
  2. 元组(Tuple):类似于列表,但是不可变的。
  3. 字符串(String):由字符组成的有序序列。
  4. 集合(Set):无序的元素集合,不包含重复元素。
  5. 字典(Dictionary):包含键-值对的集合,可以按键访问值。
  6. 范围(Range):表示一系列连续的整数。
  7. 文件对象(File Object):可以逐行读取文件内容。
  8. 迭代器(Iterator):自定义的可迭代对象,通过实现 __iter__()__next__() 方法来支持迭代。

image-20231018170957726

  • 数据断言不返回结果,想要使用变量接收只能获得none

image-20231018171052407

image-20231018171125442

image-20231018172224118

  • assetIn方法要求左边是被判断的元素
生成测试报告

image-20231019100401628

import unittest
import time

from HTMLTestRunner import HTMLTestRunner

suite = unittest.defaultTestLoader.discover("../case", pattern="test*.py")

if __name__ == '__main__':
    # 测试报告存放位置
    reportDir = '../case/test_report'
    now = time.strftime("%Y-%m-%d-%H-%M-%S")
    report_name = reportDir + '/' + now + 'result.html'
    with open(report_name, 'wb') as f:  # 更改为 'wb' 模式
        runner = HTMLTestRunner(stream=f, title="标题", description="小标题")
        runner.run(suite)
    f.close()
  • 该代码所使用的HTMLTestRunner不是原生的,而是经过美化的
  • 学习测试报告的前置条件是知道python中的 with 语句
  • 文本文件(txt等)使用w模式
  • 图片文件使用wb模式
  • CSV文件使用a模式追加写
  • HTML/XML文件使用w模式
  • 测试报告使用wb模式写入图片数据

with语句的主要特点和作用如下:

  • 自动调用对象的__enter__()和__exit__()方法进行资源获取和释放操作。
  • 可以保证在代码块执行前后正确地打开和关闭资源,不用担心忘记关闭资源导致问题。

as关键字在with语句中的作用和含义是:

  • 将文件对象或其他对象赋值给一个变量,以便后续使用。
  • 相当于给文件对象或其他对象起一个“别名”

wb和w模式打开文件有以下区别:

  • w模式:

以文本写入模式打开文件,如果文件不存在则创建,如果文件存在则将其内容清空后再写入。

这样写入的传输的是bytes

  • wb模式:

以二进制写入模式打开文件,如果文件不存在则创建,如果文件存在则将其内容清空后再写入。

这样写入传输的是str

主要区别在于:

  • w模式打开文件时采用文本模式,会对换行符等字符做转换。适用于文本文件。
  • wb模式打开文件时采用二进制模式,不会对任何字符做转换。数据以原始二进制形式写入。适用于图片、视频等二进制文件。

发送邮件

image-20231019161632687

PageObject模式与思想

image-20231019184300100

image-20231019190108051

****

雏形

image-20231022104100183

  • 将定位元素的值视作属性,将一个页面看作对象(一个类文件)
  • 页面对象必须写在path文件夹中
  • 最后将所有模块内容组合起来

image-20231022132543019

image-20231022132603061

  • 将整个测试流程分层两个模块,Page模块负责页面的操作,而不进行测试
  • scripts负责测试
最终版本
  • 添加了基类

image-20231022133151456

  • 项目结构为基类层,页面层,脚本层

image-20231022133344492

image-20231022140435173

  • 小括号表示元组

image-20231022140656301

image-20231022140713226

  • 不写小括号也可以
    • 解包后,可以被selenium识别到

image-20231029213123330

image-20231029213140442

  • 如果要在参数中就解码,那就需要所有用到的地方都使用*

大bug

image-20231022162101455

  • 一个是访问基类中的base_click一个是访问当前类的base_click。正确的应该是使用当前类的,然后借着继承关系来访问到基类

image-20231022171949314

image-20231022171742600

  • 该bug是个复合bug先数据的拆包没有成功

image-20231029205828333

  • 模块需要封装成类方法

dJydHhYx-1715083072843)]

[外链图片转存中…(img-s8fyLE1T-1715083072844)]

  • 如果要在参数中就解码,那就需要所有用到的地方都使用*

大bug

[外链图片转存中…(img-bOl9BqsR-1715083072844)]

  • 一个是访问基类中的base_click一个是访问当前类的base_click。正确的应该是使用当前类的,然后借着继承关系来访问到基类

[外链图片转存中…(img-FNUg34qz-1715083072845)]

[外链图片转存中…(img-FAhvZlZf-1715083072846)]

  • 该bug是个复合bug先数据的拆包没有成功

[外链图片转存中…(img-Ul3kdNmm-1715083072847)]

  • 模块需要封装成类方法

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

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

相关文章

ASV1000视频监控平台:接入支持JT808标准的设备

目录 一、JT/T 808标准简介 (一)概述 (二)标准内容简介 1、消息分类 2、位置信息 3、报警信息 4、车辆控制 5、数据转发 二、在ASV1000上通过JT808添加设备 (一)登录视频监控平台管理端 &#x…

深度学习之基于Vgg16卷积神经网络乳腺癌诊断系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于VGG16卷积神经网络的乳腺癌诊断系统项目是一个结合深度学习技术和医学图像处理的创新项目,旨在提高…

嵌入式全栈开发学习笔记---C语言笔试复习大全14

目录 指针初级 指针的概念 指针类型 指针类型长度 指针的定义 通过指针访问数据 p1和*p1的区别 指针做函数参数 上一篇复习了8道编程题,这篇开始正式复习之指针! 说明:我们学过单片机的一般都是有C语言基础的了,网上关于C…

Sarcasm detection论文解析 |用于微博讽刺检测的上下文增强卷积神经网络

论文地址 论文地址:Context-augmented convolutional neural networks for twitter sarcasm detection - ScienceDirect 论文首页 笔记大纲 用于微博讽刺检测的上下文增强卷积神经网络 📅出版年份:2018 📖出版期刊:Neurocomputing &#x1f…

Golang | Leetcode Golang题解之第71题简化路径

题目: 题解: func simplifyPath(path string) string {stack : []string{}for _, name : range strings.Split(path, "/") {if name ".." {if len(stack) > 0 {stack stack[:len(stack)-1]}} else if name ! "" &am…

以中国为目标的DinodasRAT Linux后门攻击场景复现

概述 在上一篇《以中国为目标的DinodasRAT Linux后门剖析及通信解密尝试》文章中,笔者对DinodasRAT Linux后门的功能及通信数据包进行了简单剖析,实现了对DinodasRAT Linux后门心跳数据包的解密尝试。 虽然目前可对DinodasRAT Linux后门的通信数据包进…

Davinci工程开发方法论

基本概念 Flash Driver是下载到RAM里面的bin文件 Boot Manager是ROM上启动运行的第一个实例,可以是独立的bin文件,可以是集成在FBL里面。 Bootloader存储在ROM里面的bin文件 Demo Appl一个示例模板,用来跳转到Bootloader的,也是一…

OpenCV 入门(五) —— 人脸识别模型训练与 Windows 下的人脸识别

OpenCV 入门系列: OpenCV 入门(一)—— OpenCV 基础 OpenCV 入门(二)—— 车牌定位 OpenCV 入门(三)—— 车牌筛选 OpenCV 入门(四)—— 车牌号识别 OpenCV 入门&#xf…

【负载均衡在线OJ项目日记】项目简介

目录 前言 什么是负载均衡 所用的技术和开发环境 所用技术 开发环境 项目的宏观结构 leetcode 结构 结构 编写思路 前言 从C语言的文章到现在Linux网络部分,我已经涉猎了很多知识;终于在今天我要开始搞项目了,通过项目我也可以开始…

《Fundamentals of Power Electronics》——一些常用变换器的正则电路参数值

对于理想的CCM PWM dc-dc转换器,其包含一个电感和电容,正则模型有效的低通滤波器需要包含一个电感和一个电容。正则模型简化为如下图所示。 假设电容与负载直接相连。基础的buck、boost和buck-boost转换器的参数值如下表所示。 该模型可以用传统的线性电…

【贪心算法】最小生成树Kruskal算法Python实现

文章目录 [toc]问题描述最小生成树的性质证明 Kruskal算法Python实现时间复杂性 问题描述 设 G ( V , E ) G (V , E) G(V,E)是无向连通带权图, E E E中每条边 ( v , w ) (v , w) (v,w)的权为 c [ v ] [ w ] c[v][w] c[v][w]如果 G G G的一个子图 G ′ G^{} G′是…

贪心问题 难度[普及-]一赏

目录 #小A的糖果 删数问题 陶陶摘苹果(升级版) P5019 NOIP2018 提高组 铺设道路 小A的糖果 原文链接: P3817 小A的糖果 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 小 A 有 n 个糖果盒,第 i 个盒中有 a_i 颗糖果。 小 A 每…

【吃透Java手写】Spring(下)-AOP-事务及传播原理

【吃透Java手写】Spring(下)AOP-事务及传播原理 6 AOP模拟实现6.1 AOP工作流程6.2 定义dao接口与实现类6.3 初始化后逻辑6.4 原生Spring的方法6.4.1 实现类6.4.2 定义通知类,定义切入点表达式、配置切面6.4.3 在配置类中进行Spring注解包扫描…

Windows系统安装MySQL数据库详细教程

【确认本地是否安装mysql】 (1)按【winr】快捷键打开运行; (2)输入services.msc,点击【确定】; (3)在打开的服务列表中查找mysql服务,如果没有mysql服务&am…

计算机组成结构—虚拟存储器

目录 一、虚拟存储器的基本概念 二、页式虚拟存储器 1.页表 2.快表(TLB) 3.具有 TLB 和 Cache 的多级存储系统 三、段式虚拟存储器 四、段页式虚拟存储器 五、虚拟存储器和Cache比较 早期的计算机,CPU 是直接操作主存的,也就是运行程序时&#xf…

工业光源环形系列一高均匀条形光源特点

产品特点 ◆可以根据检测需求随意调整照射角度: ◆可以根据检测需求选择光源颜色: ◆多个条形光源可以自由组合: ◆使用贴片灯珠,均匀性更好。

使用Docker安装MySql数据库

大家好,今天给大家分享一下如何使用docker安装MySql数据库,关于docker的安装和常用命令,大家可以参考下面两篇文章,本文中不做过多描述。 Docker在Windows与CentOS上的安装 Docker常用命令 一、拉取MySql数据库镜像 docker pul…

远程桌面连接不上,远程桌面连接不上的专业解决策略

在信息技术领域,远程桌面连接是一种非常重要的工具,它允许用户从任何地点、任何时间访问和操作远程计算机。然而,当远程桌面连接出现问题时,可能会严重影响工作效率。以下是一些可能导致远程桌面连接不上的原因以及相应的解决方案…

usb个人总结

前言: 推荐快速上手资料: 《圈圈教你玩usb》讲用一个usb模块51如何让电脑识别出一个usb设备,也介绍了不少相关的字段内容。 其他例如uac\hid相关字段怎么看的建议去官网下载文档 USB-IF官方网站:Front Page | USB-IF USB中文…

AIGC绘画辅助网站

Midjourney风格样式 Midjourney Style Classifier | Andrei Kovalevs Midlibrary