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

一、线性测试

1.概念:

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

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

2.优点:

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

3.缺点:

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

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

4.线性测试实例

用户登录

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

  1. # coding=utf-8

  2. '''

  3. Created on 2016-7-20

  4. @author: Jennifer

  5. Project:简单元素操作登录126邮箱,元素的clear(),send_keys(),click()操作

  6. 在定位的时候发现有些元素定位不到,最后发现有iframe,frame中实际上是嵌入了另一个页面。

  7. 如果iframe有name或id的话,直接使用switch_to_frame("name值")或switch_to_frame("id值"),

  8. 这是最理想的方法,也是最简单好用的方法。

  9. '''

  10. from selenium import webdriver

  11. import time

  12. driver=webdriver.Firefox()

  13. driver.get(r'http://www.126.com/') #字符串加r,防止转义。

  14. time.sleep(3)

  15. print '开始登录邮箱'

  16. try:

  17. assert '126' in driver.title #title是变量,不能title()

  18. except AssertionError:

  19. print "error:网址输入不正确"

  20. else:

  21. print "记录日志:网址输入正确"

  22. # driver.switch_to_frame('x-URS-iframe') #跳转到iframe框架

  23. driver.switch_to.frame('x-URS-iframe') #同上面语句一样,跳转到iframe框架

  24. username=driver.find_element_by_name('email')

  25. username.clear()

  26. username.send_keys('Jennifer···')

  27. time.sleep(0.1)

  28. userpasswd=driver.find_element_by_name('password')

  29. userpasswd.clear()

  30. userpasswd.send_keys('·····')

  31. time.sleep(0.1)

  32. loginbt=driver.find_element_by_id('dologin')

  33. loginbt.click()

  34. time.sleep(3)

  35. try:

  36. assert '网易邮箱' in driver.title

  37. except AssertionError:

  38. print '邮箱登录失败'

  39. else:

  40. print '邮箱登录成功'

  41. finally:

  42. #操作:收信,写信等操作,暂不写例子了

  43. driver.quit()

  44. print '测试结束'

二、模块化驱动测试

1.概念:

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

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

2.优点:

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

3.缺点:

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

4.实例

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

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

  1. # coding=utf-8

  2. '''

  3. Created on 2016-7-27

  4. @author: Jennifer

  5. Project:模块化驱动测试实例,将重复的登录脚本放在单独的脚本中供其他用例调用

  6. '''

  7. import time

  8. class Login():

  9. def user_login(self,driver):

  10. username=driver.find_element_by_name('email')

  11. username.clear()

  12. username.send_keys('username')

  13. time.sleep(0.1)

  14. userpasswd=driver.find_element_by_name('password')

  15. userpasswd.clear()

  16. userpasswd.send_keys('password')

  17. time.sleep(0.1)

  18. loginbt=driver.find_element_by_id('dologin')

  19. loginbt.click()

  20. time.sleep(3)

  21. def user_logout(self,driver):

  22. driver.find_element_by_link_text(u'退出').click()

  23. driver.quit()

'

运行

运行

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

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

  1. # coding=utf-8

  2. '''

  3. Created on 2016-7-27

  4. @author: Jennifer

  5. Project:发送邮件

  6. '''

  7. from selenium import webdriver

  8. import time

  9. from test_5_2_public import Login #由于公共模块文件命名为test_5_2_public

  10. driver=webdriver.Firefox()

  11. driver.implicitly_wait(30)

  12. driver.get(r'http://www.126.com/') #字符串加r,防止转义。

  13. time.sleep(3)

  14. driver.switch_to.frame('x-URS-iframe')

  15. #调用登录模块

  16. Login().user_login(driver)

  17. time.sleep(10)

  18. #发送邮件

  19. #点击发件箱

  20. #_mail_component_61_61是动态id,所以不能用于定位

  21. #driver.find_element_by_css_selector('#_mail_component_61_61>span.oz0').click()

  22. #不能加u"//span[contains(text(),u'写 信')]",否则定位不到。

  23. #以下定位是查找span标签有个文本(text)包含(contains)'写 信' 的元素,该定位方法重要

  24. driver.find_element_by_xpath("//span[contains(text(),'写 信')]").click()

  25. #填写收件人

  26. driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys(r'xxx@163.com')

  27. #填写主题

  28. #通过and连接更多的属性来唯一地标志一个元素

  29. driver.find_element_by_xpath("//input[@class='nui-ipt-input' and @maxlength='256']").send_keys(u'自动化测试')

  30. #填写正文

  31. #通过switch_to_frame()将当前定位切换到frame/iframe表单的内嵌页面中

  32. driver.switch_to_frame(driver.find_element_by_class_name('APP-editor-iframe'))

  33. #在内嵌页面中定位邮件内容位置

  34. emailcontext=driver.find_element_by_class_name('nui-scroll')

  35. #填写邮件内容

  36. emailcontext.send_keys(u'这是第一封自动化测试邮件')

  37. #通过switch_to().default_content()跳回最外层的页面

  38. #注:不要写成switch_to().default_content(),否则报AttributeError: SwitchTo instance has no __call__ method

  39. driver.switch_to.default_content()

  40. #driver.switch_to.parent_frame()

  41. #点击发送

  42. time.sleep(3)

  43. #有可能存在元素不可见(查看元素是灰色的),会报ElementNotVisibleException错误

  44. #包含发送二字的元素很多,所以还得再加上其他限制

  45. #sendemails=driver.find_element_by_xpath("//span[contains(text(),'发送')]")

  46. sendemails=driver.find_element_by_xpath("//span[contains(text(),'发送') and @class='nui-btn-text']")

  47. time.sleep(3)

  48. #校验邮件是否发送成功

  49. try:

  50. assert '发送成功' in driver.page_source

  51. except AssertionError:

  52. print '邮件发送成功'

  53. else:

  54. print '邮件发送失败'

  55. #调用退出模块

  56. Login().user_logout(driver)

