文章目录
一、 手工测试与自动化测试
关于软件测试领域名词颇多,发现有许多测试新手混淆概念,从不同的角度可以将软件测试有不同的分类的方法;所以,这里汇总常见软件测试的相关名词,对软件测试领域有个概括的了解。
根据项目流程阶段划分软件测试

上图是一个典型“V”模型软件开发流程,那么各项软件测试工作是在项目开发流程中循序渐进进行的。下面将介绍各个阶段测试的含义。
手工测试
手工测试就是由人去一个一个的去执行测试用例,通过键盘鼠标等输入一些参数,查看返回结果是否符合预期结果。
手工测试并不非专业术语,手工测试通常是指我们在系统测试阶段所进行的功能测试,为了更明显的与自动化测试进行区分,所以这里使用了手工测试。
自动化测试
自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。
自动化测试又可分为:功能自动化测试与性能自动化测试。
我们一般所说的自动化测试就是指功能自动化测试,通过相关的测试技术,通过编码的方式用一段程序来测试一个软件的功能,这样就可以重复执行程序来进行重复的测试。如果一个软件一小部分发生改变,我们只要修改一部分自动化测试代码,就可以重复的对整个软件进行功能测试;从而大大的提高了测试效率。
性能自动化测试,当然,除了早期阶段,现在的性能测试工作都是通过性能测试工具辅助完成的。通过工具可以模拟成千上万的用户向系统发送请求,用来验证系统的处理能力。
点击领取辅助学习资料
二、自动化测试语言的选择
通过前面的介绍,我们了解到 selenium webdriver 支持多种语言的开发,java、python、ruby、php、C#、JavaScript 等,那么我们应该选择哪一种语言结合 selenium webdriver 进行开发呢?这里笔者给出一点自己的看法。
有同学说我们公司的软件是用某种语言开发,自动化也要选某语言;其实从本质上来说,使用软件开发语言和自动化开发语言没有任何联系。所以,在选择语言进行自动化测试时不要有这方面的顾虑。从个人来讲,自动化测试所用到代码与开发人员相同,自己的编码能力一般没开发人员强,会糟鄙视,从而也降低了自身的不可替代性。
选择与开发相同的语言当然也有有利的一面,测试人员通过自动化测试的实践,提高了自己的编码能力,也有助于其它测试工作的进行,比如,协助开发人员定位代码级的 bug, 协助开发人员进行接口测试
等。
本书并没有向前面几本 selenium 书选用应用更为广泛的 java 、C# ,而是选用了 python,主要有以下几个方面考虑。
对于编程能力比较弱的初学者来说,python 与 ruby 等语言更容易学习和使用。通过自动化测试技术的实践,我们不仅掌握了自动化测试技术,从而也掌握一门语法简单且功能强大的脚本语言。(本书中对涉及到的 python 知识都会做详细的讲解,所以没有 python 基础的同学完全不用担心),那为什么不选 ruby而选 python 呢?从笔者角度来看,python 语言除了在自动化测试领域有出色的表现外,在系统编程,网络编程,web 开发,GUI 开发,科学计算,游戏开发等多个领域应用非常广泛,而且具有非常良好的社区支持。也就是说学习和掌握 python 编程,其实是为你打开了一道更广阔的大门。ruby 是一个“魔法”语言,时常会给你带来很多惊喜,python 的宗旨是使处理问题变得更简单,而且格式严谨,在协同编程时
不容易产生混乱。所以,综合考虑笔者认为 python 更适合测试菜鸟的养成计划。
那么对于有编程经验的同学,学习 python 对你来说几乎没有任何成本,你完全可以在很短的时间内学习和使用 python 处理问题,有一个看上去还不错的一门语言,为什么不去尝试使用一下呢!?当然,对于非常“专一”的同学,只愿意选择自己熟悉的语言,而不愿意尝试使用新语言,那么本更多的是传递你处理问题的思路,虽然编程语言的语法有差异,但仍然可以对你的自动化工作提供解决问题的思路。
虽然本书中涉及到 python 的知识都会进行讲解,但为了你能系统全面的使用 python 语言,笔者建议准备好一本 python 基础教程在身边,以便有疑问的地方随时翻阅学习。
三、python webdriver 环境搭建
第一节 环境搭建
准备工具如下:
下载 python【python 开发环境】http://python.org/getit/
下载 setuptools 【python 的基础包工具】http://pypi.python.org/pypi/setuptools
下载 pip 【python 的安装包管理工具】https://pypi.python.org/pypi/pip
要想使用 python 语言开发,首先需要 python 开发环境,需要说明的是 python 目前最新版本分:2.7.x和3.3.x(简称 python 2 和 python 3);python 3 并非完全的向下兼容 python 2 ,语法上也有较大的差异。python 3在性能上更加优秀,但由于 python 2多年的发展,大量的类库、框架是基于 python 2,所以,目前两个版本都在维护更新。笔者推荐新手从 python 2开始学习 python,因为有丰富的资料、类库和框架给我们学习和使用。当然,随着时间的推移,python 3 才是 python 发展的未来。
setuptools 是 python 的基础包工具,可以帮助我们轻松的下载,构建,安装,升级,卸载 python的软件包。
pip 是python软件包的安装和管理工具,有了这个工具,我们只需要一个命令就可以轻松的python 的任意类库。
windows 环境安装
第一步、 安装 python 的开发环境包,选择需要安装路径进行安装,笔者下载的是目前最新的python2.7.5版本,安装目录为:C:\Python27。
第 二 步 、 安 装 setuptools 通 过 前 面 提 供 的 setuptools 的 连 接 , 拖 动 页 面 到 底 部 找 到 ,setuptools-1.3.2.tar.gz 文件(版本随着时间版本会有更新),对文件进行解压,找到 ez_install.py文件,进入 windows 命令提示(开始–运行–cmd 命令,回车)下执行 ez_install.py:
C:\setuptools-1.3>python ez_install.py
如果提示 python 不是内部或外部命令!别急,去添加一下 python 的环境变量吧!桌面“我的电脑”右键菜单–>属性–>高级–>环境变量–>系统变量中的 Path 为:
变量名:PATH
变量值:;C:\Python27
第三步、 安装 pip ,通过上面提供的链接下载 pip-1.4.1.tar.gz(版本随着时间版本会有更新),我默认解压在了 C:\pip-1.4.1 目录下,打开命令提示符(开始–运行–cmd 命令,回车)进入 C:\pip-1.4.1目录下输入:
C:\pip-1.4.1 > python setup.py install
再切换到 C:\Python27\Scripts 目录下输入:
C:\Python27\Scripts > easy_install pip
第四步、 安装 selenium,如果是电脑处于联网状态的话,可以直接在 C:\Python27\Scripts 下输入
命令安装:
C:\Python27\Scripts > pip install -U selenium
如果没联网,可以通过下载安装:
selenium 下载地址: https://pypi.python.org/pypi/selenium
下载 selenium 2.33.0 (目前的最新版本),并解压把整个目录放到 C:\Python27\Lib\site-packages目录下。
linux 环境安装
下面以 unbuntu 为例进行安装,其它版本的 linux 可能会有所差异,在绝大多数 linux 和 UNIX 系统安装中(包括 Mac OS X),Python 的解释器就已经存在了。我们需要做的就是打开终端,输入 python 命令进行验证,这里不再介绍 python 的安装。
第一步、安装:setuptoolsroot@fnngj-H24X:~# apt-get install python-setuptools
第二步、安装 pip下载 pip 安装文件,切换到文件目录,对其进行解压:
root@fnngj-H24X:/home/user/python# tar -zxvf pip-1.4.1.tar.gz
切换到解压目录:
root@fnngj-H24X:/home/user/python# cd pip-1.4.1/
进行 pip 的安装
root@fnngj-H24X:/home/user/python/pip-1.4.1# python setup.py install
第三步、安装 seleniumroot@fnngj-H24X:/home/user/python/pip-1.4.1# pip install -U selenium
四、浏览器的操作
浏览器最大化
在统一的浏览器大小下运行用例,可以比较容易的跟一些基于图像比对的工具进行结合,提升测试的灵活性及普遍适用性。比如可以跟 sikuli 结合,使用 sikuli 操作 flash。

