我们在操作自动化测如何实现用例设计实例

news2024/11/25 18:50:01

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

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 time
 
driver = 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()函数,以及如何编写自动化用例与脚本等。
不过笔者先不要急于开始实施自动化测试,虽然我们可以编写单个的测试用例,并通过异常捕捉判断用例是否运行成功。但只有与通过测试框架的整合,我们才能真正有效可行的运用自动化测试技术。

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

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

相关文章

【结构体-位段】

位段 在结构体中&#xff0c;以位为单位的成员&#xff0c;咱们称之为位段(位域)。 struct packed_data{unsigned int a:2;unsigned int b:6;unsigned int c:4;unsigned int d:4;unsigned int i; } data;注意&#xff1a;不能对位段成员取地址。 #include<stdio.h>str…

5.名词复数、动词规则、代词、形容词、副词(不包含不规则)

目录 一、 名词、动词、代词、形容词、副词五种的规则变化。 &#xff08;1&#xff09;名词。 &#xff08;1.1&#xff09;名词复数变化。 &#xff08;1.2&#xff09;名词所有格。 &#xff08;2&#xff09; 动词变化规则。 &#xff08;3&#xff09;代词。 &…

C语言-double和float在内存中的存储方式

本文主要介绍double和float数据类型在C语言中的存储方式 文章目录 double和float存储方式介绍如何存储&#xff1f; double和float存储方式介绍 从存储结构和算法上来讲&#xff0c;double和float是一样的&#xff0c;不一样的地方仅仅是float是32位的&#xff0c;double是64位…

【CAN卡通信的下位机-STM32cubeIDE-hal库+STMF1xx和STMF4xx+数据发送和接收+轮询接收方式+基础样例(1)】

【CAN卡通信的下位机-STM32cubeIDE-hal库数据发送和接收轮询接收方式基础样例1】 1、概述2、实验环境3、自我总结与提升(1)道理学习了一堆&#xff0c;如何使用STM32进行can的收发的话&#xff0c;配置还是挺简单。(2)自己实现了can的收发后&#xff0c;要反过来&#xff0c;补…

shell编程——Here Document免交互与Expect(免交互,高效率)

shell编程——Here Document免交互与Expect&#xff08;免交互&#xff0c;高效率&#xff09; 一、Here Document免交互概述二、Here Document常规用法1、免交互方式实现对行数地统计2、通过read/tee命令接受输入并打印3、通过passwd给用户设置密码4、支持变量替换5、整体赋值…

K8S基础操作之命令篇

目录 第一章.陈述式资源管理 1.1陈述式资源管理方法 1.2.基本命令查看信息 1.3.K8S管理操作分为2大类 1.4.数据网络端口访问流程 第二章.基本信息查看 2.1.命令格式 2.2.命令 2.3.项目的生命周期 第三章.service 3.1.概述 3.2.service 的 type 类型 3.3 headless …

神级指标DMI魔改免费公开!在宽基指数上也可以收获40倍收益,每年都在创新高!

一、写在前头 今天,我们要讲的DMI实际上是一组指标,它由表示多空方向的PDI、MDI以及表示趋势强度的ADX、ADXR共四条线组成。在正式开讲之前,我们先聊几句近期的行情。 上周我们根据量化策略提示了一些板块的机会,其中有一些已经开始有所表现。比如今天涨幅前十的板块中,…

【python笔记】可变对象和不可变对象

前言 在python中&#xff0c;一切事物皆是对象&#xff0c;变量是对象在内存中的存储和地址的抽象。类型也是属于对象的&#xff0c;而不是变量。变量和对象是分离的&#xff0c;对象是内存中储存数据的实体&#xff0c;变量则是指向对象的指针。 “”(赋值号)是将右侧对象的内…

网络编程与netty

目录 NIO 网络编程Buffer&#xff08;缓冲区&#xff09;Channel&#xff08;通道&#xff09;Selector&#xff08;选择器&#xff09;SelectionKey 零拷贝原生NIO存在的问题 线程模型传统阻塞 I/O 服务模型Reactor 模式单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程…

