Selenium 与自动化测试 —— 《Selenium 2 自动化测试实战》读书笔记

时间:2024-04-15 20:36:46

背景


最近在弄 appium,然后顺便发现了 Selenium 框架和这本书,恰好这本书也介绍了一些软件测试&自动化测试的理论知识,遂拿过来学习学习。所以本文几乎没有实践内容,大多都是概念和工具的 mark,后续若有实践,我会来补充的。

一、软件测试 分类


1、根据项目流程阶段划分

  • 需求分析

  • 设计

  • 编码

  • 单元测试

  • 集成测试

  • 系统测试

  • 验收测试

Selenium 与自动化测试 —— 《Selenium 2 自动化测试实战》读书笔记

2、白盒测试、黑盒测试、灰盒测试

白盒测试的意义:有时候输出是正确的,但内部其实已经错误了,这种情况非常多。

灰盒测试的意义:如果每次都通过白盒测试来操作,效率会很低,黑盒又太过笼统,因此折中的灰盒测试比较适合。

3、功能测试与性能测试

功能测试主要检査实际功能是否符合用户的需求。

功能测试又可以细分为很多种:逻辑功能測试、界面测试、易用性测试、安装测试、兼容性测试等。

性能测试主要有时间性能空间性能两种。

时间性能:主要是指软件的一个具体的响应时间。

空间性能:主要指软件运行时所消耗的系统资源。

4、手工测试与自动化测试

自动化测试不能完全地替代手工测试,自动化测试的目的仅仅在于让测试人员从烦琐重复的测试过程中解脱出来,把更多的时间和精力放到更有价值的测试中,例如探索性测试。而自动化测试更多的是用来进行冒烟测试和回归测试。

自动化测试是本文要探讨的重点。

5、冒烟测试、回归测试、随机测试、探索性测试和安全测试

冒烟测试:引入到软件测试中,就是指测试小组在正式测试一个新版本之前,先投入较少的人力和时间验证一个软件的主要功能,如果主要功能都没有运行通过,则打回开发组重新开发。这样做的好处是可以节省时间和人力投入到不可测的项目中。

回归测试:回归测试是指修改了旧代码后,重新进行测试以确认修改后没有引入新的错误或导致其他代码产生错误。

随机测试

探索性测试

安全测试

6、正向测试与逆向测试

正向测试用例 (Positive Test Case) 和反向测试用例 (Negtive test Case) 是对测试用例的一种分类。

例如:一个输入只能接受输入数字0-9,那么正向用例可以为:0,1,2,3,4,5,6,7,8,9,反向用例可以为:其它值。

反向测试用例通常指,系统不支持的输入或则状态,这类用例可以检查系统的容错能力、健壮性和可靠性。

二、何为自动化测试


自动化测试的概念有广义与狭义之分:广义上来讲,所有借助工具来辅助进行软件测试的方式都可以称为自动化测试:狭义上来讲,主要指基于 UI 层的功能自动化测试

注意:如果没有特别说明,则本文所说的“自动化测试”均指“基于 UI 的功能自动化测试”。

三、自动化测试 与 分层模型


1、测试金字塔

不同测试阶段所投入的自动化测试的比例:Unit > Service > UI。

Selenium 与自动化测试 —— 《Selenium 2 自动化测试实战》读书笔记

2、Unit 层

单元测试:单元就是人为规定的最小的被测功能模块。规范的进行单元测试需要借助单元测试框架,如 Java 语言的 Junit、TESTNG, C# 语言的 Nunit,以及 Python 语言的 unittest、pytest 等,目前几乎所有的主流语言都有其相应的单元测试框架。

Code Review:与 Code Review 相关的插件和工具有很多,例如 Java 语言中基于 Eclipse 的 Review Clipse 和 Jupiter、主要针对 Python 语言的 Review Board 等。

现在因为 github/gitlab 的流行, 以前的工具用的很少了。不排除大厂用一些更专业的工具。

拓展:Code Review

目的:

1、改善代码质量

一些很基础的,比如缩进空格什么的,就交给 eslint 什么的去解决吧。

2、保证团队代码规范

3、提高代码性能

4、预防 bug

5、加深技术团队成员沟通,营造技术氛围

6、老带新互助成长

实践建议:

1、所有代码都必须经过 Review 才能 merge。

2、批评的时候最好同时给解决方案

3、每次 review 至少给一条正面评价,提高对方信心

4、不要在 review 中讨论需求

5、不要在 review 中讨论太多的架构或者设计模式,这个应该是在前期设计时解决的事

