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

自动化测试用例设计实例

在编写用例之间,笔者再次强调几点编写自动化测试用例的原则:

1、一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器。
2、一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统
3、尽量只做功能中正向逻辑的验证,不要考虑太多逆向逻辑的验证,逆向逻辑的情况很多(例如手号输错有很多种情况),验证一方面比较复杂,需要编写大量的脚本,另一方面自动化脚本本身比较脆弱,很多非正常的逻辑的验证能力不强。(我们尽量遵循用户正常使用原则编写脚本即可)
4、脚本之间不要产生关联性,也就是说编写的每一个脚本都是独立的,不能依赖或影响其他脚本。
5、如果对数据进行了修改,需要对数据进行还原。
6、在整个脚本中只对验证点进行验证,不要对整个脚本每一步都做验证。

一、登陆用例实例:

笔者建议通过excle 表格来编写自动化测试用例。
用例001:

代码示例:

备注:通过匹配用户登录之后的昵称来判断用户是否登录成功。
用例脚本(login.py):

#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import timedriver = webdriver.Firefox()
driver.get("http://passport.kuaibo.com/login/?referrer=http%3A%2F%2Fwebcloud.kuaibo.com%2F")
driver.maximize_window() #浏览器最大化#登陆快播私有云
driver.find_element_by_id("user_name").send_keys("testing360")
driver.find_element_by_id("user_pwd").send_keys("198876")
driver.find_element_by_id("dl_an_submit").click()
time.sleep(3)#获取用户名
now_user=driver.find_element_by_xpath("//div[@id='Nav']/ul/li[4]/a[1]/span").text#用户名是否等于虫师,不等于将抛出异常
if now_user==u'虫师':print '登陆成功'
else:raise NameError('user name error!')#退出
driver.find_element_by_class_name("Usertool").click()
time.sleep(2)
driver.find_element_by_link_text("退出").click()
time.sleep(2)
driver.close()

二、添加文件用例实例

用例002:

 备注:通过计算用户列表中的文件的数量来判断文件是否添加成功。

用例脚本(collect.py):

注:用例登陆与退出参考用例001,本用例只关注收藏用户分享的逻辑代码。#判断当前文件个数

inputs=driver.find_elements_by_tag_name('input')
n=0
for i in inputs:if i.get_attribute('type')=="checkbox":n=n+1
print u"当前列表文件为%d" %n#收藏用户分享文件
driver.find_element_by_class_name("collect").click()
time.sleep(3)#再次获取当前文件的个数
inputs=driver.find_elements_by_tag_name('input')
ns=0
for ii in inputs:if ii.get_attribute('type')=="checkbox":ns=ns+1
print u"当前列表文件为%d" %ns#判断执行收藏文件之后比收藏之间文件加1 ,否则抛异常
if  ns==n+1:print "ok!"
else:raise NameError('添加文件失败!!')

三、删除文件实例:

用例003:

备注:因为删除了一个文件对文件的数据发生的改变,如果多次执行脚本,列表中的文件被删除完了就会引发异常,所以在删除一个文件后,需要再添加一文件,但添加文件操作不做验证。
用例脚本(del_one_file.py):#判断当前文件个数

inputs=driver.find_elements_by_tag_name('input')
n=0
for i in inputs:if i.get_attribute('type')=="checkbox":n=n+1
print u"当前列表文件为%d" %n#删除操作
driver.find_element_by_xpath("/html/body/div/div[2]/div[2]/div/div[4]/table/tbody/tr/td/input").click()
driver.find_element_by_class_name("dele").click()
driver.find_element_by_xpath("/html/body/div[2]/div[2]/div[2]/div").click()
time.sleep(4)#再次获取当前文件的个数
inputs=driver.find_elements_by_tag_name('input')
ns=0
for ii in inputs:if ii.get_attribute('type')=="checkbox":ns=ns+1
print u"当前列表文件为%d" %ns#判断执行删除单个文件之后比删除之后文件减1 ,否则抛异常
if  ns==n-1:print "ok!"
else:raise NameError('删除文件失败!!')
#收藏用户分享单个文件driver.find_element_by_class_name("collect").click()
time.sleep(3)

四、重命名文件用例实例

用例004:

备注:文件的重命名其实我们很难找到证据(验证点)证明重命名成功,那么脚本整个运行没有报错,我们也可模糊的判断功能测试是OK 的。


