概述

高内聚低耦合是软件设计的一个基本原则。

  • 内聚:从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。
  • 耦合:各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据,模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。

自动化测试模型也遵循上面的原则,下面从本人熟悉自动化测试的过程中来了解一下。

线性测试

先看两组脚本内容,实际应用过程中以百度进行示例

脚本1

  1. from selenium import webdriver
  2.  
  3. import time
  4.  
  5. from selenium.webdriver.common.keys import Keys
  6.  
  7. #打开浏览器
  8.  
  9. driver = webdriver.Ie()
  10.  
  11. driver.get('http://www.baidu.com')
  12.  
  13. #定位到搜索输入框,并输入内容查询
  14.  
  15. input=driver.find_element_by_id('kw')
  16.  
  17. input.send_keys('test')
  18.  
  19. input.send_keys(Keys.ENTER)
  20.  
  21. #退出浏览器
  22.  
  23. driver.quit()

脚本2

  1. from selenium import webdriver
  2.  
  3. import time
  4.  
  5. from selenium.webdriver.common.keys import Keys
  6.  
  7. #打开浏览器
  8.  
  9. driver = webdriver.Ie()
  10.  
  11. driver.get('http://www.baidu.com')
  12.  
  13. #定位到搜索输入框,并输入内容查询
  14.  
  15. input=driver.find_element_by_id('kw')
  16.  
  17. input.send_keys('selenium')
  18.  
  19. input.send_keys(Keys.ENTER)
  20.  
  21. #退出浏览器
  22.  
  23. driver.quit()

上面脚本1和脚本2的功能一致,区别在于,脚本1打开Ie搜索centerm,脚本2打开Ie搜索selenium。

通过上面的图中的脚本,我们发现它优势就是每一个脚本都是独立的,任何一个脚本文件拿出来就能单独运行;

但一个用例对应一个脚本,假如搜索页面发生变化,输入框的属性发生改变,不得不需要对每一个脚本进行修改,当测试用例规模较大时,可以预见大量的工作用于脚本的维护,从而失去自动化的意义,这种模式下脚本的没有可重复使用的概念。

模块化处理

模块化处理:即将常用的可复用的部分功能独立出来,变成一个公共函数,当其他地方有需要用到的时候,就调用,大大降低维护成本。

从上面的两个脚本分析,可以将搜索部分作为一个公共模块,将搜索的内容作为一个参数来传递,经过改造,脚本如下:

脚本1:

  1. def search(text):
  2. #打开浏览器
  3. driver = webdriver.Ie()
  4. driver.get('http://www.baidu.com')
  5. #定位到搜索输入框,并输入内容查询
  6. input=driver.find_element_by_id('kw')
  7. input.send_keys(text)
  8. input.send_keys(Keys.ENTER)
  9. #退出浏览器
  10. driver.quit()
  1. if __name__ == '__main__':
  2. #定义要搜索的函数
  3. text="selenium"
  4. #调用search函数,进行搜索
  5. search(text)

第一个脚本是将搜索功能作为一个公共模块,编写了一个函数,第二个脚本则是进行调用,这个如果搜索的数值发生变化,只需要修改第二个函数即可,不影响第一个脚本。

参数化

从上述改造后的脚本可以看出,已经节省了很大部分投入,但是在测试搜索功能的时候,不可能每一次测试都修改代码,再执行,这样也不能达到自动化的程度,所以引入了参数化的概念。

数据驱动应该是自动化的一个进步;从它的本意来讲,数据的改变(更新)驱动自动化的执行,从而引起测试结果的改变。这显然是一个非常“高级”的概念和想法。其实,我们可以直白的理解成参数化,输入数据的不同从而引起输出结果的变化。

对于后期维护来讲,完全不用更改测试代码,只需要维护参数化的数据表即可,一般参数化采用外部文件调用的方法

参考资料

http://www.cnblogs.com/jackei/archive/2012/11/25/2787231.html

http://www.cnblogs.com/jackei/archive/2012/11/25/2787231.html

