初步了解Angular 2端到端的测试

有许多原因使我过去不愿对自己的应用添加自动化测试。原因之一是不知道其中的效益成本比率,另一个原因是考虑到集成到现有生产环境的应用可能比较难。测试应用而不用从头重构代码,仅仅只是引入测试要怎么做呢?

首先我们先从简单区分测试的类型开始。应用测试有很多类型,但最为常见的是单元测试及端对端测试(亦称为集成测试)。单元测试是测试代码自身行为的一种测试。在用户看来什么也没有做,但可以确保其方法能达到期望的目的。集成测试是模仿用户行为的一种测试。比如说,登陆系统,创建帖子,退出系统等这些操作都可以自动化,并且你可以用眼睛看到其过程是怎么发生的。

这两种类型的测试,它们通常彼此结合使用。对于新的开发来说,这将是理想的。如果时间有限制,或继承于现有项目的情况下,端对端测试或许比单元测试更加合适。因为我们并不需要过多了解先前的代码库,同样可以覆盖更多场景,这将比单元测试更快,因为单元测试并不测试单个单元而是整个场景。

单元测试依然重要,但如果你必须要在开始的时候选择一个,我认为端对端测试会是更好的选择。在这篇文章中,我将测试一个现有的Angular 2的待办事项的项目。我将使用集成测试,并覆盖一系列的场景。

如果你需要熟悉Angular 2的入门,请看这篇文章 Angular 2 article from Jscrambler

被测试的场景

  • 当应用初始化加载时,有3件待处理的事情
  • 需要加载新待办事项
  • 点击一个待办事项,然后跳到待办事项的详细页
  • 删除一个待办事项
  • 编辑一个待办事项标题,然后保存后,可以在首页的待办事项列表中看到新标题
  • 不允许保存一个空的待办事项,在点了禁用的保存按钮后,待办事项的列表依然还是原来的总数
  • 起初加载首页时,添加新待办事项的按钮应处于禁用状态
  • 保存待办事项的按钮仅应在输入待办事项标题后处于编辑状体

Todo 应用程序概述

让我们简单的描述一下TODO应用程序。应用程序将首先在主页上列出待办事项清单。有三个待办事项会详细列出。

这写数据不会由服务端提供,而是从设备文件硬编码中加载。

在首页上,我们可以添加新的待办事项。我们可以通过点击代办事项的标题来访问其详细信息页面。在此页面上,我们可以编辑代办事项标题或删除待办事项。

克隆并设置Todo 应用程序

1、首先克隆我已经推送到存储库这里但未经测试的应用程序,确保你是在主分支克隆的。接下来,你需要安装几个工具以便能进行下面的操作,在本教程中,使用Candidate已经发布的Angular 2,版本为2。

2、确保您已安装NodeJS的版本是Node 4.x.x或更高版本。

3、使用以下命令安装节点依赖项:


  1. npm install 

当然是在克隆的存储库中操作

4.使用Angular-CLI进行开发。安装Angular-CLI 全局使用下面命令:


  1. npm install -g angular-cli@latest 

5.Angular 2 端到端测试使用被称为 protractor的工具来运行,安装protractor 全局使用下面命令:


  1. npm install -g protractor 

6.安装所有依赖项后,使用以下命令启动开发服务器:


  1. ng serve 

然后导航到浏览器地址:http://localhost:4200,您将看到三个待办事项列表。

如果您在启动服务器时遇到问题,您可以参考stackoverflow issue来解决问题。

Angular 2测试相关的重要概念

端对端测试的文件夹在e2e。 其中有一个已预备好的案列文件,文件名为es2/app.e2e-spec.ts。

其中的测试文件是用jasmine框架开发的。有很多方式模块化、组织Angular 2端对端测试,但这里为了方便,这篇文章都将在一个文件中进行。

我们这个应用仅有一个功能那就是待办事项。为了满足大家的好奇心或有人在想比上述更复杂的情况,试想一个需要测试订单、用户配置等功能更复杂的应用的场景。对此测试的场景,我将在e2e文件夹中分别为每个待测试功能创建一个文件夹,并将各自测试文件放置其中。

这种情况下,我们将有两个文件夹分别命名为e2e/orderse2e/userProfile。每个文件夹中仅会有一个测试文件,或者为了满足更多待测试功能的需要而创建多个测试文件。需要注意的一点是每个测试文件都以word e2e-spec.ts结尾,这样Protractor测试工具才可以加载到。

Ok,还是回到我们简单的单个测试文件。如果你略有查看此文件,你会发现文件的头部有个导入声明(import statement)。导入是声明若干测试文件中所用的普通函数是源于哪里。然而这篇文章,我们不会使用这个,而将这个视为函数库。

在引入声明(import statement)之后,我们有一个描述性的代码块,它的两个函数调用即 beforeEach 和它里面的回调。

