写点什么

实例解说 AngularJS 在自动化测试中的应用

  • 2019-07-18
  • 本文字数:2291 字

    阅读完需:约 8 分钟

实例解说AngularJS在自动化测试中的应用

一、什么是 AngularJS ?

1、AngularJS 是一组用来开发 web 页面的框架、模板以及数据绑定和丰富 UI 的组件;


2、AngularJS 提供了一系列健壮的功能,以及将代码隔离成模块的方法;


3、AngularJS 于 2009 年发布第一个版本,由 Google 进行维护,压缩版 94k。

二、AngularJS 的核心思想


1、在 AngularJS 中通过数据视图双向绑定实现视图与业务逻辑解耦,这将提高代码的可测试性;


2、遵循 MVC 模式开发,鼓励视图、数据、逻辑组件间松耦合;


3、将测试与应用程序编写放在同等重要的位置,在编写模块的同时编写测试。因为各组件的松耦合,使得这种测试得以实现;


4、 应用程序页面端与服务器端解耦。两方只需定义好通信 API,即可并行开发。

三、简单的栗子

问题:假设我们需要编写一个手机列表,支持对手机信息进行模糊搜索,且按指定字段排序,要怎么实现呢?



如上图所示,几乎没有 DOM 操作,更专注于业务逻辑!


下面编写 HTML




编写控制器 Controller



PhoneListCtrl 控制器。例子中注入了http(封装了 ajax 的服务)这两个服务都是 angularjs 内置服务,服务是可以自定义的。


$scope.phones = data; 在这个地方后台返回的数据应用到了数据模型中,这时前台 UI 会自动响应更新。

四、指令

4.1 什么是指令?

指令是 AngularJS 用来扩展浏览器能力的技术之一。在 DOM 编译期间,和 HTML 关联着的指令会被检测到,并且被执行。这使得指令可以为 DOM 指定行为或者改变 DOM 的结构。例如 ng-controller、ng-src、ng-model 等。

4.2 AngularJS 的编译

4.3 简单的 AngularJS 指令写法

自定义指令的一般格式:


angular.application(‘myApp’, []).directive(‘myDirective’,function(){//一个指令定义对象return{ };  //通过设置项来定义指令,在这里进行覆写});
复制代码


下面我们来看一个简单的自定义指令的例子:



  • module:这个方法将新建一个模块。AngularJS 以模块管理代码。

  • directive:在模块中新建指令,指定的方法在编译步骤会被执行,执行后返回一个自定义的链接函数,这个链接函数在完成双向绑定后执行。

  • Restrict:它告诉 AngularJS 这个指令在 DOM 中可以何种形式被声明。E(元素), A(属性,默认值), C(类名)。

  • scope :可以被设置为 true 或一个对象。默认值是 false。当 scope 设置为 true 时,会从父作用域继承并创建一个新的作用域对象。有三种绑定策略 @ = &。

  • Template:一段 HTML 文本,或一个可以接受两个参数的函数,参数为 tElement 和 tAttrs,并返回一个代表模板的字符串。

4.4 使用指令


  • ng-app=“MyModule”:在 angularjs 启动时指定初始化的模块(module)。当前指定的是自定义的模块。

  • drink water="{{pureWater}}":调用自定义的 drink 指令,将 $scope 中的 pureWater 属性赋值给指令中的 water 属性。

  • drink 可以是一个属性,也可以是一个标签。

五、模块和服务

在 AngularJS 中,模块负责组织、启动、实例化应用。



模块的两个部分,一个是配置块,另一个是运行块。


  • 配置块:在实例工厂(provider)注册和配置阶段运行。只有工厂、常量才可以注入到配置块中(常量的配置要放在前面);



  • 运行块:注入器(injector)被创建后执行,被用来启动应用。实例和常量、变量等都能被注入。



AngularJS 应用中的服务是一些用依赖注入捆绑在一起的、可替换的对象。这些对象可以提供一些封装好的逻辑操作,以供调用。AngularJS 内置了很多有用的服务,例如前面提到的http 等,我们可以通过使用内置服务完成大部分业务逻辑。但很多时候我们还需要自定义服务:



服务的使用



上图的代码中定义了一个服务 notify,它依赖另外一个服务window 中封装了 window 对象的方法,定义了一个控制器 myController,并为这个控制器注入了 notify 服务,同时在控制器的 scope 中定义了一个方法 callNotify 来调用服务。$inject 是依赖注入的一种方式,请参看下文依赖注入章节。

六、依赖注入

我们可以将需要的服务比作一件工具,比如一把锤子,那我们要怎么获得锤子呢?


  • 第一种方法:自己打造一把锤子。如果锤子的工艺改变了,我们就需要重新制造。相当于我们在程序中 new 了一个服务,服务的实现改变时,只能修改代码,这将产生风险。

  • 第二种方法:我们找到一间工厂,告诉工厂锤子的型号,然后工厂为我们制造。这时候就不需要关系锤子是怎么做的,我们只管使用。但是这种方式还是很麻烦,我们需要知道工厂在哪。类似于在代码中通过工厂方法获取我们想要的服务。这种方会对工厂产生依赖。

  • 第三种方法:我们在门前贴张单子,声明我们需要一把什么型号的锤子,第二天就有人默默地送来了一把锤子。这在现实生活中简直是痴心妄想,但这种方式确实很轻松,不需要考虑任何东西,我们只关注使用锤子。这就是程序里的依赖注入。只要声明了需要什么,在使用的时候就可以得到什么。

6.1 AngularJS 中的依赖注入

第一种方式:通过方法参数名声明依赖。这种方式不推荐使用,因为 js 文件压缩后方法参数名会改变。



第二种方式:声明一个数组,依赖列表放数组的前部,注入目标放数组最后一个元素。推荐使用这个方法。



第三种方式:通过 $inject 属性来声明依赖列表。


七、文中没有介绍但需去了解的

1、$scope 的生命周期,这是一个相当重要的内容。


2、AngularJS 对于表单的支持。AngularJS 内置了表单的服务,可以大大提高开发效率。


3、指令的详细定义方式。很多时候,简单的指令写法不能满足需求,需要更深度的定制指令。


4、如何进行测试。在 AngularJS 中,测试非常简单,可以使用其它的测试库进行测试(如 Jasmine)。


本文转载自公众号宜信技术学院(ID:CE_TECH)


原文链接


https://mp.weixin.qq.com/s/QsjAzY_WHapvAxGOaWwz6w


2019-07-18 08:002758

评论 1 条评论

发布
用户头像
我穿越了吗?
激动地看了一下表……
2019-07-18 10:33
回复
没有更多了
发现更多内容

常青藤开源科技加入,龙蜥社区再迎 HPC 和开源领域新伙伴

OpenAnolis小助手

Linux 开源 高性能计算

如何使用 Apache APISIX CSRF 安全插件拦截跨站点伪造攻击

API7.ai 技术团队

CSRF API网关 Apache APISIX

Apache APISIX 新技能,代理 gRPC-Web 请求

API7.ai 技术团队

gRPC HTTP 网关 APISIX

云服务器ECS选购指南及省钱法宝(强烈建议收藏)

阿里云弹性计算

玩转ECS 选购指南

如何在设计时保证RPA机器人的稳定运行?

金小K

阿里云资深专家李国强:云原生的一些趋势和新方向

Serverless Devs

万字通俗讲解何为复杂度

华为云开发者联盟

数据结构 时间复杂度 复杂度 空间复杂度 复杂度分许

新插件上线,public API 处理能力更进一步

API7.ai 技术团队

HTTP APISIX APISIX 网关

浅析企业云服务之SaaS、PaaS、IaaS对比分析

郑州埃文科技

IaaS PaaS SaaS

使用goofys挂载S3 bucket为文件系统

阿呆

文件系统 goofys aws s3

COPT4.0新增凸QP、QCP和QCQP求解能力

杉数科技

求解器 优化求解器 凸QP 凸QCP

你知道钓鱼网站的形成步骤吗?一次网络钓鱼演练带你了解(增强安全意识)

H

网络安全 钓鱼网站

Nacos 在 Apache APISIX API 网关中的服务发现实践

API7.ai 技术团队

nacos 注册中心 服务发现 API网关 APISIX

斯图飞腾Stratifyd入选「2022爱分析·营销科技厂商全景报告」

Geek_2d6073

为什么国企要加快推进数字化转型?

用友BIP

数字化转型 用友 用友iuap 用友YonBIP 国企

【场景化集成方案】如何让企业快速集成钉钉各种能力

钉钉开发者

钉钉能力中心 钉钉官网 场景化能力包 场景化解决方案 应用集成方案

极速生成缩略图,Serverless 支撑赛事转播锁定冬奥亮点

Serverless Devs

学生外包管理系统架构设计文档

孙强

#架构实战营

Window下Redis的安装和部署详细教程

明金同学

redis

异步请求积压可视化|如何 1 分钟内快速定位函数计算积压问题

Serverless Devs

生态扩大进行中!Apache APISIX 集成 Splunk HTTP Event Collector

API7.ai 技术团队

API网关 Apache APISIX

第十五节:SpringBoot使用JPA访问数据库

入门小站

spring-boot

生态扩大进行中!Apache APISIX 支持 Azure Functions 集成

API7.ai 技术团队

microsoft azure API网关 Apache APISIX

计算IIS

杉数科技

求解器 优化求解器 计算IIS 混合整数规划 杉数科技

企业级 APIs 安全实践指南 (建议初中级工程师收藏)

领创集团Advance Intelligence Group

API

JWT Token在线编码生成

入门小站

工具

Apache APISIX 集成 HashiCorp Vault,生态系统再添一员

API7.ai 技术团队

开源 安全 后端 API网关 APISIX

APP热更新技术最优解,不只是支持热更新...

Speedoooo

小程序 APP开发 容器安全 热更新 小程序容器

2022写作计划2月文章排行榜

TGO鲲鹏会

TGO鲲鹏会 写作计划

StarRocks 元数据管理及 FE 高可用机制

邸星星

BerkeleyDB-JE bdbje StarRocks元数据管理

Apache APISIX 集成 Open Policy Agent

API7.ai 技术团队

开源 后端 API网关 OPA Apache APISIX

实例解说AngularJS在自动化测试中的应用_大前端_武贯祥_InfoQ精选文章