概述

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

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

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

线性测试

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

脚本1

from selenium import webdriver

import time

from selenium.webdriver.common.keys import Keys

#打开浏览器

driver = webdriver.Ie()

driver.get('http://www.baidu.com')

#定位到搜索输入框,并输入内容查询

input=driver.find_element_by_id('kw')

input.send_keys('test')

input.send_keys(Keys.ENTER)

#退出浏览器

driver.quit()

脚本2

from selenium import webdriver

import time

from selenium.webdriver.common.keys import Keys

#打开浏览器

driver = webdriver.Ie()

driver.get('http://www.baidu.com')

#定位到搜索输入框,并输入内容查询

input=driver.find_element_by_id('kw')

input.send_keys('selenium')

input.send_keys(Keys.ENTER)

#退出浏览器

driver.quit()

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

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

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

模块化处理

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

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

脚本1:

def search(text):
#打开浏览器
driver = webdriver.Ie()
driver.get('http://www.baidu.com')
#定位到搜索输入框,并输入内容查询
input=driver.find_element_by_id('kw')
input.send_keys(text)
input.send_keys(Keys.ENTER)
#退出浏览器
driver.quit()
if __name__ == '__main__':
#定义要搜索的函数
text="selenium"
#调用search函数,进行搜索
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. spring容器IOC原理解析

    原理简单介绍: Spring容器的原理,其实就是通过解析xml文件,或取到用户配置的bean,然后通过反射将这些bean挨个放到集合中,然后对外提供一个getBean()方法,以便我们获得这些bean ...

  2. Mysql日期函数,时间函数使用的总结

    一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now() mysql> select now();+--------------------- ...

  3. java类加载器行为[笔记]

    1. Java虚拟机使用第一个类的第一件事情就是将该类的字节码装进来,装载类字节码的功能是由类装器完成的,类半遮器负责根据一个类的名称来定位和生成类的字节码数据后返回给Java虚拟机. 2. 类装载器 ...

  4. vc10的C2664和C2065错误

    在vs2010中编译一个普通的C++程序(Win32 Console Application),都会出现这两个错误! 究其原因是:我们已经习惯了VC6的种种简陋和不规范! 例如,下列程序在VC6中编译 ...

  5. 如何在编译内核时添加缺少的固件(随着intel wireless 5100 AGN的 iwlwifi 案例)

    我不知道你在笔记本使用 Linux 在内核编译无线wifi 不能用.我的书"关联 Y450"一个足够的旧书,随着无线网卡: $ lspci | grep Wireless 06:0 ...

  6. (转)javascript中 window.location= window.location;是什么意思

    重载当前页面.但是,重载后,一些$_GET或者$_POST $_REQUEST 表单提交的数据会清空.   重新加载当前页面的资源,就是刷新本页面

  7. 1230.2——iOS准备(阅读开发者文档时的笔记)

    1.程序启动的过程    .在桌面找到相应的应用的图标 点击图标    .main函数 UIApplication类Every app has exactly one instance of UIAp ...

  8. ES6 let和const命令

    一.let定义变量 { let a = 1;} console.log(a);只在let所在的代码块有效,console的结果是a is not defined,报错. 不存在var的变量提升,即使用 ...

  9. TextView之一:子类的常用属性

    TextView常见的子类包括EditText,Button,CheckBox, RadioButton等. 1.EditText EditText继承自TextView,因此TextView所有属性 ...

  10. js特殊字符转义

    点的转义:. ==> \\u002E 美元符号的转义:$ ==> \\u0024 乘方符号的转义:^ ==> \\u005E 左大括号的转义:{ ==> \\u007B 左方括 ...