设置浏览器宽、高
在不同的浏览器大小下访问测试站点,对测试页面截图并保存,然后观察或使用图像比对工具对被测页面的前端样式进行评测。比如可以将浏览器设置成移动端大小(320x480),然后访问移动站点,对其样式进行评估;
控制浏览器前进、后退
浏览器上有一个后退、前进按钮,对于浏览网页的人是比较方便的;对于 web 自动化测试来说是一个比较难模拟的操作;webdriver 提供了 back()和 forward()方法,使实现这个操作变得非常简单。

为了使脚本的执行过程看得更清晰,在每一步操作上都加了 print 来打印当前的 URL 地址。
运行结果如下:
实际测试中,这两个功能平时很少被使用,笔者所能想到的场景就是几个页面来回跳转,但又不想用get url 的情况下。
python 基础知识补充:
下面打开 python shell 做以下练习:
在 python 2 中使用 print 语句进行打印输出,如果是字符信息的话需要对打印的信息加单引号(‘’)或双引号(“”),它们本质上没有任何区别,不过使用引号时必须要成对出现。
上面的例子中我们定义一个字符串变量 name 和一个数据变量 age,要想在 print 打印字符串中引用这两个变量就要用到“格式化字符串”的东西,在 print 打印字符串中指定变量类型,“%s”表示输出的类型为字符串,“%d”表示输出类型为整型数字。
name 为字符串类型,我们用%d 来指定输出类型就会报错。如果我们不确定变量类型的话可以使用%r,它的含义是“不管什么都打印出来。
五、简单对象的定位
点击领取辅助学习资料
对象(元素)的定位和操作是自动化测试的核心部分,其中操作又是建立在定位的基础上的,因此元素定位就显得非常重要。(本书中用到的对象与元素同为一个事物)
一个对象就像是一个人,他会有各种的特征(属性),如比我们可以通过一个人的身份证号、姓名或者他的住址找到这个人。那么一个元素也有类似的属性,我们可以通过这种唯一区别于其它元素的属性来定位这个元素。当然,除了要操作元素时需要定位元素外,有时候我们只是为了获得元素的属性(class 属性,name 属性)、text 或数量也需要定位元素。
webdriver 提供了一系列的元素定位方法,常用的有以下几种
- id
- name
- class name
- tag name
- link text
- partial link text
- xpath
- css selector
分别对应 python webdriver 中的方法为:
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
id 和 name 定位
id 和 name 是我们最常用的定位方式,因为大多数元素都有这两个属性,而且在对控件的 id 和 name命名时一般使其有意义也会取不同的名字。通过这两个属性使我们找一个页面上的属性变得相当容易。

