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

2.13 端到端测试

端到端测试(e2e test),也称为场景测试,它模拟的是用户真实的操作场景:
用户打开http://xxx地址。
在搜索框中输入了abc。
然后点击其后的搜索按钮。
这时候,他期望看到一个列表,列出所有在标题的任意位置包含了字符串abc的条目,并且每条结果中的abc这三个字母被高亮。
所谓端到端,也就是一端是浏览器,另一端是服务器,这个测试贯通了前后端,具有近似于验收测试的价值。
端到端测试不是什么新技术,它在前后端分离架构盛行之前就已经被广泛采用了,比如Selenium,而且Selenium也同样可应用于Angular中。
Angular的端到端测试工具称为Protractor,事实上,它就是基于Selenium的,在Selenium的基础上,它增加了一些Angular特有的元素选取方式,如根据ng-model选取元素等。
我的建议是,除非你所在的开发组织已经把Angular作为唯一的前端选项,否则请使用Selenium中传统的函数,而不要使用Protractor特有的根据ng-model选取元素等函数,这将让你们的测试独立于前端技术栈而被复用。
在我的工程实践中,只会使用id、class等少数查阅方式,而不会根据ng-model等进行查阅。并且,由于Angular的特点,被测试程序中可以不用任何id,所以,我们可以完全把id留给测试人员使用。如果写测试的人员有权修改源码,那么他/她可以自由的添加、删除id,而不用担心破坏了程序的逻辑和样式。遵循这个约定,可以让开发与测试的协同更加有效。
这里不展开讲解,只把我在种子工程中写的一些代码加上注释供大家自行研究:
1)pages/HomePage.js

// 这是一个页面对象,用来封装页面中的元素和操作,以简化规约代码,并提供一定的变更隔离
module.exports = function() {
    this.title = function() {
        // browser对象封装一组用来访问浏览器属性的函数
        return browser.getTitle();
    };
    // 根据id查找元素
    this.name = element(by.id('name'));
    this.nameEcho = element(by.id('name-echo'));
    this.get = function() {
        // 控制浏览器访问特定地址
        browser.get('http://localhost:5000/#/');
    };
};

2)demoSpec.js

// 取得页面对象
var HomePage = require('./pages/HomePage');

describe('e2e范例,如果修改了首页,请修改本测试 >', function () {
    var homePage;
    // 所有测试语句执行之前,先在浏览器中打开它
    beforeEach(function () {
        homePage = new HomePage();
        homePage.get();
    });

    it('默认的标题是Showcase', function() {
        expect(homePage.title()).toBe('Showcase');
    });
    it('输入用户名后应该回显', function() {
        // 检查初始状态是否符合预期
        expect(homePage.nameEcho.getText()).toBe('Hello,');
        // 模拟用户输入
        homePage.name.sendKeys('test');
        // 检查操作后状态是否符合预期
        expect(homePage.nameEcho.getText()).toBe('Hello,test');
    });
});
时间: 2024-12-30 19:20:55

《AngularJS深度剖析与最佳实践》一2.13 端到端测试的相关文章

《AngularJS深度剖析与最佳实践》一2.12 单元测试

2.12 单元测试 我们在第1章中已经写过两个单元测试(unit test)了,这里我们简单讲一下理论知识. 在Angular中,单元测试的概念和传统的后端编程是一样的.也就是对某些小型功能块儿进行测试,保障其工作逻辑正常.单元测试要尽可能局部化,不要牵扯进很多个模块,必要时可进行mock(模拟). 2.12.1 MOCK的使用方式 由于JavaScript语言的动态特性,Mock一个普通对象不需要进行特别处理.比如,如果一个测试函数需要访问scope中的一个变量:name,但不用访问$watc

《AngularJS深度剖析与最佳实践》一1.6 实现AOP功能

1.6 实现AOP功能 至此,实现路由页面时用到的技术我们已经基本示范过了,接下来我们将开始实现一些高级功能.这些功能具有全局性的影响-基本上每个路由都会涉及它,如果我们把它嵌入到每个路由的实现里,那么代码中将出现大量的重复,编写和维护将会变成噩梦.这类功能,我们称其为"AOP功能",也就是"面向切面功能"(形象点说:路由是竖着并列在一起的,AOP功能则像一个平台一样支撑着它们).最典型的就是"登录"和"错误处理".接下来,我

《AngularJS深度剖析与最佳实践》一1.4 实现第一个页面:注册

