Web UI 自动化测试框架哪个更适合你?

news2024/11/25 16:32:02

最近,项目上出于系统性稳定性、减少测试工作量考虑,打算在 Web 前端引入 BDD。由于上一个项目写了一定的 Cucumber 代码(BDD 测试框架之一),这个框架选型的责任便落到了我的肩膀上了。

在我们进行框架选型的时候,着重考虑了一个因素:测试实现脚本是由开发人员编写的,因此最好寻找 JavaScript 支持的框架。在搜索了一天后,选择了三个框架 Cucumber、Robot、Gauge。以下是上述的三个框架入选的原因:

Cucumber,团队的开发人员有一些有相关的开发经验、支持 JavaScript。

Robot Framework,测试人员接受过相关的培训、不支持 JavaScript。

Gauge,可以生成更好的测试报告及自由的书写、支持 JavaScript。不过,主要是我写腻了 Cucumber。

随后,便使用三个不同的框架写了几个 UI 测试的 DEMO。在开始之前,让我们了解什么是 BDD。

BDD

Behavior Driven Development,行为驱动开发是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、QA 和非技术人员或商业参与者之间的协作。

与一般的自动化测试(如单元测试、服务测试、UI 测试)不一样的是,BDD 是由多方参与的测试开发方式。如在使用 Protractor 写 Angular 的 E2E 测试的时候,所以的测试都是前端测试人员编写的。BDD 最重要的一个特性是:由非开发人员编写测试用例,而这些测试用例是使用自然语言编写的 DSL(领域特定语言)。

换多话来说,业务人员、测试人员、客户等利益相关者,以习惯的方式编写相关的测试用例,再由开发人员去实现相关的测试。如下图所示: 

 

 由业务人员编写的测试用例,将是使用如下的形式实现的:
  * 当我在网站的首页
  * 输入用户名 "demo"
  * 输入密码 "mode"
  * 提交登录信息
  * 用户应该跳转到欢迎页

对于能支持中文的 BDD 框架来说,这就是业务人员和测试人员等编写的用例,他们能轻松地编写出这样的用例,而开发人员便是去实现这一个又一个的 DSL 语句。

在我之前的一个项目里,我们遇到了一个问题:测试用例也是由开发人员编写的。这种做法不仅不能体现 BDD 的价值,而且对于开发人员来说,这是在糟蹋代码。如果完全是由开发人员编写的测试,那么为什么我们需要写一个额外的 DSL 层呢?

接下来,让我们看看三个测试的一个简单对比表:

 从某程程度上来看,三个框架差不了多少,每个框架也各自都有自己的问题。

1. Cucumber 的 Javascript 版本不支持 HTML 的报表生成。

2. Gauge 虽然比较适合我们的要求,但是相关的中文资料比较少。

3. Robot 主要的问题是不支持 JavaScript,以及要按 Robot 定义的方式来编写代码。

以下是三个框架的示例及详细的对比。

Cucumber.js

Cucumber 是一个能够理解用普通语言 描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用Ruby编写,支持Java和.Net等多种开发语言。

·使用自然语言,更易读

· 支持表格参数

· 支持多种格式的Report:html、junit etc.

· 支持多种语言

· 支持四种状态的测试步骤:Passed、Failed、Skipped、Pending

· 支持使用变形器消除重复

· 一个商用的在线 Cucumber 系统:Cucumber Pro

DSL Code Examples

示例代码:
  # language: zh-CN
  功能: 失败的登录
    场景大纲: 失败的登录
      假设 当我在网站的首页
      当 输入用户名 <用户名>
      当 输入密码 <密码>
      当 提交登录信息
      那么 页面应该返回 "Error Page"
      例子:
        |用户名     |密码      |
        |'Jan1'    |'password'|
        |'Jan2'    |'password'|

Cucumber 支持比较固定的 DSL 格式,即三段式 Given-When-Then,对应的中文便是:假设-当-那么。作为一个历史悠久的框架,它的中文资料相当的丰富,只是在 JavaScript 方面有些不足,不能生成对应的 HTML 报告。

其实现代码如下所示:

Step Code Examples

Cucumber 支持比较固定的 DSL 格式,即三段式 Given-When-Then,对应的中文便是:假设-当-那么。作为一个历史悠久的框架,它的中文资料相当的丰富,只是在 JavaScript 方面有些不足,不能生成对应的 HTML 报告。

其实现代码如下所示:

Step Code Examples 

defineSupportCode(function({Given, When, Then}) {
      Given('当我在网站的首页', function() {
          return this.driver.get('http://0.0.0.0:7272/');
      });
      When('输入用户名 {string}', function (text) {
          return this.driver.findElement(By.id('username_field')).sendKeys(text)
      });
      When('输入密码 {string}', function (text) {
          return this.driver.findElement(By.id('password_field')).sendKeys(text)
      });
      When('提交登录信息', function () {
          return this.driver.findElement(By.id('login_button')).click()
      });
      Then('页面应该返回 {string}', function (string) {
        this.driver.getTitle().then(function(title) {
          expect(title).to.equal(string);
        });
      });
  });

从代码实现上来说,也是固定的三段式。其底层依赖于 Selenium,因此写法上与 Gauge 的区别并不大。

Robot Framework

Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。

关键特性:

·使用关键字的机制,更容易上手

· 提供了RIDE,对于不熟悉编码的人来说比较友好

· 能够精细的控制关键字的scope

· Log 和 Report 非常好

· 使用变量文件的机制来描述不同的环境

· 丰富的关键字库

· 内置变量

DSL Code Examples

示例代码:

*** Settings ***
  Documentation     登录测试 2
  ...
  Suite Setup       打开浏览器到登录页1
  Suite Teardown    Close Browser
  Test Setup        转到登录页
  Test Template     使用错误的失败凭据应该登录失败
  Resource          resource.robot
  *** Test Cases ***               USER NAME        PASSWORD
  无效的用户名                      invalid          ${VALID PASSWORD}
  无效的密码                        ${VALID USER}    invalid
  无效的用户名和密码                 invalid          whatever
  *** Keywords ***
  使用错误的失败凭据应该登录失败
      [Arguments]    ${username}    ${password}
      输入用户名    ${username}
      输入密码    ${password}
      提交登录信息
      登录应该不成功
  登录应该不成功
      Location Should Be    ${ERROR URL}
      Title Should Be    Error Page

 从上面的代码来看,Robot 在某些特定的关键字上,必须使用英语。在关键的代码如关闭浏览器,仍然需要使用 Close Browser 英语这些来实现。

Step Code Examples

打开浏览器到登录页
      Open Browser    ${LOGIN URL}    ${BROWSER}
      Maximize Browser Window
      Set Selenium Speed    ${DELAY}
      Login Page Should Be Open
  Login Page Should Be Open
      Title Should Be    Login Page
  转到登录页
      Go To    ${LOGIN URL}
      Login Page Should Be Open
  输入用户名
      [Arguments]    ${username}
      Input Text    username_field    ${username}
  输入密码
      [Arguments]    ${password}
      Input Text    password_field    ${password}
  提交登录信息
      Click Button    login_button
  应该跳转到欢迎页
      Location Should Be    ${WELCOME URL}
      Title Should Be        Welcome Page

与上面的 Cucumber 相比,Robot 对于英语的非开发人员来说更加友好。换句话来说,Robot 更像是一个适合于 QA 的语言。作为一个开发人员,可能不太喜欢这种形式。

报告示例

不过,Robot 提供了一份说尽的报告。细致的展示了每一个测试,以及其步骤时间等等。

Gauge

Gauge 是 Go 开发的一个跨平台测试自动化工具。它给作者提供了用商业语言测试用例的能力。

关键特性:

  • 基于 markdown 的丰富的标记
  • 支持用任何程序语言来编写测试代码
  • 支持 plugin 的模块化架构
  • 跨语言实现一致性。
  • 简单,灵活和丰富的语法
  • 开源的,因此它可以自由共享,同时被他人改进
  • 商业语言测试 : 支持可执行文件的概念
  • 帮助您创建可维护和可理解的测试套件
  • 支持外部数据来源
  • IDE Support

DSL Code Examples

示例代码:

失败的登录
  ===
       |用户名   |密码     |
       |--------|--------|
       |Jan1    |password|
       |Jan2    |password|
  失败的登录
  -----------
  * 当我在网站的首页
  * 输入用户名 <用户名>
  * 输入密码 <密码>
  * 提交登录信息
  * 页面应该返回 "Error Page"

与 Robot 和 Cucumber 不一样的是,Gauge 使用的是大家更熟悉的 Markdown 形式的 DSL。并且从形式上来说,更加自由。List 中的每一行,就代表着一个元素。因此,其对应的实现代码也更加的自由。