在描述代码块内,每个回调传递给 beforeEach 都需要测试。

每个测试再把里面的回调函数传递给它。

让我们用命令运行当前的测试


  1. protractor 

如果你在运行 protractor 两个命令中的一个时有问题,请参考这里。


  1. ./node_modules/protractor/bin/webdriver-manager update 

或者


  1. webdriver-manager update 

要是当前的测试失败,可能会在首页看到“app works”这样的文本提示。这并不是因为我们修改了首页的内容就出现这种情况。

在我们开始编写我们的测试之前,让我们理解一些重要的通用函数,然后使用 Angular 2 的端到端测试。

导航到页面

在测试文件中,有一个browser全局变量。它使用import语句引入


  1. import { browser, element, by } from 'protractor/globals'; 

你现在可以添加上。

例如,我们使用下面语句导航到你的应用程序中可用的任何页面


  1. browser.get('/'); 

到你的主页,和


  1. browser.get('/users'); 

到users页面。请注意,这些网址是相对的URL,我们也可以使用绝对URL,但是我建议使用相对URL,因为如果你的域名改变,这更易于维护。

选择元素

通常的做法是在当前页面上选择元素。你可以通过一个叫做element的全局变量选择元素。它接受可以使用全局by创建的定位器。

使用选择具有green类的p标签例子如下


  1. let greenParagraph = element(by.css('p.green')); 

选择多个元素,有些轻微的变化


  1. let greenParagraphs = element.all(by.css('p.green')); 

这将给出一个数组,而不是一个单一的元素。

抓取元素文本

要得到一个元素的文本,你必须先选择它,然后调用getText方法,想下面这样。


  1. let greenParagraph = element(by.css('p.green'));  
  2. let text = greenParagraph.getText(); 

点击元素

点击元素可以使用下面的语法完成


  1. let submitButton = element(by("form .submit-button"));  
  2. submitButton.click(); 

统计元素

我们也可以使用下面的语法来统计元素个数。


  1. let blueParagraphsList = elements.all(by("p.blue"));  
  2. let count = blueParagraphsList.count(); 

Test Scenarios测试方案

对于那些不太寻常的概念,我们列出了上面覆盖的场景。

确认要做的首要三件事

当应用程序初次被加载的时候,我们有将要做三件事。

在测试文件 e2e/app.e2e-spec.ts 的内部, beforeEach 代码块的下面,删除调用它的函数,并在下面添加


  1. it("should show three todos when we first load the todo app", () => {  
  2. browser.get("/");  
  3. let todos = element.all(by.css(".todos .todo"));  
  4. expect(todos.count()).toEqual(3);  
  5. }) 

不要忘记在这个文件的顶部添加这个导入声明


  1. import { browser, element, by } from 'protractor/globals'; 

现在,当你运行 protractor 命令,另一个浏览器将会被打开且迅速关闭,在你的控制台上你能看到通过测试的时候显示为绿色。

好的!我们刚刚已经写完了我们第一个通过 Angular 2 的端到端测试。

添加一个新的待办事项

现在进行下一个,我们可以添加一个待办事项。让我们用下面的代码添加一个测试块


  1. it("should be able to add a new todo", () => {  
  2. browser.get("/");  
  3. let newTodoInput = element(by.css(".add-todo input[type=text]"));  
  4. newTodoInput.sendKeys("Todo 4");  
  5. let newTodoSubmitButton = element(by.css(".add-todo input[type=submit]"));  
  6. newTodoSubmitButton.click();  
  7. let todos = element.all(by.css(".todos .todo"));  
  8. expect(todos.count()).toEqual(4);  
  9. }) 

我们在这里要做的是在待办事项输入框中输入文本并提交表单。然后我们检查是否有四个待办事项。 如果是的话,测试通过。

我们刚刚介绍了另一个函数sendKeys,它可以访问一个选中的元素,常用于输入文本到输入框这类元素中。

查看待办事项的详情页

我们应该能单击一个待办事项转到该待办事项的详情页,让我们用下面的测试实现它吧。


  1. it("should be able to click on a todo on the homepage and get to the details page", () => {  
  2. browser.get("/");  
  3. let firstTodo = element.all(by.css(".todos .todo")).first();  
  4. let firstTodoText = firstTodo.getText();  
  5. firstTodo.click();  
  6. let inputFieldText = element(by.css("todo input[type=text]")).getAttribute("value");  
  7. expect(inputFieldText).toEqual(firstTodoText);  
  8. }) 

删除一个待办事项

我们应该能删除一个待办事项。现在让我们试着删除一个待办事项看看能不能成功。