普及情况:

Code Review 做得好的普遍是一些比较偏技术的团队,而偏业务的技术团队比较少。

我们公司也很少做其实。

3、Service 层

接口测试:也有相应的类库或工具,例如测试 HTTP 的有 Httpunit、Postman 等。

4、UI 层

UI 自动化测试:目前主流的测试工具有 UFT、Watir、Robot Framework、Selenium 等。

JS 自动化测试:Qunit 就是针对 Javascript 的一个强大的单元测试框架,由jQuery团队的成员所开发,并且用在jQuery,jQuery UI,jQuery Mobile等项目。

其实这个也是单元测试,但是因为是前端,所以归到了 UI 这边。

四、什么样的项目适合自动化测试


(1)软件需求变动不频繁

或者一种折中的做法是先对系统中相对稳定的模块与功能进行自动化测试,而变动较大的部分用手工进行测试。

(2)项目周期较长

(3)自动化测试脚本可重复使用

(4)等等

五、自动化测试模型


1、线性测试

最原始的方法,测试用例之间可能会存在重复的操作,会导致开发成本和维护成本都很高。

2、模块化驱动测试

很好地解决了脚本的重复问题。

3、数据驱动測试

因为输入数据的不同从而引起输出结果的不同。实现了数据与脚本的分离。

4、关键字驱动测试

理解了数据驱动后,无非是把“数据”换成“关键字”,通过关键字的改变引起测试结果的改变

好处:

目前市面上典型关键字驱动工具以 QTP(目前已更名为 UFT- Unified Functional Testing)、Robot Framework (RIDE)工具为主。这类工具封装了底层的代码,提供给用户独立的图形界面,以“填表格”的形式免除测试人员对写代码的恐惧,从而降低脚本的编写难度,我们只需使用工具所提供的关键字以“过程式”的方式来编写用例即可。

坏处:

关键字驱动也可以像写代码一样写用例,在编程的世界中,没有什么不能做:不过这样的用例同样需要较高的学习成本,与学习一门编程语言几乎相当。这样的框架越到后期越难维护,可靠性也会变差,关键字的用途与经验被局限在自己的框架内,你所学到的知识也很难重用到其他地方。所以,从测试人员的经验与技术积累价值来讲,笔者更倾向于直接通过编程的方式开发自动化脚本。

六、自动化测试工具 - selenium 2(UI层)


本章实操部分省略,后续若有实践,会适当补充。

有人说我们公司的软件是用某语言开发的,所以自动化测试也要选某语言:其实软件开发语言和软件自动化测试语言没有必然联系。也就是说,基于 Python (+ Selenium)编写的自动化测试脚本既可以测试基于 Java 开发的 Web 项目,也可以测试基于 PHP 开发的 Web 项目。所以,在选择 Selenium 自动化测试语言时不需要考虑与开发语言的一致性。

1、什么是 selenium 2

selenium 2 是 web 浏览器自动化测试框架。

下文的 selenium 默认都指 selenium 2。

虽然 selenium 支持 Android 自动化测试,但更推荐 Appium, Appium 是 selenium 的延伸,基本上可以视为 “Selenium for Apps”,因为它也是基于 Selenium 的 Webdriver 技术开发的。

2、selenium 历史

selenium (selenium 1) 和 webdriver 原来是两个不同的开源项目,但在 selenium 2 的时候,将selenium 与 webdriver 合并了,即:

selenium 2 = webdriver + selenium 1

所以 selenium 2 可以等价为 webdriver ,对于 Selenium 2 的学习,其实是对 WebDriver API 的学习。

3、selenium 的支持模式

selenium 支持 HtmlUnitPhantomJS 两个模式。

Phantom JS 是一个拥有 Javascript API 的*面 Webkit 内核,与 Htmlunit 类似,但比它更高级一些。

通过 HtmlUnit 或 Phantom JS 进行的自动化测试运行不会真正打开一个浏览器,在我们看来,可见的东西才会觉得是真实的,需要的时候,可以调用截图的 api。

4、安装 selenium

pip3 install selenium

5、常用功能

  • 控制浏览器:如调整窗口大小

  • 找元素(定位)

  • 操作元素

  • 鼠标事件

  • 键盘事件

  • 设置元素等待

  • 多 frame、iframe 切换 / 多窗口切换

    调用switch_to.frame()switch_to.window()

  • 处理警告框
    如接受警告框:driver.switch_to_alert().accept()

  • 上传/下载文件
    更复杂的上传/下载需要编写 Autoit 脚本

  • 操作 Cookie

  • 调用 JS
    调用 execute_script()

