当前位置: 首页 > article >正文

【软件测试】:软件测试实战

1. ⾃动化实施步骤

1.1 编写web测试⽤例

在这里插入图片描述

1.2 ⾃动化测试脚本开发

common

public class AutotestUtils {public static EdgeDriver driver;//
创建驱动对象public static EdgeDriver createDriver(){//
驱动对象已经创建好了
/
没有创建if( driver == null){driver = new EdgeDriver();//
创建隐式等待driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));}return driver;}public AutotestUtils(String url){EdgeDriver driver = createDriver();driver.get(url);}public List<String> getTime(){//
⽂件能不能按照天的维度按⽂件夹进⾏保存//
⽂件格式20230212-123030
毫秒SimpleDateFormat sim1 = new SimpleDateFormat("yyyyMMdd-HHmmssSS");SimpleDateFormat sim2 = new SimpleDateFormat("yyyyMMdd");String filename = sim1.format(System.currentTimeMillis());String dirname = sim2.format(System.currentTimeMillis());List<String> list = new ArrayList<>();list.add(dirname);list.add(filename);return  list;}/*** 
获取屏幕截图,把所有的⽤例执⾏的结果保存下来*/public void getScreenShot(String str) throws IOException {List<String> list = getTime();//dir+filename// ./
指的是当前的项⽬路径下,也就是
BlogAutoTest
下// ./src/test/java/com/blogWebAutoTest/dirname/filename// ./src/test/java/com/blogWebAutoTest/20230212/logintest_20230212
123030
毫秒
.png String filename = 
"./src/test/java/com/blogWebAutoTest/"+list.get(0)+"/"+str+"_"+list.get(1)+".png";File srcfile = driver.getScreenshotAs(OutputType.FILE);//
把屏幕截图⽣成的⽂件放到指定的路径FileUtils.copyFile(srcfile,new File(filename));}}

cases/BlogLogin.py

import time
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
class BlogLogin:url = ""driver = ""def __init__(self): self.url = "http://192.168.47.135:8653/blog_system/blog_login.html" self.driver = BlogDriver.driver self.driver.get(self.url) def loginSucTest(self): time.sleep(2) self.driver.find_element(By.CSS_SELECTOR, "#username").clear() self.driver.find_element(By.CSS_SELECTOR, "#password").clear() self.driver.find_element(By.CSS_SELECTOR, 
"#username").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123") self.driver.find_element(By.CSS_SELECTOR, "#submit").click()# 对登录结果进⾏检测, 如果跳转到了博客列表⻚才算是登录成功了self.driver.find_element(By.CSS_SELECTOR, "body > div.container > 
div.left > div > img")BlogDriver.getScreenShot() self.driver.back()def loginFailTest(self): self.driver.find_element(By.CSS_SELECTOR, "#username").clear() self.driver.find_element(By.CSS_SELECTOR, "#password").clear() self.driver.find_element(By.CSS_SELECTOR, 
"#username").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("111") self.driver.find_element(By.CSS_SELECTOR, "#submit").click()# 等登录失败的结果进⾏检测, 不能仅仅通过body来校验结果,因为登录成功的结果⻚也有
body元素expect = "⽤⼾名或密码错误!"actual = self.driver.find_element(By.CSS_SELECTOR, "body").text print(actual)BlogDriver.getScreenShot() assert expect == actual self.driver.back()

cases/BlogList.py

from selenium.webdriver.common.by import By
from common.Utils import BlogDriverclass BlogList:url = ""driver = ""def __init__(self): self.driver = BlogDriver.driver self.url = "http://192.168.47.135:8653/blog_system/blog_list.html"self.driver.get(self.url)# 前提:登陆状态下才能进⼊到列表⻚ def ListTest(self):self.driver.find_element(By.CSS_SELECTOR, "body > div.container > 
div.left > div > img")self.driver.find_element(By.CSS_SELECTOR, "body > div.container > 
div.right > div:nth-child(1) > a")articles = self.driver.find_elements(By.CSS_SELECTOR, "body > 
div.container > div.right > div")assert len(articles) > 10#点击⽂章self.driver.find_element(By.CSS_SELECTOR,"body > div.container > 
div.right > div:nth-child(1) > a").click()title = self.driver.titleassert title == "博客详情⻚" BlogDriver.getScreenShot()