通过元素中所带的 id 和 name 属性对元素进行定位:
id=”gs_htif0” find_element_by_id(“gs_htif0”)
name=”btnK”
find_element_by_name(“btnK”)
name=”btnI”
find_element_by_name(“btnI”)
tag name 和 class name 定位
不是所有的前端开发人员都喜欢为每一个元素添加 id 和 name 两个属性,但除此之外你一定发现了一个元素不单单只有 id 和 name,它还有 class 属性;而且每个元素都会有标签。

通过元素中带的 class 属性对元素进行定位:
class=”jhp_big”
find_element_by_class_name(“jhp_big”)
class=”s_ipt”
find_element_by_class_name(“s_ipt”)
通过 tag 标签名对对元素进行定位:

tag name 定位应该是所有定位方式中最不靠谱的一种了,因为在一个页面中具有相同 tag name 的元素极其容易出现。
link text 与 partial link text 定位
有时候需要操作的元素是一个文字链接,那么我们可以通过 link text 或 partial link text 进行元素定位。
通过 link text 定位元素:
find_element_by_link_text(“新 闻”)
find_element_by_link_text(“贴 吧”)
find_element_by_link_text(“一个很长的文字连接”)
通 partial link text 也可以定位到上面几个元素:
find_element_by_partial_link_text(“新”)
find_element_by_partial_link_text(“吧”)
find_element_by_partial_link_text(“一个很长的”)
当一个文字连接很长时,我们可以只取其中的一部分,只要取的部分可以唯一标识元素。一般一个页面上不会出现相同的文件链接,通过文字链接来定位元素也是一种简单有效的定位方式。
下面介绍 xpath 与 CSS 定位相比上面介绍的方式来说比较难理解,但他们的灵活性与定位能力比上面的方式要强大。
XPath 定位
XPath 是一种在 XML 文档中定位元素的语言。因为 HTML 可以看做 XML 的一种实现,所以 selenium 用户可是使用这种强大语言在 web 应用中定位元素。
XPath 扩展了上面 id 和 name 定位方式,提供了很多种可能性,比如定位页面上的第三个多选框。

