四种自动化测试模型实例及优缺点

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试)

一,线性测试
1.概念:

通过录制或编写对应应用程序的操作步骤产生的线性脚本。单纯的来模拟用户完整的操作场景。

(操作,重复操作,数据)都混合在一起。

2.优点:

每个脚本相对独立,且不产生其他依赖和调用。

3.缺点:

开发成本高,用例之间存在重复的操作。比如重复的用户登录和退出。

维护成本高,由于重复的操作,当重复的操作发生改变时,则需要逐一进行脚本的修改。

4.线性测试实例

用户登录

以下的用户名密码到时候自己去申请,就不将笔者的用户密码贴出来了。

# coding=utf-8
'''
Created on 2016-7-20
@author: Jennifer
Project:简单元素操作登录126邮箱,元素的clear(),send_keys(),click()操作
在定位的时候发现有些元素定位不到,最后发现有iframe,frame中实际上是嵌入了另一个页面。
如果iframe有name或id的话,直接使用switch_to_frame("name值")或switch_to_frame("id值"),
这是最理想的方法,也是最简单好用的方法。
'''
from selenium import webdriver
import time

driver=webdriver.Firefox()
driver.get(r'http://www.126.com/')  #字符串加r,防止转义。
time.sleep(3)

print '开始登录邮箱'

try:
    assert '126' in driver.title    #title是变量,不能title()
except AssertionError:
    print "error:网址输入不正确"
else:
    print "记录日志:网址输入正确"

#    driver.switch_to_frame('x-URS-iframe')  #跳转到iframe框架
    driver.switch_to.frame('x-URS-iframe')   #同上面语句一样,跳转到iframe框架
    username=driver.find_element_by_name('email')
    username.clear()
    username.send_keys('Jennifer···')
    time.sleep(0.1)
    
    userpasswd=driver.find_element_by_name('password')
    userpasswd.clear()
    userpasswd.send_keys('·····')
    time.sleep(0.1)
    
    loginbt=driver.find_element_by_id('dologin')
    loginbt.click()
    time.sleep(3)
    
    try:
        assert '网易邮箱' in driver.title
    except AssertionError:
        print '邮箱登录失败'
    else:
        print '邮箱登录成功'
    
finally:
    #操作:收信,写信等操作,暂不写例子了
    driver.quit()
    
print '测试结束'
二,模块化驱动测试
1.概念:

将重复的操作独立成功共模块,当用例执行过程中需要用到这一模块操作时则被调用。

操作+(重复操作,数据)混合在一起。

2.优点:

由于最大限度消除了重复,从而提高了开发效率和提高测试用例的可维护性。

3.缺点:

虽然模块化的步骤相同,但是测试数据不同。比如说重复的登录模块,如果登录用户不同,依旧要重复编写登录脚本。

4.实例

公共模块:对登陆和退出进行模块化封装

以下的用户名密码到时候自己去申请,就不将笔者的用户密码贴出来了。

# coding=utf-8
'''
Created on 2016-7-27
@author: Jennifer
Project:模块化驱动测试实例,将重复的登录脚本放在单独的脚本中供其他用例调用
'''
import time
class Login():
    def user_login(self,driver):
        username=driver.find_element_by_name('email')
        username.clear()
        username.send_keys('username')
        time.sleep(0.1)
        
        userpasswd=driver.find_element_by_name('password')
        userpasswd.clear()
        userpasswd.send_keys('password')
        time.sleep(0.1)
        
        loginbt=driver.find_element_by_id('dologin')
        loginbt.click()
        time.sleep(3)
        
    def user_logout(self,driver):
        driver.find_element_by_link_text(u'退出').click()
        driver.quit()
        

写信用例:以下代码用了各种定位方法,值得学习,后续再重新对这部分进行总结

直接调用模块的登录和退出方法。

# coding=utf-8
'''
Created on 2016-7-27
@author: Jennifer
Project:发送邮件
'''
from selenium import webdriver
import time