Step Code Examples

step("当我在网站的首页", async function () {
    await page.goto('http://0.0.0.0:7272/');
  });
  step("输入用户名 <query>", async function (query) {
    await page.click('#username_field');
    await page.type(query)
  });
  step("输入密码 <query>", async function (query) {
    await page.click('#password_field');
    await page.type(query)
  });
  step("提交登录信息", async function () {
    await page.click('#login_button')
  });
  step("页面应该返回 <query>", async function(query){
    await page.waitFor('h1');
    const text = await await page.$eval('#container h1', h1 => {
      return h1.innerHTML;
    });
    expect(text).to.equal(query);
  });

 上面采用的是 Node.js 8 支持的异步写法,除此与 cucumber.js 写的代码并没有太多的差异。

报告示例

至于,Gauge 生成的 UI 并没有 Robot 那么详细,但是看上去现代。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

执行器-Query 执行详解

一、主要流程 本期主要为大家分享&#xff0c;在经过语法、词法分析并生成 AST 语法树后的执行流程&#xff0c;下图是完整流程展示&#xff1a; 图 1 整体流程图 一个 Query 语句执行&#xff0c;从 connExecutor 接收&#xff0c;再到解析完成的 AST 语法树&#xff0c;最后…

【哈希表part01】| 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

目录 ✿LeetCode242.有效的字母异位词❀ ✿LeetCode349.两个数组的交集❀ ✿LeetCode202.快乐数❀ ✿LeetCode1.两数之和❀ ✿LeetCode242.有效的字母异位词❀ 链接&#xff1a;242.有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的…

如何进行弱网测试?专项测试中最实用的方法了解一下……

目录 引言 一、什么是弱网测试&#xff1f; 二、为何要进行弱网测试&#xff1f; 三、如何做弱网测试&#xff1f; 四、弱网测试工具 引言 如今这个高度互联的时代里&#xff0c;网络环境对于应用程序的影响越来越重要。 而弱网测试就是用来检验应用程序在恶劣网络环境下…

AIGC与AidLux互联应用——AidLux端AIGC评测

使用diffusers生成图片&#xff0c;再通过socket编程完成pc端与AidLux之间通信&#xff0c;把生成的图像上传服务端&#xff0c;最后通过yolov5模型对生成的图像进行评测 视频流程如下&#xff1a; AIGC与AidLux互联应用——AidLux端AIGC评测 生成图片如图所示&#xff1a;

Redis的Java客户端-Java客户端以及SpringDataRedis的介绍与使用

1. Redis的Java客户端 Spring Data Redis底层支持同时兼容Jedis和Lettuce两种不同的Redis客户端&#xff0c;可以根据需要任意选择使用其中的一种。这样既可以保留现有代码使用的Jedis方式&#xff0c;也可以通过使用基于Netty的高性能Lettuce客户端&#xff0c;提升应用的性能…

【RabbitMQ教程】前言 —— 中间件介绍

&#x1f4a7; 【 R a b b i t M Q 教程】前言——中间件介绍 \color{#FF1493}{【RabbitMQ教程】前言 —— 中间件介绍} 【RabbitMQ教程】前言——中间件介绍&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云…

MySQL数据库基础 10

第十章 创建和管理表 1. 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型 2. 创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库 3. 创建表3.1 创建方式13.2 创建方式23.3 查看数据表结构 4. 修改表4.1 追加一个列4.2 修改一…

Vue2模拟俄罗斯方块小游戏

目录 一、效果展示 二、代码分享 三、原理分析 3.1、界面搭建 3.2、方块创建 3.3、方块旋转 3.4、方块移动 3.5、移动判断 3.6、下落判断与清除 3.7、得分计算 一、效果展示 二、代码分享 <template><div class"game"><div class"ga…

调整IoTDB堆内存

最关键的是 MAX_DIRECT_MEMORY_SIZE &#xff0c;他等于MAX_HEAP_SIZE变量。 再往上翻又等于 max_heap_size_in_mb M大小 继续上翻 system_memory_in_mb 很明显就是系统内存&#xff0c;单位是M quarter_ 四分之一内存&#xff0c; half_ 一半内存。 假设物理内存为8G&a…

PMP证书含金量如何?到底有啥用处?