RabbitMQ养成记 (3.MQ的简单工作模式 和 Pub/sub 订阅模式)

上一篇是一个简单的helloworld。 我们直接发直接收 这种是最简单的。 下面我们再来接触更加复杂一点&#xff1a; 简单工作模式 work queues 工作队列模式&#xff1a; 这里注意 这里的消息 对两个消费者 c1 c2来说是竞争关系 而不是等份分发关系&#xff0c; 就像两个线程…

[山海关crypto 训练营 day10]

日常鼓励自己&#xff1a;别抱怨努力的苦&#xff0c;那是你去看世界的路。 最近几天一直忙着项目的结项答辩&#xff0c;今天终于是搞完了&#xff0c;得到了老师们的一致好评&#xff0c;最近几天的努力也没白费&#xff01;现在可以愉快刷题了&#xff0c;先复现下LiteCtf的…

c++核心知识—文件操作

目录 一、文件操作 1、文本文件 2、二进制文件 一、文件操作 文件操作头文件&#xff1a;<fstream> 操作文件的三大流&#xff1a; 1、ofstream&#xff1a;写操作 2、ifstream&#xff1a;读操作 3、fstream&#xff1a;读写操作 1、文本文件 写文件 步骤&…

【数据结构】-学习链表所需要的预备知识

知识点收集于网络&#xff0c;我会加以总结&#xff0c;如果把预备知识学好了。那么后面的操作就不难了 用节或者结都可以&#xff0c;不要在意字的差别 目录 一、头指针与头结点的概念 二、链表带头结点和不带头节点的区别 三、八大链表类型&#xff1a; 四、链表节点为…

unity制作幽灵猎手射击游戏

文章目录 介绍人物向着鼠标点击的位置跑动、旋转lerp函数让摄像机平滑跟随敌人导航敌人攻击发射子弹攻击敌人玩家健康敌人健康分数显示刷怪笼游戏结束动画 介绍 玩家鼠标控制人物转向 玩家鼠标点击控制光线发射的终点 玩家受到伤害屏幕闪红 有三个怪物生成点 玩家射杀敌人获得分…

linux-项目部署软件安装

安装jdk 操作步骤&#xff1a; 1、使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux jdk-8u171-linux-x64.tar.gz 2、解压安装包&#xff0c;命令为tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local 3、配置环境变量&#xff0c;使用vim命令修改/etc/profile文…

【JavaWeb】-- Filter、Listener、Ajax、Vue

文章目录 Filter1.概述2.快速入门2.1 开发步骤2.2 代码演示 3.Filter执行流程4. Filter拦截路径配置5.过滤器链5.1 概述5.2 代码演示5.3 问题 Listener1.概述2. 分类3.代码演示 Ajax1.概述1.1作用1.2 同步和异步 2.快速入门2.1 服务端实现2.2 客户端实现2.3 测试 3.axios3.1 基…

“Shell“Awk命令

文章目录 一.Awk二.Awk按行输出文本三.Awk按字段输出文本四.通过管道&#xff0c;双引号调用shell命令五.总结&#xff1a; 一.Awk Awk的工作原理&#xff1a; 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中&a…

康耐视智能相机IS2000与三菱PLC走MC协议通讯设置详细步骤及案例详解

1.IS2000(SLMP扫描界面)设置如下: 控制器类型:PLC型号 IP地址:PLC地址 主机端口:16进制下的PLC通讯端口 2、IS2000设备寻址界面设置如下: 六大控制块存放区域根据PLC设定,偏移量及设备数可更改。3.打开GX WORKS软件,选择新建工程,点击“确定”,界面如下: 4.点击“连…

初识redis【redis的安装使用与卸载】

一.redis的概念 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。在redis官网中对redis的描述是这样的&#…

MADDPG-学习笔记(1)

文献链接&#xff1a;https://arxiv.org/abs/1706.02275 "Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments"&#xff08;作者&#xff1a;Lowe, Ryan等人&#xff0c;2017年&#xff09; 环境搭建&#xff1a;https://zhuanlan.zhihu.co…