收信用例:

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

  1. # coding=utf-8

  2. '''

  3. Created on 2016-7-27

  4. @author: Jennifer

  5. Project:接收邮件

  6. '''

  7. from selenium import webdriver

  8. import time

  9. from test_5_2_public import Login

  10. driver=webdriver.Firefox()

  11. driver.implicitly_wait(30)

  12. driver.get(r'http://www.126.com/') #字符串加r,防止转义。

  13. time.sleep(3)

  14. driver.switch_to.frame('x-URS-iframe')

  15. #调用登录模块

  16. Login().user_login(driver)

  17. time.sleep(10)

  18. #接收邮件

  19. #点击收信

  20. #以下定位是查找span标签有个文本(text)包含(contains)'收 信' 的元素,该定位方法重要

  21. driver.find_element_by_xpath("//span[contains(text(),'收 信')]").click()

  22. #校验是否进入收件箱,没报错即进入

  23. try:

  24. #点击其中一封邮件

  25. driver.find_element_by_xpath("//div[@sign='letter']").click()

  26. except Exception as e:

  27. print e

  28. else:

  29. print '成功收信'

  30. #调用退出模块

  31. Login().user_logout(driver

三、数据驱动测试

1.概念

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

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

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

2.优点

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

3.缺点

暂无

4.实例

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

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

 
  1. # coding=utf-8

  2. '''

  3. Created on 2016-7-28

  4. @author: Jennifer

  5. Project:数据驱动测试,数据保存在excel中,需要导入xlrd模块

  6. '''

  7. from selenium import webdriver

  8. import time

  9. import xlrd

  10. #将用户密码表格转换为用户密码列表

  11. def exceltolist(excelfile,colnameindex=0,by_index=0):

  12. excelfile=xlrd.open_workbook(excelfile) #打开excel表格

  13. # table = excelfile.sheets()[by_index] #默认获取sheet0页

  14. table = excelfile.sheet_by_index(by_index)#默认获取sheet0页

  15. nrows=table.nrows #获取excel的sheet0页的行数

  16. colnames=table.row_values(colnameindex) #默认获取第0行的列表数据:name和password两个值

  17. list =[] #建一个空列表,用来存放用户密码字典

  18. for rownum in range(1,nrows): #初始行为0,从第1行开始

  19. row = table.row_values(rownum) #获取某一行的列表数据

  20. if row:

  21. app = {} #建立一个空字典,存放某一组用户密码数据

  22. for i in range(len(colnames)): #目前是2

  23. app[colnames[i]] = row[i] #字典新增数据:循环两次,字典新增两对key-value

  24. list.append(app) #将新增的字典数据,添加到列表数据中

  25. return list

  26. def Login():

  27. file=r'D:\pythontest\rightpassword\userpassword.xls'

  28. userlist=exceltolist(file)

  29. for i in range(len(userlist)):

  30. driver=webdriver.Firefox()

  31. driver.get(r'http://www.126.com/') #字符串加r,防止转义。

  32. time.sleep(3)

  33. driver.switch_to.frame('x-URS-iframe') #同上面语句一样,跳转到iframe框架

  34. username=driver.find_element_by_name('email')

  35. username.clear()

  36. username.send_keys(userlist[i]['name'])

  37. time.sleep(0.1)

  38. userpasswd=driver.find_element_by_name('password')

  39. userpasswd.clear()

  40. userpasswd.send_keys(userlist[i]['password'])

  41. time.sleep(0.1)

  42. loginbt=driver.find_element_by_id('dologin')

  43. loginbt.click()

  44. time.sleep(3)

  45. try:

  46. assert '网易邮箱' in driver.title

  47. except AssertionError:

  48. print '用户%s邮箱登录失败'%(userlist[i]['name'])

  49. else:

  50. print '用户%s邮箱登录成功'%(userlist[i]['name'])

  51. finally:

  52. driver.quit()

  53. if __name__=='__main__':

  54. Login()

四、关键字驱动测试

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

在关键字驱动框架里,你可以创建一些关键字以及相关联的一些方法和函数。然后你创建一个函数库,它里面包含一个读取关键字的逻辑,然后调用相关的动作。

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

这种自动化测试的模型主要由核心数据驱动引擎、组件函数、支持库和应用映射表组成。自动化测试首先由初始脚本开始执行,这个脚本把高层测试表传递给高层驱 动器,高层驱动器在处理这些表的过程中,遇到中层测试表后就调用中层驱动器,中层驱动器处理中层表时也作类似的处理。当低层驱动器处理低层表时,它尝试着 使应用与测试保持同步。当低层驱动器遇到对某一个组件的低层关键字组件时,它判断这个组件的类型并调用相应的组件函数模块来处理这个指令操作。所有这些元 素都要依靠映射表中的信息,它是自动化测试模型和被测应用程序的桥梁。支持库主要完成一些文件处理,日志记录和邮件发送等等的功能。

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

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

相关文章

【JetPack】Navigation知识点总结

Navigation的主要元素&#xff1a; 1、Navigation Graph&#xff1a; 一种新的XML资源文件,包含应用程序所有的页面&#xff0c;以及页面间的关系。 <?xml version"1.0" encoding"utf-8"?> <navigation xmlns:android"http://schemas.a…

链表的详解

1.单链表 1.1概念与结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 现实中数据结构&#xff1a; 1.1.1结点 与顺序表不同的是&#xff0c;链表里的每节“车厢 ”都是独立申请下…

项目实战——高并发内存池

一.项目介绍 本项目——高并发内存池&#xff0c;是通过学习并模仿简化 google 的一个开源项目 tcmalloc &#xff0c;全称 Thread-Caching Malloc&#xff0c;即线程缓存的malloc&#xff0c;模拟实现了一个自己的高并发内存池&#xff0c;用于高效的多线程内存管理&#xff…

【魅力golang】之-通道

昨天发布了golang的最大特色之一--协程&#xff0c;与协程密不可分的是通道&#xff08;channel&#xff09;&#xff0c;用来充当协程间相互通信的角色。通道是一种内置的数据结构&#xff0c;所以才造就了golang强大的并发能力。今天风云来爬一爬通道的详细用法。 通道在gol…

【论文复现】农作物病害分类(Web端实现)

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 农作物病害分类 概述演示效果核心逻辑使用方式部署方式 概述 农作物病害是国家粮食安全的一个主要威胁&#xff0c;是决定农作物产量和质量的…

Linux网络——网络基础

Linux网络——网络基础 文章目录 Linux网络——网络基础一、计算机网络的发展背景1、网络的定义&#xff08;1&#xff09; 独立模式&#xff08;2&#xff09;网络互联 2、局域网 LAN3、广域网 WAN4、比较局域网和广域网5、扩展 —— 域域网和互联网 二、协议1、协议的概念2、…

Reactor

文章目录 正确的理解发送double free问题 1.把我们的reactor进行拆分2.链接管理3.Reactor的理论 listensock只需要设置_recv_cb&#xff0c;而其他sock&#xff0c;读&#xff0c;写&#xff0c;异常 所以今天写nullptr其实就不太对&#xff0c;添加为空就没办法去响应事件 获…

Linux -- 线程的优点、pthread 线程库

目录 线程的优点 pthread 线程库 前言 认识线程库 简单验证线程的独立栈空间 线程的优点 与进程之间的切换相比&#xff0c;线程之间的切换需要操作系统做的工作要少得多。 调度进程时&#xff0c;CPU 中有一个 cache&#xff08;缓存&#xff0c;提高运行效率&#xff0…

centos权限大集合,覆盖多种权限类型,解惑权限后有“. + t s”问题!

在 CentOS 系统中&#xff0c;权限管理是操作系统的核心功能之一&#xff0c;确保不同用户和进程对文件、目录以及设备的访问被合理控制。 权限系统主要包括传统的 Unix 权限模型、特殊权限&#xff08;SetUID、SetGID、Sticky 位&#xff09;和更精细的访问控制列表&#xff…

pyinstaller打包资源文件和ini配置文件怎么放

1.如果出现无法成功完成操作&#xff0c;因为文件包含病毒或潜在的垃圾软件&#xff0c;说明你的版本太高&#xff0c;更换pyinstaller版本。 pip install pyinstaller6.2.02.一开始打包的时windows下尽量选择打成文件夹的并且要是带命令行窗口的&#xff0c;容易查看错误。 …

五种msvcr100.dll丢失的解决方法,有效修复msvcr100.dll丢失错误!跟msvcr100.dll错误问题说拜拜!

在日常电脑使用过程中&#xff0c;尤其是运行某些应用程序或游戏时&#xff0c;可能会遇到“msvcr100.dll丢失”的错误提示。这个动态链接库&#xff08;DLL&#xff09;文件是Microsoft Visual C Redistributable for Visual Studio 2010的一部分&#xff0c;对于许多程序的正…

【前端】入门指南:Vue中使用Node.js进行数据库CRUD操作的详细步骤

&#x1f4a5; 欢迎来到我的博客&#xff01;很高兴能在这里与您相遇&#xff01; 首页&#xff1a;GPT-千鑫 – 热爱AI、热爱Python的天选打工人&#xff0c;活到老学到老&#xff01;&#xff01;&#xff01;导航 - 人工智能系列&#xff1a;包含 OpenAI API Key教程, 50个…

【网络安全产品大调研系列】1. 漏洞扫描

1. 为什么会出现漏扫技术&#xff1f; 每次黑客攻击事件进行追溯的时候&#xff0c;根据日志分析后&#xff0c;我们往往发现基本都是系统、Web、 弱口令、配置这四个方面中的其中一个出现的安全问题导致黑客可以轻松入侵的。 操作系统的版本滞后&#xff0c;没有更新补丁&am…

Java爬虫:速卖通(AliExpress)商品评论获取指南

引言 在当今的电商时代&#xff0c;商品评论对于消费者决策有着举足轻重的影响。速卖通&#xff08;AliExpress&#xff09;&#xff0c;作为全球知名的在线零售平台之一&#xff0c;拥有海量的商品评论数据。对于商家而言&#xff0c;能够高效地获取这些评论数据&#xff0c;…

AIDD - 探索语言模型在药物分子生成方面的应用

AIDD - 探索语言模型在药物分子生成方面的应用 今天给大家讲一篇2024年10月在nature communications上发表的一篇关于分子生成的文章。现有的分子生成方法中往往只关注药物的特定属性&#xff0c;导致其适用性受限。因此作者提出了TamGen方法&#xff0c;用于针对特定靶点的分子…

【每日学点鸿蒙知识】AVCodec、SmartPerf工具、web组件加载、监听键盘的显示隐藏、Asset Store Kit

1、AVCodec 硬解咨询&#xff1f; 在做视频播放硬解适配&#xff0c;这是 demo&#xff1a;https://gitee.com/openharmony-sig/ohos_videocompressor/blob/master/videoCompressor/src/main/cpp/video/decoder/VideoDec.cpp 请问&#xff1a; int32_t VideoDec::SetOutputS…

怎么设置电脑密码?Windows和Mac设置密码的方法

为电脑设置密码是保护个人信息安全的重要措施。无论是Windows系统还是MacOS系统&#xff0c;设置密码的步骤都相对简单&#xff0c;但需要根据不同的操作系统选择不同的方法。 一、Windows系统电脑密码设置 方法一&#xff1a;通过控制面板设置账户密码 点击桌面左下角的“开…

谷歌浏览器的网络安全检测工具介绍

作为全球最受欢迎的浏览器之一&#xff0c;谷歌浏览器不仅提供了快速、便捷的浏览体验&#xff0c;还内置了一系列强大的网络安全检测工具&#xff0c;帮助用户识别潜在的网络威胁&#xff0c;保护个人隐私和数据安全。本文将详细介绍谷歌浏览器中的几项关键网络安全检测功能&a…

一个比RTK或redux更轻量级更易使用的 React 第三方状态管理工具库的配置与使用

本文由作者 Samdy_Chan 原创,未经作者同意,请勿随意转载! 使用轻量级第三方的 React 状态管理库 zustand 管理共享状态数据 在 react 框架应用中,开发者应该大多数都是采用 redux 状态管理工具库来管理应用的共享状态数据,但用过 redux 的人都知道,其配置和使用相当复杂…

菜鸟带新鸟——基于EPlan2022的部件库制作

首先&#xff0c;我们需要了解一些概念&#xff1a; Eplan的部件制作内容 以上内容是制作一个完整的部件所需要的。如果公司要求没有那么严格&#xff0c;我们就可以制作1-4级的内容就可以满足日常的使用啦&#xff01; 部件的创建方式 部件创建方式有4类&#xff1a; 1、单…