from test_5_2_public import Login  #由于公共模块文件命名为test_5_2_public
driver=webdriver.Firefox()
driver.implicitly_wait(30)
driver.get(r'http://www.126.com/')  #字符串加r,防止转义。
time.sleep(3)
driver.switch_to.frame('x-URS-iframe')
#调用登录模块
Login().user_login(driver)
time.sleep(10)
#发送邮件
#点击发件箱
#_mail_component_61_61是动态id,所以不能用于定位
#driver.find_element_by_css_selector('#_mail_component_61_61>span.oz0').click()
#不能加u"//span[contains(text(),u'写 信')]",否则定位不到。
#以下定位是查找span标签有个文本(text)包含(contains)'写 信' 的元素,该定位方法重要
driver.find_element_by_xpath("//span[contains(text(),'写 信')]").click()
#填写收件人
driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys(r'xxx@163.com')
#填写主题
#通过and连接更多的属性来唯一地标志一个元素
driver.find_element_by_xpath("//input[@class='nui-ipt-input' and @maxlength='256']").send_keys(u'自动化测试')
#填写正文
#通过switch_to_frame()将当前定位切换到frame/iframe表单的内嵌页面中
driver.switch_to_frame(driver.find_element_by_class_name('APP-editor-iframe'))
#在内嵌页面中定位邮件内容位置
emailcontext=driver.find_element_by_class_name('nui-scroll')
#填写邮件内容
emailcontext.send_keys(u'这是第一封自动化测试邮件')
#通过switch_to().default_content()跳回最外层的页面
#注:不要写成switch_to().default_content(),否则报AttributeError: SwitchTo instance has no __call__ method
driver.switch_to.default_content()
#driver.switch_to.parent_frame()
#点击发送
time.sleep(3)
#有可能存在元素不可见(查看元素是灰色的),会报ElementNotVisibleException错误
#包含发送二字的元素很多,所以还得再加上其他限制
#sendemails=driver.find_element_by_xpath("//span[contains(text(),'发送')]")
sendemails=driver.find_element_by_xpath("//span[contains(text(),'发送') and @class='nui-btn-text']")
time.sleep(3)

#校验邮件是否发送成功
try:
    assert '发送成功' in driver.page_source
except AssertionError:
    print '邮件发送成功'
else:
    print '邮件发送失败'

#调用退出模块    
Login().user_logout(driver)
收信用例:

直接调用模块的登录和退出方法。

# coding=utf-8
'''
Created on 2016-7-27
@author: Jennifer
Project:接收邮件
'''
from selenium import webdriver
import time

from test_5_2_public import Login
driver=webdriver.Firefox()
driver.implicitly_wait(30)
driver.get(r'http://www.126.com/')  #字符串加r,防止转义。
time.sleep(3)
driver.switch_to.frame('x-URS-iframe')
#调用登录模块
Login().user_login(driver)
time.sleep(10)
#接收邮件
#点击收信
#以下定位是查找span标签有个文本(text)包含(contains)'收 信' 的元素,该定位方法重要
driver.find_element_by_xpath("//span[contains(text(),'收 信')]").click()

#校验是否进入收件箱,没报错即进入
try:
    #点击其中一封邮件
    driver.find_element_by_xpath("//div[@sign='letter']").click()
except Exception as e:
    print e
else:
    print '成功收信'

#调用退出模块    
Login().user_logout(driver)
三,数据驱动测试
1.概念:

它将测试中的测试数据和操作分离,数据存放在另外一个文件中单独维护。

通过数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。

操作+重复操作+数据分开。

2.优点:

通过这种方式,将数据和重复操作分开,可以快速增加相似测试,完成不同数据情况下的测试。

3.缺点

暂无

4.实例

从excel表格读取用户名密码,登录邮箱。

以下的用户名密码到时候自己去申请,就不将笔者的用户密码贴出来了。

# coding=utf-8
'''
Created on 2016-7-28
@author: Jennifer
Project:数据驱动测试,数据保存在excel中,需要导入xlrd模块
'''
from selenium import webdriver
import time
import xlrd

#将用户密码表格转换为用户密码列表
def exceltolist(excelfile,colnameindex=0,by_index=0):
    excelfile=xlrd.open_workbook(excelfile)   #打开excel表格
#    table = excelfile.sheets()[by_index]     #默认获取sheet0页
    table = excelfile.sheet_by_index(by_index)#默认获取sheet0页
    nrows=table.nrows                         #获取excel的sheet0页的行数
    colnames=table.row_values(colnameindex)   #默认获取第0行的列表数据:name和password两个值
    list =[]                                  #建一个空列表,用来存放用户密码字典
    for rownum in range(1,nrows):             #初始行为0,从第1行开始
        row = table.row_values(rownum)        #获取某一行的列表数据
        if row:
            app = {}                          #建立一个空字典,存放某一组用户密码数据
            for i in range(len(colnames)):    #目前是2
                app[colnames[i]] = row[i]     #字典新增数据:循环两次,字典新增两对key-value
            list.append(app)                  #将新增的字典数据,添加到列表数据中                 
    return list