我们看到的是一个有层级关系页面,下面我看看如果用 xpath 来定位最后一个元素。
用绝对路径定位:
find_element_by_xpath("/html/body/div[2]/form/span/input")
当我们所要定位的元素很难找到合适的方式时,都可以通这种绝对路径的方式位,缺点是当元素在很
多级目录下时,我们不得不要写很长的路径,而且这种方式难以阅读和维护。
相对路径定位:
find_element_by_xpath("//input[@id=’input’]") #通过自身的 id 属性定位
find_element_by_xpath("//span[@id=’input-container’]/input") #通过上一级目录的id属性定位
find_element_by_xpath("//div[@id=’hd’]/form/span/input") #通过上三级目录的 id 属性定位
find_element_by_xpath("//div[@name=’q’]/form/span/input")#通过上三级目录的 name 属性定位
通过上面的例子,我们可以看到 XPath 的定位方式非常灵活和强大的,而且 XPath 可以做布尔逻辑运算,例如://div[@id=’hd’ or @name=’q’]
当然,它的缺陷也非常明显:
1、性能差,定位元素的性能要比其它大多数方式差;
2、不够健壮,XPath会随着页面元素布局的改变而改变;
3. 兼容性不好,在不同的浏览器下对 XPath 的实现是不一样的。
通过我们第一章中介绍的 firebug 的 HTML 和 firePath 可以非常方便的通过 XPath 方式对页面元素进行定位。
打开 firefox 浏览器的 firebug 插件,点击插件左上角的鼠标箭头,再点击页面上的元素,firebug插件的 HTML 标签页将看到页面代码,鼠标移动到元素的标签上将显示当前元素的绝对路径。
或者直接在元素上右击弹出快捷菜单,选择 Copy XPath,将当前元素的 XPath 路径拷贝要脚本本中
firePath 工具的使用就更加方便和快捷了,选中元素后,直接在 XPath 的输入框中显示当前元素的XPath 的定位信息
CSS 定位
CSS(Cascading Style Sheets)是一种语言,它被用来描述 HTML 和 XML 文档的表现。CSS 使用选择器来为页面元素绑定属性。这些选择器可以被 selenium 用作另外的定位策略。
CSS 可以比较灵活选择控件的任意属性,一般情况下定位速度要比 XPath 快,但对于初学者来说比较难以学习使用,下面我们就详细的介绍 CSS 的语法与使用。



css 中的结构性定位
结构性定位就是根据元素的父子、同级中位置来定位,css3标准中有定义一些结构性定位伪类如nth-of-type,nth-child,但是使用起来语法很不好理解,这里就不做介绍了。
Selenium 中则是采用了来自 Sizzle 的 css3定位扩展,它的语法更加灵活易懂。
Sizzle Css3的结构性定位语法:



Sizzle Css3还提供一些直接选取 form 表单元素的伪类:
:input: Finds all input elements (includes textareas, selects, and buttons).
:text, :checkbox, :file, :password, :submit, :image, :reset, :button: Finds the input element
with the specified input type (:button also finds button elements).
通过对比,我们可以看到,CSS 定位语法比 XPath 更为简洁,定位方式更多灵活多样;不过对 CSS 理解起来要比 XPath 较难;但不管是从性能还是定位更复杂的元素上,CSS 优于 XPath,笔者更推荐使用 CSS定位页面元素。
关于自动化的定位问题
自动化测试的元素定位一直是困扰自动化测试新手的一个障碍,因为我们在自动化实施过程中会碰到各式各样的对象元素。虽然 XPath 和 CSS 可以定位到复杂且比较难定位的元素,但相比较用 id 和 name 来说增加了维护成本和学习成本,相比较来说 id/name 的定位方式更直观和可维护,有新的成员加入的自动化时也增加了人员的学习成本。所以,测试人员在实施自动化测试时一定要做好沟通,规范前端开发人员对元素添加 id/name 属性,或者自己有修改 HTML 代码的权限。
六自动化测试模型介绍
自动化测试模型是自动化测试架构的基础,自动化测试的发展也经历的不同的阶段,不断有新的模型(概念)被提出,了解和使用这些自动化模型将帮助我们构建一个灵活可维护性的自动化架构。
线性测试
通过录制或编写脚本,一个脚本完成一个场景(一组完整功能操作),通过对脚本的回放来进行自动化测试。
这是早期进行自动化测试的一种形式;我们在上一章中练习使用webdriver API 所编写的脚本也是这种形式。


通过上面的两个脚本,我们发现它优势就是每一个脚本都是独立的,任何一个脚本文件拿出来就能单独运行;当然,缺点也很明显,用例的开发与维护成本很高:
一个用例对应一个脚本,假如登陆发生变化,用户名的属性发生改变,不得不需要对每一个脚本进行修改,测试用例形成一种规模,我们可能将大量的工作用于脚本的维护,从而失去自动化的意义。
这种模式下数据和脚本是混在一起的,如果数据发生变也需要对脚本进行修改。这种模式下脚本的没 有可重复使用的概念。
模块化与类库
我们会清晰的发现在上面的脚本中,其实有不少内容是重复的;于是我们就考虑能不能把重复的部分写成一个公共的模块,需要的时候进行调用,这样就大大提高了我们编写脚本的效率。
测试用例
注意,上面用例非完整代码。
通过阅读上面的代码发现,我们可以把脚本中相同的部分代码独立出来,形成模块或库;这样做有两
方面的优点:
一方面提高了开发效率,不用重复的编写相同的脚本;假如,我已经写好一个登录模块,我后续需要做的就是在需要的地方调用,不同重复造轮子。
另一方面方便了代码的维护,假如登录模块发生了变化,我只用修改 login.py 文件中登录模块的代码即可,那么所有调用登录模块的脚本不用做任何修改。
关键字驱动
理解了数据驱动,无非是把“数据”换成“关键字”,通过关键字的改变引起测试结果的改变。
关键字驱动用编程方式就不太容易表现了。QTP、robot framework 等都是以关键字驱动为主的自动化工具,因为这类工具主打的易用性,“填表格”式的关键字驱动帮我们封装了很多底层的东西,我们只要考虑三个问题就可以了:我要做什么? 对谁做?怎么做?
我们可以把 selenium IDE 看做是一种关键字驱动的自动化工具。
理解了数据驱动,无非是把“数据”换成“关键字”,通过关键字的改变引起测试结果的改变。
关键字驱动用编程方式就不太容易表现了。QTP、robot framework 等都是以关键字驱动为主的自动化工具,因为这类工具主打的易用性,“填表格”式的关键字驱动帮我们封装了很多底层的东西,我们只要考虑三个问题就可以了:我要做什么? 对谁做?怎么做?。
我们可以把 selenium IDE 看做是一种关键字驱动的自动化工具。
自动化脚本转化成表格是这样的:
Selenium IDE 脚本分:命令(command)、对象(target)、值(value)
通过这样的格式去描述不同的对象,从而引起最终结果的改变。也就是说一切以对象为出发点。当然,这样的脚本,显然对于不懂代码的同学非常直观!我要做什么(命令)?对谁做(对象)?怎么做(值)?
更高级的关键字驱动,可以自己定义 keyword 然后“注册”到框架;从而实现更强大的功能和扩展性。
小结
