《Selenium 2 自动化测试实战》读书笔记_selenium2自动化测试实战-程序员宅基地

技术标签: 自动化测试  selenium  软件测试  测试工具  职场和发展  

背景

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

一、软件测试 分类

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

  • 需求分析

  • 设计

  • 编码

  • 单元测试

  • 集成测试

  • 系统测试

  • 验收测试

在这里插入图片描述

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。

在这里插入图片描述

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 支持 HtmlUnit 和 PhantomJS 两个模式。

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

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

在这里插入图片描述

功能点备注:

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 继承它。

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


最后

如果你想学习自动化测试,那么下面这套视频应该会帮到你很多

如何逼自己1个月学完自动化测试,学完即就业,小白也能信手拈来,拿走不谢,允许白嫖....

最后我这里给你们分享一下我所积累和整理的一些文档和学习资料,有需要直接领取就可以了!


以上内容,对于软件测试的朋友来说应该是最全面最完整的备战仓库了,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。

​​

​​​​

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_56271699/article/details/133934933

智能推荐

W10系统matlab无法保存对该路径的更改 pathdef_MATLAB的运行与窗口介绍-程序员宅基地

文章浏览阅读2.4k次。1.首先打开MATLAB软件:MATLAB在安装中如果没有选择在桌面生成快捷方式,则需要去安装目录下自己查找,具体路径如下图:2.运行MATLAB运行MATLAB软件,打开后界面如下图所示:此为MATLAB软件的主界面,主要分为上图中的6个部分:菜单栏/工具栏工作目录工作目录中的文件目录目录窗口工作区命令历史记录3.菜单栏/工具栏的介绍对于菜单栏/工具栏来讲,主要有三个选项卡,如图中红色..._matlab无法保存对该路径的更改 pathdef

【配电网重构】基于SOE算法的多时段随机配电网重构方法【IEEE33节点、IEEE84节点】(Matlab代码实现)_ieee65节点-程序员宅基地

文章浏览阅读430次。配电网重构(DNR)的目的是确定配电网的最优拓扑结构,是降低电网功率损耗的有效措施。电力负荷需求和光伏(PV)输出是不确定的,并随时间变化,将影响最佳网络拓扑结构。单小时确定性DNR无法处理这种不确定性和可变性。为此,本文提出了求解多小时随机DNR (SDNR)的方法。现有的DNR求解方法要么不准确,要么过于耗时,因此无法求解大型配电网的多小时sdnr。为此,提出了一种开关开交换(SOE)方法。从所有开关关闭的环路网络开始,SOE由三个步骤组成。第一步是依次打开开关,直到打开所有循环。_ieee65节点

拦截器Interceptor-程序员宅基地

文章浏览阅读2.7w次,点赞44次,收藏253次。拦截器 是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。作用:可以构成拦截器栈,完成特定功能。比如日志记录、登录判断、权限检查等作用。好处:拦截器也可以让你将通用的代码模块化并作为可重用的类。拦截器的应用:AOP、需要有一些业务逻辑(需要注入Bean等)理解:拦截器可以说相当于是个过滤器:就是把不想要的或不想显示的内容给过滤掉。拦截器可以抽象出一部分代码可以用来完善原来的方法。同时可以减轻代码冗余,提高重用率。比如在登入一个页面时,如果要求._拦截器

解决echarts中地图重叠问题_echarts地图文字重叠解决方案-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏5次。在使用Echarts开发项目时,困扰许久的地图重叠问题,无意间在echarts官方文档中找到了解决方案。示例:如上图,其代码如下:geo: { backgroundColor:'#232e67', map: 'china', roam: true,},series: [ { backgroundColor:'#232e67', name: '用户分布', type: 'map', mapType: 'china', data: [] }]该写法会_echarts地图文字重叠解决方案

vue-cli 配置多环境打包_debugger attached. > [email protected]程序员宅基地

文章浏览阅读1.9k次。情况由于目前前端切换 环境配置 变得比较频繁 之前的手动切换环境配置的方式比较繁琐且容易遗漏或者出错 配置多环境,可以实现一键打包测试包或生产包初步实现npm run dev // 本地运行--开发环境npm run dev:test // 本地运行--测试环境npm run build:test // 打包发布--开发环境npm run build:prod // 打包发布--测试环境步骤1.在根目录新建文件.env.dev、.env.testenv、 .env.pr_debugger attached. > [email protected] lint > vue-cli-service li

解决:Assign object to a variable before exporting as module default-程序员宅基地

文章浏览阅读3.7k次,点赞2次,收藏4次。export default { user: {}}解决:const user = { user: {}}export default user;_assign object to a variable before exporting as module default

随便推点

快速理解复杂系统组成学习内容整合-程序员宅基地

文章浏览阅读1.5w次,点赞23次,收藏17次。复杂系统是由多个相互关联、相互作用的组件组成的大型系统,通过这些组件的协同工作来完成特定的任务或提供特定的服务。在设计复杂系统时,通常会考虑以下五个关键模块:接入系统 (Access System)+应用系统 (Application System)+基础平台 (Foundation Platform)+中间件 (Abundant External Middleware)+支撑系统 (Supporting System)_复杂系统组成

WIN7服务器配置之MySQL数据库安装图解(适用于5.1,5.5的版本)_win7 mysql 管理器-程序员宅基地

文章浏览阅读1.5k次。我用的mysql-5.5.9-win32.msi版本的,你可以从这里下载5.5最新版本的,安装和配置都是一样的,关于其中一些版本的区别:The Essentials Package:不包含 embedded server and benchmark suite,有自动安装程序和配置向导,没有MySQL Documentation;The Complete Package:包含 embedded_win7 mysql 管理器

工厂设计模式-程序员宅基地

文章浏览阅读5.4k次,点赞5次,收藏13次。1、概念工厂模式分三种:简单工厂模式、工厂方法模式、抽象工厂模式简单工厂模式(Simple Factory Pattern):属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式严重违背了“开闭原则”,难以拓展。工厂方法模式(Factory Method):定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为_工厂设计模式

cocos creator - WebView内部页面的交互和层级问题-程序员宅基地

文章浏览阅读1.5w次,点赞5次,收藏24次。我们知道creator里的WebView,VideoPlayer等特殊组件有一个非常严重的问题,就是不管你怎么设置层级,这类组件始终处于最上层!其他UI组件会被遮挡。我们打开浏览器运行,F12检测元素就可以清楚的看到他们的层级关系。如下图:通过上图我们可以清楚的看到,video(videoPlayer组件) 和 iframe(webView组件) 在 canvas(GameCanvas) ...

高级运维必会技术栈_运维技术栈-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏29次。高级运维必会技术栈_运维技术栈

AWS新用户入门学习必备知识_aws基础知识-程序员宅基地

文章浏览阅读1.2w次,点赞15次,收藏109次。AWS新用户入门学习必备知识博主介绍亚马逊云科技的历史Amazon Elastic Compute Cloud添加服务器,部署第一个应用需要了解的知识点计算机服务通过管理控制台启动EC2实例如果管理Amazon EC2网络网络服务Amazon VPC功能子网(Subnet)子网类型公有子网带有 NAT 网关的私有子网隔离的私有子网安全组与NACL存储服务数据存储选项Amazon EC2 中EBS与实列存储什么是EBS性能测试Amazon EC2 实例存储备份数据Amazon EFS介绍Amazon EFS_aws基础知识

推荐文章

热门文章

相关标签