def Login():
    file=r'D:\pythontest\rightpassword\userpassword.xls'
    userlist=exceltolist(file)
    for i in range(len(userlist)):
        driver=webdriver.Firefox()
        driver.get(r'http://www.126.com/')  #字符串加r,防止转义。
        time.sleep(3)
    
        driver.switch_to.frame('x-URS-iframe')   #同上面语句一样,跳转到iframe框架
        username=driver.find_element_by_name('email')
        username.clear()
        username.send_keys(userlist[i]['name'])
        time.sleep(0.1)
        
        userpasswd=driver.find_element_by_name('password')
        userpasswd.clear()
        userpasswd.send_keys(userlist[i]['password'])
        time.sleep(0.1)
        
        loginbt=driver.find_element_by_id('dologin')
        loginbt.click()
        time.sleep(3)
        try:
            assert '网易邮箱' in driver.title
        except AssertionError:
            print '用户%s邮箱登录失败'%(userlist[i]['name'])
        else:
            print '用户%s邮箱登录成功'%(userlist[i]['name'])
        
        finally:
            driver.quit()


if __name__=='__main__':
    Login()
 四,关键字驱动测试

  关键字驱动的来源非常自然,从面向对象的思路出发,同样的业务逻辑会自然的编写成一个类或者函数作为关键字来被不同的测试脚本所调用。当测试框架发展到所有 的测试过程都已经可以被写好的函数和类所组合完成时,就进化到了关键字驱动的一个高级阶段,这个时候测试用例的开发就变成了测试数据和关键字的组合,并把 这种组合工作简化为所有人都很熟悉的表格填写任务,从而最终达到一个由数据和关键字驱动整个测试的效果。

       在关键字驱动框架里,你可以创建一些关键字以及相关联的一些方法和函数。然后你创建一个函数库,它里面包含一个读取关键字的逻辑,然后调用相关的动作。
    关键字驱动的自动化测试(也称为表驱动测试自动化),是数据驱动自动化测试的变种,可支持由不同序列或多个不同路径组成的测试。它是一种独立于应 用程序的自动化框架,在处理自动化测试的同时也要适合手工测试。关键字驱动的自动化测试框架建立在数据驱动手段之上,表中包含指令(关键词),而不只是数 据。这些测试被开发成使用关键字的数据表,它们独立于执行测试的自动化工具。关键字驱动的自动化测试是对数据驱动的自动化测试的有效改进和补充。

        这种自动化测试的模型主要由核心数据驱动引擎、组件函数、支持库和应用映射表组成。自动化测试首先由初始脚本开始执行,这个脚本把高层测试表传递给高层驱 动器,高层驱动器在处理这些表的过程中,遇到中层测试表后就调用中层驱动器,中层驱动器处理中层表时也作类似的处理。当低层驱动器处理低层表时,它尝试着 使应用与测试保持同步。当低层驱动器遇到对某一个组件的低层关键字组件时,它判断这个组件的类型并调用相应的组件函数模块来处理这个指令操作。所有这些元 素都要依靠映射表中的信息,它是自动化测试模型和被测应用程序的桥梁。支持库主要完成一些文件处理,日志记录和邮件发送等等的功能。
下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

 

文档获取方式:

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

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

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

相关文章

分工是财富的秘密

友情提示:这是一篇干货,需要深度阅读 前几天,我看到一个做自媒体的大 V 说了这么一个观点:分工是财富的秘密。 然后,我根据这句话,自己做了点引申。 分工是财富的秘密。分工越细,赚钱机会越多&a…

OpenGL之坐标系统