Selenium模块化的更多相关文章

  1. selenium+python(模块化驱动测试)

    模块化驱动测试,就是借鉴编程语言中模块化的思想,把重复的操作独立成功公告模块,懂用例执行过程中需要用到这一模块操作时则被调用,这样可以极大的消除重复从而提高测试用例的可维护性 下面具体以126邮箱为例 ...

  2. Selenium(十四):自动化测试模型介绍、模块化驱动测试案例、数据驱动测试案例

    1. 自动化测试模型介绍 随着自动化测试技术的发展,演化为了集中模型:线性测试.模块化驱动测试.数据驱动测试和关键字驱动测试. 下面分别介绍这几种自动化测试模型的特点. 1.1 线性测试 通过录制或编 ...

  3. Selenium(八)测试用例的设计与模块化

    一.设计测试用例 1.分析我之前写的登录脚本: from selenium import webdriver import time from selenium.webdriver.common.ac ...

  4. selenium基础(脚本模块化)

    selenium基础(脚本模块化)

  5. selenium+Python 将登录模块化

      公共模块化:(登录) login.py   from selenium import webdriver from time import sleep   class login(): def u ...

  6. Python+Selenium 自动化实现实例-模块化调用

    public 目录存一些公共模块,供用例调用.login.py 内容如下: # coding=utf-8 import time # login def login(driver): driver.f ...

  7. Python3.5+selenium(11)脚本模块化&参数化

    mail126.py脚本如下 from selenium import webdriver from time import sleep from model1 import Login driver ...

  8. python selenium与自动化

    大学是学习过java,但是工作中没用,忘完了,而且哪怕以后有了机会,就是很不愿意去学这个语言,开始喜欢上了c#,但是随着学的升入,感觉.net太庞大了,要学习那么多,总感觉我学这个要做什么,感觉要做的 ...

  9. 自动化selenium开发

    一.开发环境搭建 1.Firefox浏览器 1.1 下载firefix并安装. 1.2 Firefox中打开"开始菜单“ -> ”开发者“ -> ”获取更多工具“ -> 搜 ...

随机推荐

  1. pyqt信号事件相关网址说明及python相关

    pyqt在线文档: http://www.rzcucc.com/search/pyqt.sourceforge.net/Docs/PyQt4/-qdatetime-2.html PyQT信号槽_学习笔 ...

  2. Handsontable对单元格的操作

    1.自动填充单元格数据 fillHandle:true/false    //当值为true时,允许拖动单元格右下角,将其值自动填充到选中的单元格 2.合并单元格 mergeCells:[{row:起 ...

  3. c++之 数组

    数组的定义 数组用于表示一组数值,例如: char arr[5]; 其中,arr称为"数组变量",简称"数组".它表示5个char型数据,我们把每一个数据称为一 ...

  4. 格而知之16:我所理解的Block(2)

    11.那么Block到底是怎么实现的呢?试一试通过将Block 的代码转换成普通C语言代码来查看它的实现过程. 要将OC代码转换成C语言代码,可以使用clang编译的一个命令: 通过这个命令能把指定文 ...

  5. 同一DataTable下创建多个结构数据相同的DataView的小问题

    昨天在根据经理的要求修改公司后台的时候,遇到了一个很奇怪的问题 DataView dvFocus = ]); DataView dvLook = ]); DataView dvNewUser = ]) ...

  6. App签名--- Android

    步骤: 下面就Next即可

  7. 关于Emit中动态类型TypeBuilder创建类标记的一点思考

      利用TypeBuilder是可以动态创建一个类型,现在有个需求,动态生成一个dll,创建类型EmployeeEx,需要继承原dll里面的Employee类,并包含Employee类上的所有类标记. ...

  8. Eclipse error:Access restriction

    报错:Access restriction: The method decodeBuffer(String) from the type CharacterDecoder is not accessi ...

  9. zoj Grouping(强连通+缩点+关键路径)

    题意: 给你N个人,M条年龄大小的关系,现在打算把这些人分成不同的集合,使得每个集合的任意两个人之间的年龄是不可比的.问你最小的集合数是多少? 分析: 首先,假设有一个环,那么这个环中的任意两个点之间 ...

  10. hdu1443(约瑟夫环游戏的原理 用链表过的)

    Problem Description The Joseph's problem is notoriously known. For those who are not familiar with t ...