1.4 实现第一个页面:注册 接下来,我们开始实现第一个迭代的第一个功能:10.注册.我们把能够通过URL独立访问的一项功能简称为"一个路由",这里为注册功能分配一个叫作/reader/create的路由.之所以不使用/register的形式,是希望在各个URL之间保持统一,这也是我们在整个项目中将贯穿的一个约定. 1.4.1 约定优于配置 如同后端开发一样,我们将reader称为controller,create称作action,中间还可以有一个id,所以,典型的URL是这样的:/$

《AngularJS深度剖析与最佳实践》一1.3 创建项目

1.3 创建项目 接下来,我们要新建一个项目.传统的方式是使用Yeoman工具,它是基于Node的一个项目生成器引擎,但本书使用的是FrontJet方式,所以这里讲两个方式. 1.3.1 Yeoman 这节我们先简单讲讲Yeoman. 首先用cnpm install -g yo命令来安装它. Yeoman只是个项目生成引擎,我们还需要安装一个Angular的项目模板,可以使用cnpm install -g generator-gulp-angular@0.8.1命令.为了让后续步骤和本书的描述保

《AngularJS深度剖析与最佳实践》一2.9 服务

2.9 服务 如果你是一个后端程序员,那么对服务(Service)的概念一定不会陌生.在Angular中,服务的概念是一样的,差别只在于技术细节. 服务是对公共代码的抽象,比如,如果在多个控制器中都出现了相似的代码,那么把它们提取出来,封装成一个服务,你将更加遵循DRY原则(即:不要重复你自己),在可维护性等方面获得提升. 如同我们在第1章的tree服务中所看到的,由于服务剥离了和具体表现相关的部分,而聚焦于业务逻辑或交互逻辑,它更加容易被测试和复用. 但是,在工程实践中,我们引入服务的首要目的

《AngularJS深度剖析与最佳实践》一2.6 指令

2.6 指令 指令(directive)是Angular中一个很重要的概念,相当于一个自定义的HTML元素,在Angular官方文档中称它为HTML语言的DSL(特定领域语言)扩展. 按照指令的使用场景和作用可以分为两种类型的指令:它们分别为组件型指令(Component)和装饰型器指令(Decorator),它们的分类命名,并不是笔者独创的新法,它是在Angular 2.x中提出的概念,笔者认为它们也同样可以使用于Angular 1.x. 组件型指令主要是为了将复杂而庞大的View分离,使得页

《AngularJS深度剖析与最佳实践》一2.1 什么是UI

2.1 什么是UI 提起UI,你一定知道它是指用户界面(User Interface),但是如果细细剖析,你会发现它没那么简单. 对于一个用户界面,它实际上包括三个主要部分: 内容:你想展现哪些信息?包括动态信息和静态信息.注意,这里的内容不包括它的格式,比如生日,跟它显示为红色还是绿色无关,跟它显示为年月日还是显示为生辰八字也无关. 外观:这些信息要展示为什么样子?这包括格式和样式.样式还包括静态样式和动画效果等. 交互:用户点击了加入购物车按钮时会发生什么?还要更新哪些显示? 在前端技术栈中

《AngularJS深度剖析与最佳实践》一2.5 视图

2.5 视图 我们有了模块和控制器之后,内容和交互逻辑就已经基本确定了,接下来我们就得把它们展示给用户了,这时就用到"视图"(view).CSS并不在Angular的范围内,在实践中,常常结合一套成熟的CSS架构来做,比如Bootstrap就可以和Angular结合得非常好.Angular中实现视图的主体是模板.最常见的模板形式当然是HTML,也有通过Jade等中间语言编译为HTML的.模板中包括静态信息和动态信息,静态信息是指直接写死(hard code)在模板中的,而动态信息则是对

《AngularJS深度剖析与最佳实践》一1.1 环境准备

1.1 环境准备 进行开发的第一步是准备开发工具.对于用惯了IDE的程序员来说,可能需要适应一下IDE配合命令行的模式,不过最终你会爱上命令行模式的快速和简洁.我们将要使用的环境如下. NodeNode全称是Node.js,它是一个让JavaScript访问各种本地API和网络API的运行环境,在本书中,将大量使用基于Node的模块和工具. Node的安装非常简单,如果你使用Linux/Mac操作系统,建议从https://github.com/creationix/nvm下载:如果你使用Win