JS单元测试之路
- 3. + 当你改了:
– 一段底层基础库代码
– 一个全站使用的公共组件
–…
+ 提交代码之前会不会纠结?
+ 提交代码之后会不会担忧?
+ 理想:
– 克服上线恐惧症
– 无后顾之忧、轻松happy的提交代码
+ “理想是人们在实践中形成的、具有实现可能
的,对未来的向往和追求”
- 5. + 什么是单元测试?
– 单元测试(模块测试)
开发者编写的一小段代码,
用于检验被测代码的一个很小、很明确的功能是否
正确。
– 白盒
– 关键词
开发者编写(并不一定仅限于本人哟~~)
明确:模块化(CommonJS)
小
– 优点:
验证(保障)、设计、文档、快速、沟通
- 6. + 测试驱动开发( Test-Driven Development )
– 待办列表:明确要完成的功能
– 开发功能:先编写测试代码再写功能代码
– 重构代码:改进设计
– 一顶帽子/小步前进/及时重构 …
+ 重构(Refactoring)
– 软件内部结构的一种调整,目的是在不改变“软
件之可察行为”前提下,提高其可理解性,降低
其修改成本(Martin Fowler)
– 有了(单元)测试,才能确保重构满足前提,
才会让我们更有勇气重构代码
- 7. + 问题:
– 是什么?OK?
– 写什么?
怎
– 怎么写?
么
– 用什么写? 写
– 怎么组织代码?
– 怎么运行?
怎
– 怎么收集运行结果? 么
– 什么时候运行测试? 跑
– 如何保证测试必定会运行?
– 如何保证上线之前的代码是经过单元测试的
–…
- 9. + 写:
– 写什么(单元测试及其编写)
– 用什么写(工具选择)
– 如何写(工具使用、API)
– 如何组织(单元测试用例的组织)
+跑
– 何时跑(使用场景)
– 怎么跑(单浏览器vs多浏览器)
– 怎么自动化(半自动化?)
- 10. + 工欲善其事,必先利其器
– 不重复发明轮子
– 拿来主义!
– 我是“懒”人
优秀程序员的两大要素:懒 + 笨
+ “单元测试有俩宝。”“哪俩宝呀?”
– 写(QUnit)
– 跑(jsTestDriver)
+ “有这俩宝,齐了! ”
- 11. + 原来的方式
– console.log
– alert
– test.html
– demo
– javascript:void(function(){xxx})();
+ 问题
– 不全面,想到哪就测到哪
– 不系统,测到一个算一个
– 没留下,想看结果要趁早
– 不直观,结果需要人判断
– 必须删,线上alert不能忍
- 12. + 写些什么
– 理论:参考书(《单元测试之道》、《软件工
程》等)
单元测试的一些原则
测试哪些内容: 边界条件检查: 好的测试应该是:
• Right-BICEP • CORRECT • A-TRIP
• Right:结果正确 • C:一致性 • A:自动化的
• B:边界 • O:有序性 • T:彻底的
• I:反向关联 • R:区间性 • R:可重复的
• C:交叉检查 • R:耦合性 • I:独立的
• E:强制错误 • E:存在性 • P:专业的
• P:性能曲线 • C:基数性
• T:时间性
- 13. + 写些什么
– 实践:参考已有框架的单元测试(如:jQuery)
- 14. + 代码不是万能的
– string.camelCase
+ 基于共识
– isWindow引发的血案
– Array.indexOf(NaN)
- 15. QUnit jsTestDriver JsUnit
YUITest jqMock
Jasmine
jsUnity
jQunit
FireUnit jSSpec J3Unit
+ 放眼望去全是工具
– JQuery作者就写了好几个~
+ 如何选择?
– 简单!
– 可依赖!(好像有点耳熟.. )
- 16. + 选QUnit!
+ 客观原因
– nothing more,简单!
– jQuery用它完成了单元测试!可依赖!
+ 主观原因
– 先入为主
– 用过JUnit/NUnit,对xUnit从未失望
– demo直观,效果迅速抓住眼球
– jQuery作者John Resig写的
– 排行第一?
- 17. + 简单省地儿的API
setup
{ teardown
stop:中止
start:继续
“断点续传”解决异步测试
- 19. + 与src同级的test目录
+ test目录下包含
– unit
– function
– speed/performance
+ unit目录下
– test-runner.html (军长?)
– index.js (军部政委?)
– lib (参谋?)
– 各分 test目录
(师)
index.html (师长?)
index.js (师部政委?)
xxx-aspect.js(方面旅?)
- 20. + 文件拆分 (师->旅)
– 方面
– basic/usage
– module(‘name’)
– 用于定位文件 (团长->旅长)
+ 文件收集
– 分收集
index.js
index.html
– 总收集
index.js
test-runner.html
- 21. + 什么时候跑?
– 开发时:本地跑
– 提交之前:本地跑
– 提交时:服务器自动跑
– pull代码之后:本地跑
+ 怎么跑?
+ 嗯~~ 打开浏览器,输入url,回车?
– 能不能一次跑一堆浏览器? 我能!
– 能不能拿别人的机器帮我跑测试?
我也能!
- 22. Yeti jsTestDriver Tutti
Selenium watir
FitNesse CloudyRun
crosscheck TestSwarm
JsUnit
+ 再一次,放眼望去全是工具
+ 如何选择?
– 专注于单元测试!
– 支持远程多浏览器脚本运行!
– 真实的浏览器环境
– 简单,可依赖!
- 23. + jsTestDriver from Google
– java
– server/client
– jsTestDriver.conf
+ QUnitAdapter.js
+ 多浏览器同时跑~
– Server
java –jar JsTestDriver-1.3.3.jar --port 9876
http://127.0.0.1:9876/capture
– Client
java –jar JsTestDriver-1.3.3.jar --runnerMode DEBUG --reset -
-tests all > .test-result.txt
- 31. + 理想:
– 拒绝上线恐惧症
– 无后顾之忧的提交代码
+ 现在:适当缓解了上线恐惧症
+ 但是:
– 前端的复杂性(HTML/CSS/JS)
– 前端的单元测试作用是有限的
+ 嗯… 其实还处于社会主义初级阶段~
+ 更多的手段(TODO):
– 自动化的功能测试
– 线上错误反馈与快速反应修补
–…