用例脚本(renaming.py)

#勾选重命名的文件
driver.find_element_by_xpath("/html/body/div/div[2]/div[2]/div/div[4]/table/tbody[5]/tr/td/input").click()
time.sleep(3)


#鼠标移动到“更多”按钮弹下拉框

element=driver.find_element_by_class_name("more-fe")     #定位到“更多”按钮
ActionChains(driver).move_to_element(element).perform()   #鼠标移动到“更多”按钮弹下拉框
time.sleep(2)   

#在li 标签(更多下拉框)中筛选到data-action==rename(重命名)选项点击

lis=driver.find_elements_by_tag_name('li')
for li in lis:
      if li.get_attribute('data-action') == 'rename':
            li.click()
time.sleep(2)

在input 标签中筛选type==text 的重命名输入框

inputs=driver.find_elements_by_tag_name('input')
for input in inputs:
       if input.get_attribute('type') == 'text':
                input.send_keys(u"新文件名") #进行重名操作
                input.send_keys(Keys.ENTER) #回车确认重命名
                time.sleep(2)

总结:
在本章中,简单对比了手工测试用户与自动化测试用例的区别,自动化测试用例编写的原则,如何通过python 捕捉异常和抛出异常,以及webdriver 提供的get_screenshot_as_file()函数,以及如何编写自动化用例与脚本等。


不过笔者先不要急于开始实施自动化测试,虽然我们可以编写单个的测试用例,并通过异常捕捉判断用例是否运行成功。但只有与通过测试框架的整合,我们才能真正有效可行的运用自动化测试技术。

相关文章:

自动化测试用例设计实例

在编写用例之间,笔者再次强调几点编写自动化测试用例的原则: 1、一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器。 2、一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统…...

CSS3基础

CSS3在CSS2的基础上增加了很多功能,如圆角、多背景、透明度、阴影等,以帮助开发人员解决一些实际问题。 1、初次使用CSS 与HTML5一样,CSS3也是一种标识语言,可以使用任意文本编辑器编写代码。下面简单介绍CSS3的基本用法。 1.1…...

【栈】 735. 行星碰撞

735. 行星碰撞 解题思路 如果数组元素大于0 说明向右移动 那么不管 左边元素是不是大于0 都不会碰撞 如果数组元素小于0 说明想左边移动 那么判断左边元素 如果左边元素大于0 碰撞 那么遍历数组 当前元素大于0 直接入栈 如果当前元素小于0 判断栈顶元素是不是大于0 如果大…...

水库大坝安全监测MCU,提升大坝管理效率的利器!

水库大坝作为防洪度汛的重要设施,承担着防洪抗旱,节流发电的重要作用。大坝的安全直接关系到水库的安全和人民群众的生命财产安全。但因为水库大坝的隐患不易被察觉,发现时往往为时已晚。因此,必须加强对大坝的安全管理。其安全监…...

【vue2类型助手】vue2-cli 实现为 vue2 项目中的组件添加全局类型提示

实现 vue2 全局组件提示 vue2 项目全局注册组件直接使用没有提示 由于vue2中使用volar存在很大的性能问题,所以只能继续使用vetur,但是这样全局组件会没有提示,这对于开发来说,体验十分不友好,所以开发此cli并借助ve…...

mysql 索引 区分字符大小写

mysql 建立索引,特别是unique索引,是跟字符集、字符排序规则有关的。 对于utf8mb4_0900_ai_ci来说,0900代表Unicode 9.0的规范,ai表示accent insensitivity,也就是“不区分音调”,而ci表示case insensitiv…...

Stable Diffusion Webui源码剖析

1、关键python依赖 (1)xformers:优化加速方案。它可以对模型进行适当的优化来加速图片生成并降低显存占用。缺点是输出图像不稳定,有可能比不开Xformers略差。 (2)GFPGAN:它是腾讯开源的人脸修…...

为什么kafka 需要 subscribe 的 group.id?我们是否需要使用 commitSync 手动提交偏移量?

目录 一、为什么需要带有 subscribe 的 group.id二、我们需要使用commitSync手动提交偏移量吗?三、如果我想手动提交偏移量,该怎么做? 一、为什么需要带有 subscribe 的 group.id 消费概念: Kafka 使用消费者组的概念来实现主题的…...

什么是Web应用程序防火墙,WAF与其他网络安全工具差异在哪?