将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步进行的,也就是类似于流水线那样子。在流水线中,物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System)。将物体的坐标变换到几个过渡坐标系(Inte…

从Python代码到诗

🐳序言 在Python社区,没有强制的编码标准,这虽然赋予了开发者更多的自由,但也导致代码风格不一致性。使得部分代码变得晦涩难懂,本文将探讨一系列的开发技巧和最佳实践,开发出优雅的Python脚本。 1、参数接…

ElasticSearch(三)

1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些…

laravel框架 - 消息队列如何使用

业务场景:项目里边有很多视频资源需要上传到抖音资源库,通过队列一条一条上传。 参考实例:发送邮件,仅供参考 (1)创建任务【生成任务类】 在你的应用程序中,队列的任务类都默认放在 app/Jobs 目录下。如果这个目录不存…

解决ubuntu系统python2.7安装uwsgi报错

背景 因为项目老旧,仍需使用python2.7,仍需要使用pip2 安装依赖。在安装uwsgi的时候,报错。 错误一 Building wheel for uwsgi (setup.py) ... error ERROR: Command errored out with exit status 1: command: /usr/bin/python2 -u -…

vulhub打靶第三周

第三周 靶机下载地址:https://www.vulnhub.com/entry/chronos-1,735/ 环境折磨导致做晚了,再加上期末的考试多耽搁下来了,然后就是辗转反侧打比赛,拖了这么久,时隔三个月重新开打 因为陆陆续续打了两次,所…

[winerror 5] 拒绝访问。: ‘..\\data‘解决方案

使用Jupyter Notebook学习深度学习时出现错误如下:[winerror 5] 拒绝访问。: ‘…\data’ 解决方法: 打开anaconda3找到对应环境的python.exe 点开属性,点安全,选择如下: 点编辑,选择User,勾…

9、DVWA——XSS(Stored)

文章目录 一、存储型XSS概述二、low2.1 源码分析2.2 通关分析 三、medium3.1 源码分析3.2 通关思路 四、high4.1 源码分析4.2 通关思路 一、存储型XSS概述 XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击&#xff…

李航老师《统计学习方法》第1章阅读笔记

1.1 统计学习 统计学习的特点 统计学习:计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析 现在人们提及机器学习时,往往指统计机器学习,所以可以认为本书介绍的是机器学习方法 统计学习的对象 统计学习研究的对象是数据(data)…

《Web安全基础》09. WAF 绕过

web 1:基本概念1.1:DoS & DDos1.2:CC 攻击1.3:扫描绕过方式 2:WAF 绕过2.1:信息收集阶段2.2:漏洞发现阶段2.3:权限控制阶段2.3.1:密码混淆2.3.2:变量覆盖…

解决方案:TSINGSEE青犀+智能分析网关助力智慧仓储智能化监管

为全面保障物流仓储的安全性与完整性,解决仓库管理难题,优化物流仓储方式,提升仓储效率,降低人工成本,旭帆科技推出智慧仓储AI视频智能分析方案,利用物联网、大数据、云计算等技术,对仓储管理进…

IDEA2023新UI回退老UI

idea2023年发布了新UI,如下所示 但是用起来真心不好用,各种位置也是错乱,用下面方法可以回退老UI

【轨道机器人】成功驱动伺服电机(学生电源、DCH调试软件、DH系列伺服驱动器)

1、硬件平台 工控机 学生电源 DH系列伺服驱动器 电机 调试平台:DCH 2、如何利用dch驱动电机 点击可驱动电机 下面的步骤是比较关键的几步: 3、遇到的问题 不能成功驱动电机,还和厂家那边打电话,询问 发现是这…

JavaScript简介引入方式(JavaScript基础语法、JavaScript对象、BOM、DOM、事件监听)

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 JavaScript简介&引入方式 简介&#xf…

智能生活从这里开始:数字孪生驱动的社区

数字孪生技术,这个近年来备受瞩目的名词,正迅速渗透到社区发展领域,改变着我们居住的方式、管理的方式以及与周围环境互动的方式。它不仅仅是一种概念,更是一种变革,下面我们将探讨数字孪生技术如何推动社区智能化发展…

基于微服务的第二课堂管理系统(素质拓展学分管理平台)SpringCloud、SpringBoot 分布式,微服务

基于微服务的第二课堂管理系统 一款真正的企业级开发项目,采用标准的企业规范开发,有项目介绍视频和源码,需要学习的同学可以拿去学习,这是一款真正可以写在简历上的校招项目,能够真正学到东西的一个项目,话…

基于springboot高校场馆预订系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

重新认识架构—不只是软件设计

前言 什么是架构? 通常情况下,人们对架构的认知仅限于在软件工程中的定义:架构主要指软件系统的结构设计,比如常见的SOLID准则、DDD架构。一个良好的软件架构可以帮助团队更有效地进行软件开发,降低维护成本&#xff0…

Leetcode171. Excel 表列序号

给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 题解:力扣(LeetCode)官网 - 全球极客挚爱…