2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

实例解说 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:002909

评论 1 条评论

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

太赞了!滴滴开源了一套分布式ID的生成系统...

Java架构师迁哥

AWS 助力贝壳VR看房走出国门,升级全球居住服务新体验

亚马逊云科技 (Amazon Web Services)

AWS

云原生架构-可观测性之 Prometheus 服务自动发现

云原生实验室

搭建网站/APP最全准备攻略

前嗅大数据

小程序 建站 APP发布

信任的传递——为什么我们需要第三方授权?

张凯峰

证书 身份认证

即构实时音视频多中心调度设计

ZEGO即构

如何在数智化时代少走弯路? 这里有100个案例可以借鉴

京东科技开发者

DevOps 云原生

互联网应用系统常见问题与方案

raox

极客大学架构师训练营

住建部等六部门:广泛运用区块链等技术,建设智慧物业管理服务平台

CECBC

物业生活

Shell脚本命令常用技巧

MySQL从删库到跑路

shell脚本编写

图文回顾丨北京「解构云原生:企业数字化转型新支点」沙龙

Rancher

k8s rancher

告别消费主义的双12,是华为云12.12会员节真正的意义

脑极体

牵头成立“现代计算联盟”,强大如谷歌也需要组团打怪吗?

脑极体

第十三周学习总结

饭桶

EMAS远程日志 - 移动端问题排查利器

移动研发平台EMAS

阿里云 运维 日志 监控告警 应用

附PPT丨AI和云原生时代的数据库进化之路

dbaplus社群

数据库 云原生

Elasticsearch 新机型发布,性能提升30%

腾讯云大数据

大数据 elasticsearch Elastic Stack

这才是你需要的C/C++Linux学习路线!

赖猫

c++ Linux 后台开发 服务器开发

第13周作业

饭桶

面向全场景模块化设计 京东智联云的服务器部署有多灵活?

京东科技开发者

服务器 云主机

云南区块链电子发票全面推广啦!

CECBC

区块链 纳税人

传统巨头抢占区块链场景高地 医疗、汽车、金融成为热门赛道

CECBC

区块链 金融

建信金科大咖访谈:金融衍生品定价与建行实践

金科优源汇

金融科技 金融创新

Java中多线程安全问题实例分析

叫练

Java 多线程 什么是多线程 多线程与高并发

静态代码分析工具评估指标及方法

maijun

几种常见的研发管理体系,哪种更适合你?

菜根老谭

敏捷开发 研发管理 CMMI IPD

浅谈JDK并发包下面的分治思想及分治思想在高并发场景的运用

AI乔治

Java 架构 jdk 分布式 多线程与高并发

记一次MapReduce的内存溢出

AI乔治

Java mapreduce 架构 内存溢出

Apache顶级项目ShardingSphere — SQL Parser的设计与实现

京东数科风险算法与技术

数据库 开源 中间件

大咖直播 | Elasticsearch 应用监控管理平台搭建实战

腾讯云大数据

大数据 elasticsearch Elastic Stack 监控管理平台

自建本地电话告警系统

周楠

运维 物联网 监控告警

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