一、什么是Web 应用程序防火墙 (WAF) ? WAF软件产品被广泛应用于保护Web应用程序和网站免受威胁或攻击,它通过监控用户、应用程序和其他互联网来源之间的流量,有效防御跨站点伪造、跨站点脚本(XSS攻击)、SQL注入、DDo…...

打家劫舍 II——力扣213

动规 int robrange(vector<int>& nums, int start, int end){int first=nums[start]...

动手学深度学习—卷积神经网络LeNet(代码详解)

1. LeNet LeNet由两个部分组成&#xff1a; 卷积编码器&#xff1a;由两个卷积层组成&#xff1b;全连接层密集块&#xff1a;由三个全连接层组成。 每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均汇聚层&#xff1b;每个卷积层使用55卷积核和一个sigmoid激…...

腾讯面经总结

最近在准备面试&#xff0c;看了很多大厂的面经&#xff0c;抽空将腾讯面试的题目整理了一下&#xff0c;希望对大家有所帮助~ 一面 1、mysql索引结构&#xff1f; 2、redis持久化策略&#xff1f; 3、zookeeper节点类型说一下&#xff1b; 4、zookeeper选举机制&#xff…...

matlab机器人工具箱基础使用

资料&#xff1a;https://blog.csdn.net/huangjunsheng123/article/details/110630665 用vscode直接看工具箱api代码比较方便&#xff0c;代码说明很多 一、模型设置 1、基础效果 %采用机器人工具箱进行正逆运动学验证 a[0,-0.3,-0.3,0,0,0];%DH参数 d[0.05,0,0,0.06,0.05,…...

利用WonderLeak进行内存泄露检测【一】

1、下载地址&#xff1a; WonderLeak - Visual Studio Marketplace https://www.relyze.com/ 2、WonderLeak支持vs2017 2019扩展&#xff0c;或者单独启动 3、https://www.relyze.com/docs/wonderleak/help/w/overview/msvc_extension1.png 4、对于二进制程序来说支持以下…...

二刷LeetCode--155. 最小栈(C++版本),思维题

思路:本题需要使用两个栈,一个就是正常栈,执行出入操作,另一个栈只负责将对应的最小值进行保存即可.每次入栈的时候,最小值栈的栈顶也需要入栈元素,不过这个元素是最小值,那么就需要进行比较,因此在getmin()的时候只需要将最小值栈的栈顶元素弹出即可.初始化的时候只需要将最小…...

进程的状态与转换

进程在其生命周期内&#xff0c;由于系统中各进程之间的相互制约及系统的运行环境的变化&#xff0c;使得进程的状态也在不断地发生变化。通常进程有以下5种状态&#xff0c;前三种是基础讷航的基本状态 1&#xff09;运行态。进程正在处理机上运行。在单处理机机中&#xff0…...

用MariaDB创建数据库,SQL练习,MarialDB安装和使用

前言&#xff1a;MariaDB数据库管理系统是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可 MariaDB的目的是完全兼容MySQL&#xff0c;包括API和命令行&#xff0c;使之能轻松成为MySQL的代替品。在存储引擎方面&#xff0c;使用XtraDB来代替MySQ…...

【Docker】 使用Docker-Compose 搭建基于 WordPress 的博客网站

引 本文将使用流行的博客搭建工具 WordPress 搭建一个私人博客站点。部署过程中使用到了 Docker 、MySQL 。站点搭建完成后经行了发布文章的体验。 WordPress WordPress 是一个广泛使用的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;用于构建和管理网站、博客和…...

Hlang社区-前端社区宣传首页实现

文章目录 前言页面结构固定钉头部轮播JS特效完整代码总结前言 这里的话,博主其实也是今年参与考研的大军之一,所以的话,是抽空去完成这个项目的,当然这个项目的肯定是可以在较短的时间内完成的。 那么废话不多说,昨天也是干到1点多,把这个首页写出来了。先看看看效果吧:…...

【LeetCode-Medium】833. 字符串中的查找与替换

题目链接 833. 字符串中的查找与替换 标签 字符串 步骤 Step1. 初始化 ans[]&#xff1a; for (int i 0; i < s.length(); i) { // 初始化ansans[i] s[i]; }Step2. 根据 index, source, target 查找&#xff1b;如果找到&#xff0c;那么将 ans[i] 更改为 target&am…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...