我们将转到待办事项页并单击删除链接,当我们返回主页时,我们能看到减少了一个待办事项。


  1. it("should be able to delete a todo", () => {  
  2. browser.get("/");  
  3. let firstTodo = element.all(by.css(".todos .todo")).first();  
  4. firstTodo.click();  
  5. let deleteLink = element(by.cssContainingText("span", "Delete"));  
  6. deleteLink.click();  
  7. let todosList = element.all(by.css(".todos .todo"));  
  8. expect(todosList.count()).toEqual(2);  
  9. }) 

编辑一个待办事项的标题

我们能编辑待办事项的标题,保存后能在主页的待办事项列表中显示新标题。


  1. it("should be able to edit a todo title", () => {  
  2. browser.get("/");  
  3. let firstTodo = element.all(by.css(".todos .todo")).first();  
  4. firstTodo.click();  
  5. let todoInputField = element(by.css("todo input[type=text]"));  
  6. todoInputField.clear();  
  7. todoInputField.sendKeys("Editted Todo1 Title");  
  8. let saveButton = element(by.css("todo button[type=submit]"));  
  9. saveButton.click();  
  10. firstTodo = element.all(by.css(".todos .todo")).first();  
  11. let firstTodoText = firstTodo.getText();  
  12. expect(firstTodoText).toEqual("Editted Todo1 Title");  
  13. }) 

不能保存空的待办事项

当我们想保存一个空的待办事项时,我们无法进行操作,并且单击禁用按钮时,待办事项列表依然保持同样的长度。


  1. it("should not be able to save an empty todo", () => {  
  2. browser.get("/");  
  3. let newTodoInput = element(by.css(".add-todo input[type=text]"));  
  4. let newTodoSubmitButton = element(by.css(".add-todo input[type=submit]"));  
  5. newTodoSubmitButton.click();  
  6. let todos = element.all(by.css(".todos .todo"));  
  7. expect(todos.count()).toEqual(3);  
  8. }) 

保存按钮在初始化时禁用

初始化时添加待办事项按钮被禁用,所以我们添加下列代码


  1. it("should have add todo button be disabled initially", () => {  
  2. browser.get("/");  
  3. let newTodoSubmitButton = element(by.css(".add-todo input[type=submit]"));  
  4. expect(newTodoSubmitButton.isEnabled()).toEqual(false);  
  5. }) 

当我们开始输入时启用保存按钮

只用当我们开始输入待办事项标题时,待办事项保存按钮才被启用。


  1. it("should only enable save todo button when we start typing a new todo title", () => {  
  2. browser.get("/");  
  3. let newTodoSubmitButton = element(by.css(".add-todo input[type=submit]"));  
  4. let newTodoInputField = element(by.css(".add-todo input[type=text]"));  
  5. newTodoInputField.sendKeys("New Todo 4");  
  6. expect(newTodoSubmitButton.isEnabled()).toEqual(true); 
  7. }) 

结论

现在,我们来总结一下 Angular2 的“端对端”测试。即使您没有任何的编程基础,也可以快速上手编写“端对端”测试。对于那些被引入代码库而又可能存在漏洞的部分,“端对端”测试是一个高效便捷的方法来捕获问题所在。

我们在概念部分中介绍了一些其他方法。您可以点击这里来浏览这些 Protractor API。并且可以在 GitHub repository 上找到这个应用的完整版和测试版。

我希望您看完这个介绍之后,在您修改任何一行代码之前都能兴奋的开始您的前端应用测试。如果您高兴,和我们交流一些您在日常测试中的高见。或者是您关于 Javascript 框架及 Angular2 的想法。感谢您的阅读。

作者:佚名

来源:51CTO

时间: 2024-10-04 00:06:18

初步了解Angular 2端到端的测试的相关文章

最受欢迎的5款Node.js端到端测试框架

笔者在本文中会结合自身实践和 GitHub 趋势对比最受欢迎的 Node.js E2E 测试解决方案,期望对大家的技术选型有帮助 测试,尤其是自动化测试在现代 WEB 工程中有着非常重要的角色,与交付过程集成良好的自动化测试流程可以在新版发布时帮你快速回归产品功能,也可以充当产品文档.测试因粒度不同又可以分为单元测试.接口测试.功能测试.在 WEB 领域,功能测试亦称为端到端测试(End to End Test,简称 E2E 测试),笔者在本文中会结合自身实践和 GitHub 趋势对比最受欢迎的

IBM将Swift带到云端,彻底简化端到端应用开发

近日,IBM宣布将Swift引入云端已经步入新阶段.Swift是一款强大且直观的编程语言,IBM成为首个支持云端进行Swift应用开发的云供应商,这使得在IBM云上进行端到端应用开发变得更为简单,从而释放出其巨大潜力. 该信息表明IBM与苹果公司的合作又进了一步,双方携手助力企业推进移动战略,为企业实现移动为要(MobileFirst),提供创新应用设计.分析.流程转型和整合服务.IBM已经是基于Swift语言开发移动应用的大户,非常了解Swift的优势,也对服务器端提供Swift,助力企业发挥