cases/BlogDetail.py

from selenium.webdriver.common.by import By
from common.Utils import BlogDriverclass BlogDetail:url = " "driver = ""def __init__(self): self.url = "http://192.168.47.135:8653/blog_system/blog_detail.html?
blogId=15"self.driver = BlogDriver.driver title = self.driver.title#列表⻚已经跳过来了,⽆需再指定url跳转if not title=="博客列表⻚":self.driver.get(self.url) def DetailCheck(self):#body > div.container > div.right > div:nth-child(1) > a BlogDriver.getScreenShot() self.driver.find_element(By.CSS_SELECTOR,"body > div.container > 
div.right > div > h3")self.driver.find_element(By.CSS_SELECTOR,"body > div.container > 
div.right > div > div.date")self.driver.find_element(By.CSS_SELECTOR,"#content")

cases/RunCases.py

from common.Utils import BlogDriverfrom tests import BlogLoginfrom tests import BlogListfrom tests import BlogDetailif __name__ == "__main__":BlogLogin.BlogLogin().loginSucTest() BlogList.BlogList().ListTest() BlogDetail.BlogDetail().DetailCheck() BlogDriver.driver.quit()

1.3 将⾃动化测试补充⾄测试报告

测试报告模板:
在这里插入图片描述
在这里插入图片描述

相关文章:

【软件测试】:软件测试实战