6、Selenium IDE

通过浏览器插件的形式提供。

Selenium 与自动化测试 —— 《Selenium 2 自动化测试实战》读书笔记

功能点备注:

1、断言和验证的区别:与断言相比,当执行验证命令失败后不会终止测试。

2、pause 和 waitfor 的区别: pause 来设置固定时间的体眠,而 waitfor 则用于在一定时间内等待某一元素显示。

3、支持将录制内容导出为代码,支持类型如下:

Ruby/Rspec/Webdriver

Ruby/Rspec/Remote Control

Ruby/Test: Unit/ Webdriver

Ruby/Test: Unit/Remote Control

Python/unittest/Webdriver

Python/unittest/Remote Control

Java/Junit4/Webdriver

Java/Junit4/Webdriver Backed

Java/Junit4/Remote Control

Java/Junit3/Remote Control

Java/TESTNG/Remote Control

C#/Nunit/Webdriver

C#/Nunit/Remote Control

7、Selenium Grid 2

(1)介绍

利用 Selenium Grid 2 可以在不同的主机上建立主节点(hub)和分支节点(node),可以使主节点上的测试用例在不同的分支节点上运行。对不同的节点来说,可以搭建不同的测试环境(操作系统、浏览器),从而使一份测试用例得到不同环境下的执行结果。

(2)安装

Selenium Grid 2 的时候,不再提供单独的包,其功能已经集成到 Selenium Server 中,所以,需要下载和运行 Selenium Server オ可以使用 Grid 2 的功能。

下文中 Selenium Grid 2 都简称为 Selenium Grid。

(3)缺点与改进

Selenium Grid 只是提供多系统、多浏览器的执行环境,Selenium Grid 本身并不提供并行的执行测试用例。所以建议使用多线程技术结合 Selenium Grid 实现分布式并行地执行测试用例

七、 自动化测试工具 - unittest(python单元测试框架)


在 Python 语言下有诸多单元測试框架,如 doctest、unittest、pytest、nose 等,unittest 框架(原名 Pyunit 框架)为 Python 语言自带的单元测试框架,Python2.1 及其以后的版本已将 unittest 作为一个标准模块放入 Python 开发包中。

1、概念

单元测试本身就是通过一段代码去验证另一段代码。

(1)Test Case

一个 Testcase 的实例就是一个测试用例

  • 一个用例为一个完整的场景,从用户登录系统到最终退出并关闭浏览器。

  • 一个用例只验证一个功能点,不要试图在用户登录系统后把所有的功能都验证一遍。

  • 用例与用例之间尽量避免产生依赖

  • 一条用例完成测试之后需要对测试场景进行还原,以免影响其他用例的执行。

(2)Test Suite

一个功能的验证往往需要多个测试用例,可以把多个测试用例集合在一起来执行,这就产生了测试套件Testsuite 的概念。

(3)Test Runner

包含执行策略和执行结果。

(4)Test Fixture

对一个测试用例环境的搭建和销毁,就是一个 fixture。

2、使用

待写

3、生成 HTML 测试报告

HTMLTestRunner 是 unittest 的一个扩展,它生成易于使用的 HTML 测试报告。

待写

4、缺点

跟上面说的 Selenium Gird 一样,unittest 单元测试框架本身并不支持多线程技术,它不能像 Java 的 TESTNG 框架一样通过简单的配置就可以使用多线程技术执行测试用例。

八、自动化测试高级应用


1、自动发邮件功能

SMTP (Simple Mail Transfer Protocol)是简单邮件传输协议。

Python 的 smtplib 模块提供了一种很方便的途径用来发送电子邮件。

可用于如测试时结果的告知。

2、Page Object 设计模式

Page 对象(Page Object)的一个基本经验法则是:凡是人能做的事,page 对象通过软件客户端都能够做到。因此,它也应当提供一个易于编程的接口并隐藏窗口中底层的部件。所以访问一个文本框应该通过一个访问方法(accessor method)来实现字符串的获取与返回,复选框应当使用布尔值,按钮应当被表示为行为导向的方法名。page 对象应当将在 GUI 控件上所有查询和操作数据的行为封装为方法。一个好的经验法则是,即使改变具体的控件,paee 对象的接口也不应当发生变化。

也可以建立一个 base 的 Page 对象,让别的 page 继承它。

很像面向对象编程思想里的接口与实现。

九、自动化测试项目实战


待写