《AngularJS深度剖析与最佳实践》一2.13 端到端测试

2.13 端到端测试 端到端测试(e2e test),也称为场景测试,它模拟的是用户真实的操作场景:用户打开http://xxx地址.在搜索框中输入了abc.然后点击其后的搜索按钮.这时候,他期望看到一个列表,列出所有在标题的任意位置包含了字符串abc的条目,并且每条结果中的abc这三个字母被高亮.所谓端到端,也就是一端是浏览器,另一端是服务器,这个测试贯通了前后端,具有近似于验收测试的价值.端到端测试不是什么新技术,它在前后端分离架构盛行之前就已经被广泛采用了,比如Selenium,而且Sel

用Spring实现非端到端验收测试

验收测试让交付团队超越了基本的持续集成,即验证应用程序是否为用户提供 了有价值的功能.不过对于刚开始尝试部署流水线的团队来说,想要自动化验收 测试,需要跨过三大门槛. 一是实现和维护验收测试的技术门槛.理想情况下,验收测试最好可以模拟用 户与应用程序的真实交互,因此如果有图形界面的话,验收测试理应通过这个界 面和系统打交道.然而,直接通过GUI进行测试会遇到几个问题:界面变化速度很 快.场景的准备相对复杂.拿到测试结果较难等.比如一个典型的WEB应用程序, 如果通过GUI测试,那么一般需要解析H

有关网络端到端路径性能测试

近年来VoIP.VoD等实时应用在网络应用中比例大量增加,实时应用需要网络对其提供服务保证或区分服务,网络路径的延时特性和传输速率越来越受到人们的重视.网络延时和有效带宽直接反映了路径的性能和对端主机提供的服务等级水平,但它们都是随时间随机变化的变量,跟踪这些路径特征参数的动态变化可以获得资源的使用状况和性能趋势,并作为网络路径性能评价和实时的端到端性能管 理的依据. 一.端到端路径性能问题 端到端性能管理的目标是为用户提供一条稳定可用的具有一定服务保障的连接.其范围已超出了流量工程和容量规划等

端到端的802.11n测试

基于802.11n草案标准的无线产品已经大量出现,不过在现实的生产环境中,这些产品的性能究竟如何? 802.11n无线网络标准代表了无线网络的又一次进化,基于这一新的标准可以为企业提供更高的可移动性.随着802.11n的出现,无线数据传输的速度被提升到300 Mbps,这一性能的提升至少是现在无线局域网标准802.11a/b/g(54Mbps)的五倍,这为更多高要求的生产环境使用无线网络带来了新的契机. 思科和英特尔已经在许多重要领域开展协作,包括对下一代无线网络标准802.11n的交互性能和整

WiMAX网络端到端的QoS策略

近年来移动通信领域呈现数据化.宽带化的趋势,WiMAX采用多载波调制技术,能够提供高速的数据业务,并且具有频谱资源利用率高,高效的带宽利用率,覆盖范围大等特点.WiMAX的成本相对较低,可以为个人.家庭.企业提供便利.优良的移动多媒体宽带服务和高速的无线数据传输.WiMAX技术的这些特点,符合了移动通信的发展趋势,引起了业界的广泛关注.通过WiMAX网络开展多媒体业务,需要解决端到端的QoS问题,以使用户获得满意的服务,同时又能有效地利用网络资源.目前,许多标准组织和设备制造商都在进行这方面的研

全新端到端万兆增强6类屏蔽布线方案

西蒙公司的10G 6ATM F/UTP系列产品性能满足并超过10Gb/s万兆以太网应用标准,包括其对外来串绕性能的苛刻规定. 全球著名的网络布线解决方案供应商美国西蒙公司自豪地宣布推出全新的10G 6ATM F/UTP端到端屏蔽增强6类布线解决方案.10G 6ATM F/UTP布线系统能够满足并超过IEEE 802.3an(基于铜缆的万兆以太网标准,定于2006年正式生效)中有关信道的全部要求. 10G 6ATM F/UTP信道由全新的较小线径F/UTP屏蔽电缆.免工具端接的MAXreg;屏蔽模

《端到端QoS网络设计(第2版)》一2.1 部署QoS的原则

第2章 基于IOS的QoS体系框架和语法结构 端到端QoS网络设计(第2版) 本章包含了如下主题: 部署QoS的原则: QoS特性的体系结构,以及基于IOS的Cisco路由器与交换机的功能: 在基于IOS的Cisco路由器与交换机上,配置QoS特性的命令行语言与结构. 本书将从第3章到第7章开始,对这些特性本身.这些特性的工作方式,以及它们的配置命令进行深入的介绍.至于这些特性在不使用IOS系统的Cisco产品(特别是无线产品)上,如何运行和配置,将在本书的第18章.19章和20章中进行讲述.