1. ⾃动化实施步骤 1.1 编写web测试⽤例 1.2 ⾃动化测试脚本开发 common public class AutotestUtils {public static EdgeDriver driver;// 创建驱动对象public static EdgeDriver createDriver(){// 驱动对象已经创建好了 / 没有创建if( driver null){driver new EdgeDr…...

SpringMVC 请求处理

SpringMVC 请求处理深度解析&#xff1a;从原理到企业级应用实践 一、架构演进与核心组件协同 1.1 从传统Servlet到前端控制器模式 SpringMVC采用前端控制器架构模式&#xff0c;通过DispatcherServlet统一处理请求&#xff0c;相比传统Servlet的分散处理方式&#xff0c;实…...

unittest自动化测试实战

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 为什么要学习unittest 按照测试阶段来划分&#xff0c;可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程…...

leetcode3.无重复字符的最长字串

采用滑动窗口方法 class Solution { public:int lengthOfLongestSubstring(string s) {int ns.size();if(n0)return 0;int result0;unordered_set<char> set;set.insert(s[0]);for(int i0,j0;i<n;i){while(j1<n&&set.find(s[j1])set.end()){set.insert(s[…...

Android Compose 框架派生状态(derivedStateOf、rememberCoroutineScope)深入剖析(十五)

一、引言 在 Android 开发领域&#xff0c;高效的状态管理对于构建响应式、高性能的应用程序至关重要&#xff0c;在 Jetpack Compose 中&#xff0c;derivedStateOf 和 rememberCoroutineScope 这两个与派生状态相关的特性在状态管理方面发挥着关键作用。派生状态允许我们根据…...

3.25-2request库

request库 一、介绍request库 &#xff08;1&#xff09;requests是用python语言编写的简单易用的http库&#xff0c;用来做接口测试的库&#xff1b; &#xff08;2&#xff09;接口测试自动化库有哪些&#xff1f; requests、urllib 、urllib2、urllib3、 httplib 等&…...

《破解老龄化的智能密钥:机器人四维战略与未来养老生态》

一、引言&#xff1a;老龄化社会与智能机器人的必然性 全球老龄化趋势与老年人核心需求&#xff08;健康管理、生活辅助、心理陪伴、安全保障&#xff09; 全球正面临着严峻的老龄化挑战。根据联合国发布的数据&#xff0c;全球60岁及以上人口数量在过去几十年中持续增长&…...

Docker-Volume数据卷详讲

Docker数据卷-Volume 一&#xff1a;Volume是什么&#xff0c;用来做什么的 当删除docker容器时&#xff0c;容器内部的文件就会跟随容器所销毁&#xff0c;在生产环境中我们需要将数据持久化保存&#xff0c;就催生了将容器内部的数据保存在宿主机的需求&#xff0c;volume …...

SpringMVC 配置

一、MVC 模式简介 在软件开发的广袤天地中&#xff0c;MVC 模式宛如一座明亮的灯塔&#xff0c;指引着开发者构建高效、可维护的应用程序。Spring MVC 作为基于 Spring 框架的重要 web 开发模块&#xff0c;更是将 MVC 模式的优势发挥得淋漓尽致&#xff0c;堪称 Servlet 的强…...

Python 3.8 Requests 爬虫教程(2025最新版)

遵守网站的爬虫规则、避免爬取敏感信息、保护个人隐私&#xff01; 一、环境配置与基础验证 # 验证 Python 版本&#xff08;需 ≥3.8&#xff09; import sys print(sys.version) # 应输出类似 3.8.12 的信息# 安装 requests 库&#xff08;若未安装&#xff09; # 命令行执…...

蓝桥杯备考之 最长上升子序列问题(挖地雷)

这道题其实就是正常的最长上升子序列问题&#xff0c;但是我们还要把最优方案输出出来&#xff0c;我们可以用个pre数组来维护就行了&#xff0c;每当我们更新以i为结尾的最长子序列&#xff0c;如果i是接在1到i-1某个点后面的话就把前面的点存到pre里面 最后我们把pre倒着打印…...

华为OD机试2025A卷 - 游戏分组/王者荣耀(Java Python JS C++ C )

最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 2020年题: 英雄联盟是一款十分火热的对战类游戏。每一场对战有10位玩家参与,分为两组,每组5人。每位玩家都有一个战斗力,代表着这位玩家的厉害程度。为了对战尽可能精彩,我们需要…...

【Python Cookbook】字符串和文本(二)

字符串和文本&#xff08;二&#xff09; 6.字符串忽略大小写的搜索替换7.最短匹配模式8.多行匹配模式9.将 Unicode 文本标准化10.在正则式中使用 Unicode 6.字符串忽略大小写的搜索替换 你需要以忽略大小写的方式搜索与替换文本字符串。 为了在文本操作时忽略大小写&#xf…...

Redisson 实现分布式锁简单解析

目录 Redisson 实现分布式锁业务方法&#xff1a;加锁逻辑LockUtil 工具类锁余额方法&#xff1a;工具类代码枚举代码 RedisUtil 工具类tryLock 方法及重载【分布式锁具体实现】Supplier 函数式接口调用分析 Redisson 实现分布式锁 业务方法&#xff1a; 如图&#xff0c;简单…...

六十天Linux从0到项目搭建(第五天)(file、bash 和 shell 的区别、目录权限、默认权限umask、粘滞位、使用系统自带的包管理工具)

1. file [选项] 文件名 用于确定文件类型的实用工具。它会通过分析文件内容&#xff08;而不仅仅是文件扩展名&#xff09;来判断文件的实际类型 示例输出解析 $ file /bin/bash /bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, i…...

信源的分类及数学模型

信源的分类及数学模型 按照信源发出的时间和消息分布分为离散信源和连续信源 按照信源发出符号之间的关系分为无记忆信源和有记忆信源 单符号离散信源&#xff08;一维离散信源&#xff09; 信源输出的消息数有限或可数&#xff0c;且每次只输出符号集的一个消息 样本空间&…...

嵌入式硬件工程师从小白到入门-PCB绘制(二)

PCB绘制从小白到入门&#xff1a;知识点速通与面试指南 一、PCB设计核心流程 需求分析 明确电路功能&#xff08;如电源、信号处理、通信&#xff09;。确定关键参数&#xff08;电压、电流、频率、接口类型&#xff09;。 原理图设计 元器件选型&#xff1a;匹配封装、电压、…...

抽象工厂设计模式及应用案例

引言 在软件开发中&#xff0c;合理的设计模式可以有效地提高代码的可维护性、可扩展性和可重用性。抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;便是一个重要的创建型设计模式&#xff0c;它允许我们在不指定具体类的情况下&#xff0c;创建一系列相关或相…...

LVS NAT模式实现三台RS的轮询访问

节点规划: 配置RS&#xff1a; RS1-RS3的网关配置均为 192.168.163.8 配置RS1&#xff1a; [rootlocalhost ~]# hostnamectl hostname rs1 [rootlocalhost ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.163.7/24 ipv4.gateway 192.168.163.8 conne…...

LSM-Tree(Log-Structured Merge-Tree)详解

1. 什么是 LSM-Tree? LSM-Tree(Log-Structured Merge-Tree)是一种 针对写优化的存储结构,广泛用于 NoSQL 数据库(如 LevelDB、RocksDB、HBase、Cassandra)等系统。 它的核心思想是: 写入时只追加写(Append-Only),将数据先写入内存缓冲区(MemTable)。内存数据满后…...

uni-app jyf-parser将字符串转化为html 和 rich-text

uni-app jyf-parser将字符串转化为html-CSDN博客 方法二&#xff1a; rich-text | uni-app...

Docker+Ollama+Xinference+RAGFlow+Dify部署及踩坑问题

目录 一、Xinference部署 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;部署 &#xff08;三&#xff09;参数 &#xff08;四&#xff09;错误问题 &#xff08;五&#xff09;Xinference配置Text-embedding模型 &#xff08;六&#xff09;Xinference配…...

CentOS 7 搭建基于匿名用户的 FTP 服务

1. 安装 VSFTPD yum install vsftpd -y 2. 配置 VSFTPD 编辑主配置文 vi /etc/vsftpd/vsftpd.conf 以下配置项存在或修改为对应值 anonymous_enableYES # 启用匿名用户 local_enableNO # 禁用本地用户 write_enableYES # 允许写入&#xff08;若需要匿名上传&#xff0…...

【机器学习】什么是线性回归?

什么是线性回归&#xff1f; 线性回归是一种 监督学习算法&#xff0c;它通过拟合一个直线&#xff08;或平面&#xff0c;高维空间下是超平面&#xff09;来建立 输入特征 和 输出目标 之间的关系。简单来说&#xff0c;线性回归就是找出一个数学方程&#xff08;通常是线性方…...

零、ubuntu20.04 安装 anaconda

1.anaconda下载 地址&#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择&#xff1a;Anaconda3-2023.07-2-Linux-x86_64.sh 2.anaconda安装 选择下载目录&#xff0c;选在在终端中打开&#xff0c;然后在终端输入安装命…...

Web纯前端实现在线打开编辑保存PPT幻灯片

很多项目中有时会需要在线打开PPT并编辑保存到服务器。猿大师办公助手可以完美调用本地office在线打开ppt文件&#xff0c;跟本地打开效果一样。还可以在线打开word、excel、pdf等文件&#xff0c;支持本机OFFICE完整嵌入模式&#xff0c;本机OFFICE所有功能基本都可以在网页上…...

LeetCode热题100精讲——Top3:最长连续序列【哈希】

你好&#xff0c;我是安然无虞。 文章目录 题目背景最长连续序列C解法Python解法 题目背景 如果大家对于 哈希 类型的概念并不熟悉, 可以先看我之前为此专门写的算法详解: 蓝桥杯算法竞赛系列第九章巧解哈希题&#xff0c;用这3种数据类型足矣 最长连续序列 题目链接&#x…...

vue2相关 基础命令

vue2 基础命令 vue简介&#xff0c;Vue 2 已于 2023 年 12 月 31 日停止维护。详见 Vue 2 终止支持 (EOL)。 安装完 Visual Studio Code后&#xff0c;打开项目目录&#xff0c; 在目录位置输入cmd&#xff0c;然后在命令行输入 code . 就可以在VScode打开项目。 公司的前后端…...

2025年渗透测试面试题总结-某 长亭(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 长亭 一、Spring SpEL表达式注入漏洞 1. 技术原理 2. 利用条件 3. 攻击方法 4. 防御策略 二、Jav…...

【web3】

检测钱包是否安装 方法一 // npm install metamask/detect-provider import detectEthereumProvider from metamask/detect-provider// 检测钱包是否安装 const isProvider await detectEthereumProvider() if(!isProvider) {proxy.$modal.msgError("请安装钱包")…...