使用Angular CLI进行单元测试和E2E测试的方法


Posted in Javascript onMarch 24, 2018

第一篇文章是: "使用angular cli生成angular5项目" :https://3water.com/article/136621.htm

第二篇文章是: "使用angular cli从蓝本生成代码" :https://3water.com/article/137031.htm

第三篇文章是: "使用Angular CLI生成路由" :https://3water.com/article/137033.htm

第四篇文章时: “使用Angular CLI进行Build (构建) 和 Serve”:https://3water.com/article/137034.htm

本文是该系列的最后一篇文章.

单元测试.

angular cli使用karma进行单元测试.

首先执行ng test --help或者ng test -h查看帮助.

执行测试的话就执行ng test即可, 它会执行项目里所有的.spec.ts文件.

而且它还会检测文件的变化, 如果文件有变化, 那么它会重新执行测试.

它应该在单独的终端进程中执行.

首先创建一个angular项目, 带路由的:

ng new sales --routing

创建好项目后, 直接执行命令测试:

ng test

使用Angular CLI进行单元测试和E2E测试的方法

然后会弹出一个页面, 就是测试的结果数据.

下面我再添加几个components 和 一个 admin module:

ng g c person
ng g c order
ng g m admin --routing
ng g c admin/user
ng g c admin/email

然后配置一下路由, 最重要得到这个效果:

使用Angular CLI进行单元测试和E2E测试的方法

这时我重新执行一下ng test:

使用Angular CLI进行单元测试和E2E测试的方法

尽管程序运行没有问题, 但是测试还是出现了问题: router-outlet is not an angular component.

可以看一下spec list:

使用Angular CLI进行单元测试和E2E测试的方法

使用Angular CLI进行单元测试和E2E测试的方法

这时因为运行测试的时候, admin模块是独立运行的, 所以该模块并没有引用Router模块, 所以无法识别router-outlet.

那么如何解决这个问题?

打开admin.component.spec.ts:

使用Angular CLI进行单元测试和E2E测试的方法

把这句话填上, 然后就没有错误了:

使用Angular CLI进行单元测试和E2E测试的方法

NO_ERRORS_SCHEMA告诉angular忽略那些不识别的元素或者元素属性.

  1. --code-coverage -cc 代码覆盖率报告, 默认这个是不开启的, 因为生成报告的速度还是比较慢的.
  2. --colors 输出结果使用各种颜色 默认开启
  3. --single-run -sr 执行测试, 但是不检测文件变化 默认不开启
  4. --progress 把测试的过程输出到控制台 默认开启
  5. --sourcemaps -sm 生成sourcemaps 默认开启
  6. --watch -w 运行测试一次, 并且检测变化 默认开启 

ng test 就是运行测试, 并且如果文件有变化, 就会重新运行测试.

使用ng test -sr或者ng test -w false 执行单次测试

测试代码覆盖率:

ng test --cc 的报告默认是生成在/coverage文件夹下, 但是可以通过修改.angular-cli.json里面的属性进行修改.

下面生成代码覆盖率报告:

ng test -sr -cc

通常是配合-sr参数使用的(运行一次测试).

然后会在项目的coverage文件夹里生成一些文件:

使用Angular CLI进行单元测试和E2E测试的方法

直接打开index.html:

使用Angular CLI进行单元测试和E2E测试的方法

可以看到都是100%, 这是因为我没有写任何代码.

然后我在user component里面添加一些代码:

使用Angular CLI进行单元测试和E2E测试的方法

再运行一次 ng test --sr -cc:

使用Angular CLI进行单元测试和E2E测试的方法

使用Angular CLI进行单元测试和E2E测试的方法

可以看到这部分代码并没有覆盖到.

如果我把代码里到 canGetUsers改为true:

使用Angular CLI进行单元测试和E2E测试的方法

再次执行ng test --sr -cc

可以看到这次代码覆盖率变化了:

使用Angular CLI进行单元测试和E2E测试的方法

只有catch部分没有覆盖到.

我认为代码覆盖率这个内置功能是非常好的.

Debug单元测试.

首先执行ng test:

使用Angular CLI进行单元测试和E2E测试的方法

然后点击debug, 并打开开发者工具:

使用Angular CLI进行单元测试和E2E测试的方法

然后按cmd+p:

找到需要调试的文件:

使用Angular CLI进行单元测试和E2E测试的方法

设置断点:

使用Angular CLI进行单元测试和E2E测试的方法

然后在spec里面也设置一个断点:

使用Angular CLI进行单元测试和E2E测试的方法

最后点击浏览器的刷新按钮即可:

使用Angular CLI进行单元测试和E2E测试的方法

E2E测试的参数.

实际上angular cli是配合着protractor来进行这个测试的.

它的命令是 ng e2e.

常用的参数有:

  1. --config -c 指定配置文件 默认是 protractor.conf.js
  2. --element-explorer -ee 打开protractor的元素浏览器
  3. --serve -s 在随机的端口编译和serve 默认true
  4. --specs -sp 默认是执行所有的spec文件, 如果想执行某个spec就使用这个参数, 默认是all
  5. --webdriver-update -wu 尝试更新webdriver 默认true

通常执行下面机组命令参数组合即可:

ng e2e
ng e2e -ee

Debug E2E测试.

看一下项目:

使用Angular CLI进行单元测试和E2E测试的方法

配置文件protractor.conf.js已经配置好.

而测试文件是在e2e目录下.

看一下spec和po文件:

使用Angular CLI进行单元测试和E2E测试的方法

使用Angular CLI进行单元测试和E2E测试的方法

再看一下app.component.html里面的值:

使用Angular CLI进行单元测试和E2E测试的方法

应该是没问题的.

所以执行ng e2e:

使用Angular CLI进行单元测试和E2E测试的方法

测试通过, 但是浏览器闪了一下就关闭了.

如果我想debug e2e, 那么执行这个命令:

ng e2e -ee

由于我使用的是mac, 当前这个命令在mac上貌似确实有一个bug:

使用Angular CLI进行单元测试和E2E测试的方法

如果可以正常运行这个命令的话, 终端窗口会出现“Debugger listening on xxx: ”字样, 然后就可以在下面输入变量或者表达式来查看它们的值从而进行调试了.

如果想退出调试, 那就按Ctrl+c或者输入.exit即可.

由于angular cli 更新比较快, 所以查看最新的功能最好还是看官方文档:https://github.com/angular/angular-cli/wiki

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ie 处理 gif动画 的onload 事件的一个 bug
Apr 12 Javascript
javascript当中的代码嗅探扩展原生对象和原型(prototype)
Jan 11 Javascript
jQuery动态地获取系统时间实现代码
May 24 Javascript
js 固定悬浮效果实现思路代码
Aug 02 Javascript
Jquery弹出层插件ThickBox的使用方法
Dec 09 Javascript
JS控制表格实现一条光线流动分割行的方法
Mar 09 Javascript
简介alert()与console.log()的不同
Aug 26 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
Apr 17 Javascript
详解vue父子组件关于模态框状态的绑定方案
Jun 05 Javascript
Angular8 简单表单验证的实现示例
Jun 03 Javascript
理解JavaScript中的对象
Aug 25 Javascript
原生js实现自定义滚动条组件
Jan 20 Javascript
使用Angular CLI进行Build(构建)和Serve详解
Mar 24 #Javascript
使用Angular CLI生成路由的方法
Mar 24 #Javascript
使用Angular CLI从蓝本生成代码详解
Mar 24 #Javascript
详解Vue文档中几个易忽视部分的剖析
Mar 24 #Javascript
在vue中使用jointjs的方法
Mar 24 #Javascript
浅谈Vue下使用百度地图的简易方法
Mar 23 #Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
Mar 23 #jQuery
You might like
PHP 反射(Reflection)使用实例
2015/05/12 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
解决Laravel无法使用COOKIE和SESSION的问题
2019/10/16 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
event对象的方法 兼容多浏览器
2009/06/27 Javascript
Javascript 按位与赋值运算符 (&=)使用介绍
2014/02/04 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
js实现点击生成随机div
2020/01/16 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
Python数据结构之单链表详解
2017/09/12 Python
Python切片操作实例分析
2018/03/16 Python
Linux上比较文件的命令都有哪些
2013/09/28 面试题
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
致200米运动员广播稿
2014/02/06 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
森林防火标语
2014/06/23 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS
sql字段解析器的实现示例
2021/06/23 SQL Server
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android