自动化测试用例设计实例

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

1、一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器。

2、一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统

3、尽量只做功能中正向逻辑的验证,不要考虑太多逆向逻辑的验证,逆向逻辑的情况很多(例如手号输错有很多种情况),验证一方面比较复杂,需要编写大量的脚本,另一方面自动化脚本本身比较脆弱,很多非正常的逻辑的验证能力不强。(我们尽量遵循用户正常使用原则编写脚本即可)

4、脚本之间不要产生关联性,也就是说编写的每一个脚本都是独立的,不能依赖或影响其他脚本。

5、如果对数据进行了修改,需要对数据进行还原。

6、在整个脚本中只对验证点进行验证,不要对整个脚本每一步都做验证。

一、登陆用例实例:

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

用例001:

代码示例:

备注:通过匹配用户登录之后的昵称来判断用户是否登录成功。

用例脚本(login.py):

python 复制代码
#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,本用例只关注收藏用户分享的逻辑代码。#判断当前文件个数

python 复制代码
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):#判断当前文件个数

python 复制代码
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()函数,以及如何编写自动化用例与脚本等。

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

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关推荐
Tassel_YUE1 小时前
网络自动化04:python实现ACL匹配信息(主机与主机信息)
网络·python·自动化
€☞扫地僧☜€1 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
其乐无涯1 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流1 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
写bug的小屁孩1 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
斑布斑布1 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
紅色彼岸花1 小时前
第六章:DNS域名解析服务器
运维·服务器
✿ ༺ ོIT技术༻1 小时前
Linux:认识文件系统
linux·运维·服务器
会掉头发2 小时前
Linux进程通信之共享内存
linux·运维·共享内存·进程通信
我言秋日胜春朝★2 小时前
【Linux】冯诺依曼体系、再谈操作系统
linux·运维·服务器