01PMP是什么&#xff1f; | PMP是指项目管理专业人士资格认证。 | 美国项目管理协会&#xff08;PMI&#xff09;举办的项目管理专业人员&#xff08;PMP&#xff09;认证考试。 | 是目前项目管理领域含金量很高的认证。 国内很多媒体也把PMP称为继MBA、MPA之后的三大金字招…

KW 新闻 | KaiwuDB 发布智慧矿山解决方案

5月21日&#xff0c;天津第七届世界智能大会&#xff08;WIC&#xff09;圆满落幕。作为智能领域的国家级盛会&#xff0c;WIC 汇聚了全球知名院士、顶级学者、产业领袖分享先进技术和实践经验&#xff0c;推进智能技术创新合作。KaiwuDB 受邀出席大会并正式发布智慧矿山解决方…

软件测试现状以及行业分析

大家都知道最近 ChatGPT 爆火&#xff0c;国外巨头争相宣布自己的相关计划&#xff0c;国内有点实力的企业也在亦步亦趋地跟进。不出意料的是&#xff0c;关于测试职业要被淘汰的话题又&#xff08;为什么要说又&#xff1f;&#xff09;在扎堆出现&#xff0c;内容跟之前还是大…

“大模型+小模型”新纪元开启,AI基础软件定义AI未来

5月30日&#xff0c;由中国信息通信研究院、浙江省经济和信息化厅、杭州市人民政府、中国人工智能产业发展联盟主办的“杭州通用人工智能论坛”盛大召开。杭州市人民政府党组成员、副市长孙旭东&#xff0c;浙江省经信厅总工程师李永伟&#xff0c;中国信息通信研究院党委副书记…

检索项目中冗余的图片

说在前面 平时在项目中我们会使用到一些图片&#xff0c;很多时候我们会直接将图片打包到项目中去&#xff0c;随着项目的更新迭代&#xff0c;我们可能会删除一些图片的引用&#xff0c;但没将图片源文件删除&#xff0c;这个时候没有被引用到的图片就会成为冗余的文件&#…

一位十年测试的修炼之路,希望能帮你点清现实

对于刚进入软件测试工作岗位的新人&#xff0c;如何快速、健康的在职业道路上成长&#xff0c;作者谈了几点自己看法&#xff1a; 1、兴趣是最好的老师 对于软件测试工作&#xff0c;通常是比较枯燥的&#xff0c;如果没有兴趣很难做到持久。 我最近参与了一个软件测试项目&a…

Android AIDL跨进程通信

一、前言 什么是AIDL&#xff1f;AIDL用来做什么的&#xff1f;怎么使用AIDL&#xff1f; AIDL是Android的一种接口定义语言&#xff0c;语法跟java接口定义类似&#xff0c;文件格式为 .aidl 非 .java 。AIDL主要是用来实现跨进程通信&#xff0c;AIDL的本质也是通过Binder机…

【集群】Haproxy搭建Web群集

文章目录 一、Haproxy 相关概念1. Haproxy 的概述2. Haproxy 的主要特性3. 常见的 Web 集群调度器4. 常见的应用分析4.1 LVS 应用4.2 Haproxy 应用4.3 LVS、Nginx、Haproxy的区别 5. Haproxy 调度算法原理5.1 roundrobin5.2 static-rr5.3 leastconn5.4 source5.5 uri5.6 url_pa…

【1 TypeScript - TypeScript语法的类型】

1 认识TypeScript 主要是为了解决类型检查的痛点.是拥有类型的JavaScript超集,虽然编写的是Typescript,但是最终仍然会编译成JavaScript代码. 2 TypeScript的运行环境 使用ts-node 3 变量的声明 变量的类型推导&#xff08;推断&#xff09; 4 JavaScript类型 – Array类…

ThinkPHP5源码阅读-类的自动加载register与autoload的实现

文章目录 前言如何下载ThinkPHP5源码关于自动加载类类的准备进入base.phpLoader::register() 注册自动加载函数对composer 的支持对think和trait的支持对extend目录的支持 类的加载autoload方法class_alias的定义和使用findFile 查找类 作业&#xff1a;自定义一个可以被自动类…

Java设计模式—责任链模式(Chin of Responsibility)

目录 前言 一、责任链模式的简介 二、责任链模式的概念 三、责任链模式的作用 四、责任链模式的优、缺点 1.责任链模式的优点 2.责任链模式的缺点 五、责任链模式的应用场景 六、代码案例 UML类图 1.定义一个请求枚举类 2.定义一个请求类 3.定义一个抽象处理接口 4、…