SlideShare a Scribd company logo
1 of 33
王致富 @ FED.renren
+ 聊聊现实,谈谈理想
+ 初步规划
+ 写单元测试
+ 跑单元测试
+ objectjs与单元测试
+ 回顾理想,任重道远
+ 当你改了:
  – 一段底层基础库代码
  – 一个全站使用的公共组件
  –…
+ 提交代码之前会不会纠结?
+ 提交代码之后会不会担忧?

+ 理想:
  – 克服上线恐惧症
  – 无后顾之忧、轻松happy的提交代码

+ “理想是人们在实践中形成的、具有实现可能
 的,对未来的向往和追求”
+ “面对现实,立足现实,追求美好,向往明
 天,是我们处理理想和现实关系的一条重
 要准则”

+ 从前端开发人员自己能够充分控制的方面
 入手:从JS单元测试开始

+ “JS单元测试之路”
   – 标题党?
   – 条条大路通罗马,我们的路
+ 什么是单元测试?
  – 单元测试(模块测试)
   开发者编写的一小段代码,
   用于检验被测代码的一个很小、很明确的功能是否
    正确。
 – 白盒
 – 关键词
   开发者编写(并不一定仅限于本人哟~~)
   明确:模块化(CommonJS)

  小

 – 优点:
     验证(保障)、设计、文档、快速、沟通
+ 测试驱动开发( Test-Driven Development )
  – 待办列表:明确要完成的功能
  – 开发功能:先编写测试代码再写功能代码
  – 重构代码:改进设计
  – 一顶帽子/小步前进/及时重构 …

+ 重构(Refactoring)
  – 软件内部结构的一种调整,目的是在不改变“软
    件之可察行为”前提下,提高其可理解性,降低
    其修改成本(Martin Fowler)
  – 有了(单元)测试,才能确保重构满足前提,
    才会让我们更有勇气重构代码
+ 问题:
  – 是什么?OK?
  – 写什么?
                  怎
  – 怎么写?
                  么
  – 用什么写?         写
  – 怎么组织代码?
  – 怎么运行?
                  怎
  – 怎么收集运行结果?     么
  – 什么时候运行测试?     跑
  – 如何保证测试必定会运行?
  – 如何保证上线之前的代码是经过单元测试的
  –…
+ 单元测试主要考虑的两个问题:
  – “怎么写”
  – “怎么跑”
+ 坚持两手抓,两手都要硬!
+ 两手还得互相配合~~
+ 写:
  – 写什么(单元测试及其编写)
  – 用什么写(工具选择)
  – 如何写(工具使用、API)
  – 如何组织(单元测试用例的组织)


+跑
 – 何时跑(使用场景)
 – 怎么跑(单浏览器vs多浏览器)
 – 怎么自动化(半自动化?)
+ 工欲善其事,必先利其器
  – 不重复发明轮子
  – 拿来主义!
  – 我是“懒”人
      优秀程序员的两大要素:懒 + 笨


+ “单元测试有俩宝。”“哪俩宝呀?”
   – 写(QUnit)
   – 跑(jsTestDriver)

+ “有这俩宝,齐了! ”
+ 原来的方式
  – console.log
  – alert
  – test.html
  – demo
  – javascript:void(function(){xxx})();

+ 问题
  – 不全面,想到哪就测到哪
  – 不系统,测到一个算一个
  – 没留下,想看结果要趁早
  – 不直观,结果需要人判断
  – 必须删,线上alert不能忍
+ 写些什么
  – 理论:参考书(《单元测试之道》、《软件工
    程》等)
                  单元测试的一些原则
  测试哪些内容:           边界条件检查:     好的测试应该是:
  • Right-BICEP     • CORRECT   • A-TRIP
  • Right:结果正确      • C:一致性     • A:自动化的
  • B:边界            • O:有序性     • T:彻底的
  • I:反向关联          • R:区间性     • R:可重复的
  • C:交叉检查          • R:耦合性     • I:独立的
  • E:强制错误          • E:存在性     • P:专业的
  • P:性能曲线          • C:基数性
                    • T:时间性
+ 写些什么
  – 实践:参考已有框架的单元测试(如:jQuery)
+ 代码不是万能的
  – string.camelCase


+ 基于共识
  – isWindow引发的血案
  – Array.indexOf(NaN)
QUnit      jsTestDriver    JsUnit
  YUITest              jqMock
                                Jasmine
                jsUnity
     jQunit
              FireUnit jSSpec    J3Unit

+ 放眼望去全是工具
  – JQuery作者就写了好几个~
+ 如何选择?
  – 简单!
  – 可依赖!(好像有点耳熟.. )
+ 选QUnit!
+ 客观原因
  – nothing more,简单!
  – jQuery用它完成了单元测试!可依赖!
+ 主观原因
  – 先入为主
  – 用过JUnit/NUnit,对xUnit从未失望
  – demo直观,效果迅速抓住眼球
  – jQuery作者John Resig写的
  – 排行第一?
+ 简单省地儿的API




      setup
     { teardown




                  stop:中止
                  start:继续
                  “断点续传”解决异步测试
+ HTML
+ CSS
+ JS
+ 与src同级的test目录
+ test目录下包含
   – unit
   – function
   – speed/performance
+ unit目录下
   – test-runner.html      (军长?)


   – index.js    (军部政委?)


   – lib (参谋?)


   – 各分 test目录
           (师)

      index.html (师长?)
      index.js (师部政委?)
      xxx-aspect.js(方面旅?)
+ 文件拆分       (师->旅)


  – 方面
  – basic/usage
  – module(‘name’)
  – 用于定位文件            (团长->旅长)


+ 文件收集
  – 分收集
      index.js
      index.html

  – 总收集
      index.js
      test-runner.html
+ 什么时候跑?
  – 开发时:本地跑
  – 提交之前:本地跑
  – 提交时:服务器自动跑
  – pull代码之后:本地跑

+ 怎么跑?

+ 嗯~~ 打开浏览器,输入url,回车?
  – 能不能一次跑一堆浏览器?     我能!
  – 能不能拿别人的机器帮我跑测试?
                     我也能!
Yeti jsTestDriver   Tutti
 Selenium                          watir
            FitNesse CloudyRun
  crosscheck           TestSwarm
                JsUnit

+ 再一次,放眼望去全是工具
+ 如何选择?
  – 专注于单元测试!
  – 支持远程多浏览器脚本运行!
  – 真实的浏览器环境
  – 简单,可依赖!
+ 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
+ 手动调用jsTestDriver的服务
  – 本地搭建的服务
  – 测试服务器的服务
+ 如何在某一时刻自动跑单元测试?
+ 需要粘合哪些东西?
  – 测试集
  – jsTestDriver
  – hg
  – 邮件系统
+ 用什么粘合?
+ 啊哈!Python,因为:
  – hg用Python实现的~~
  – 用Python写hg扩展灰常方便~
  – Python很时髦哇~
+ objectjs 是FED的一个开源JavaScript框架
   – 强大的OOP
   – 强大的Loader
     遵循CommonJS规范
     强烈支持父子模块命名空间

  – 各种实用的模块


+ objectjs:
   – 朴实低调~~
   – 厚积薄发~~
不错啊,赞~~
+ 理想:
  – 拒绝上线恐惧症
  – 无后顾之忧的提交代码
+ 现在:适当缓解了上线恐惧症
+ 但是:
  – 前端的复杂性(HTML/CSS/JS)
  – 前端的单元测试作用是有限的
+ 嗯… 其实还处于社会主义初级阶段~
+ 更多的手段(TODO):
  – 自动化的功能测试
  – 线上错误反馈与快速反应修补
  –…
+ 单元测试也会有写错的时候
+ 写测试前最好能确定比较稳定的接口~

+   基于原则,勿急功近利
+   拿来主义,勿重复造车
+   基于共识,勿钻牛角尖
+   持久关注,勿一蹴而就
+   协同互补,勿以偏概全

+ 测试可能不那么有趣,但是边开发边单元测试,将
    使开发和测试都变得相当有趣~

+ 最后,乐于分享,不怕炮轰~
JS单元测试之路

More Related Content

What's hot

编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editortaobao.com
 
Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!Fred Chien
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
Jni攻略之十一――启动虚拟机调用Java类
Jni攻略之十一――启动虚拟机调用Java类Jni攻略之十一――启动虚拟机调用Java类
Jni攻略之十一――启动虚拟机调用Java类yiditushe
 
Node.js 异步任务的四种模式
Node.js 异步任务的四种模式Node.js 异步任务的四种模式
Node.js 异步任务的四种模式Stackia Jia
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plusDongxu Yao
 
Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Joseph Chiang
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇Justin Lin
 
Gulp.js 自動化前端任務流程
Gulp.js 自動化前端任務流程Gulp.js 自動化前端任務流程
Gulp.js 自動化前端任務流程洧杰 廖
 
Mybatis学习培训
Mybatis学习培训Mybatis学习培训
Mybatis学习培训flynofry
 
Java cpu
Java cpuJava cpu
Java cpuykdsg
 

What's hot (12)

编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editor
 
Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
Jni攻略之十一――启动虚拟机调用Java类
Jni攻略之十一――启动虚拟机调用Java类Jni攻略之十一――启动虚拟机调用Java类
Jni攻略之十一――启动虚拟机调用Java类
 
Node.js 异步任务的四种模式
Node.js 异步任务的四种模式Node.js 异步任务的四种模式
Node.js 异步任务的四种模式
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plus
 
Tcfsh bootcamp day2
 Tcfsh bootcamp day2 Tcfsh bootcamp day2
Tcfsh bootcamp day2
 
Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
 
Gulp.js 自動化前端任務流程
Gulp.js 自動化前端任務流程Gulp.js 自動化前端任務流程
Gulp.js 自動化前端任務流程
 
Mybatis学习培训
Mybatis学习培训Mybatis学习培训
Mybatis学习培训
 
Java cpu
Java cpuJava cpu
Java cpu
 

Viewers also liked

Taiwan soldier researching
Taiwan soldier researchingTaiwan soldier researching
Taiwan soldier researchingTammy Chen
 
Fundamentals of Data Analytics Outline
Fundamentals of Data Analytics OutlineFundamentals of Data Analytics Outline
Fundamentals of Data Analytics OutlineDan Meyer
 
鸟枪换炮——Objectjs的oop与loader
鸟枪换炮——Objectjs的oop与loader鸟枪换炮——Objectjs的oop与loader
鸟枪换炮——Objectjs的oop与loaderJeaf Wang
 
Definición depsicología evolutiva
Definición depsicología evolutivaDefinición depsicología evolutiva
Definición depsicología evolutivaHugo Gomez
 
Social Media for Crisis Communication - Sneak Peak
Social Media for Crisis Communication - Sneak PeakSocial Media for Crisis Communication - Sneak Peak
Social Media for Crisis Communication - Sneak PeakRebecca Poling
 
презентация.фрагмент.луканина
презентация.фрагмент.луканинапрезентация.фрагмент.луканина
презентация.фрагмент.луканинаelena_lukanina
 

Viewers also liked (7)

Taiwan soldier researching
Taiwan soldier researchingTaiwan soldier researching
Taiwan soldier researching
 
Fundamentals of Data Analytics Outline
Fundamentals of Data Analytics OutlineFundamentals of Data Analytics Outline
Fundamentals of Data Analytics Outline
 
鸟枪换炮——Objectjs的oop与loader
鸟枪换炮——Objectjs的oop与loader鸟枪换炮——Objectjs的oop与loader
鸟枪换炮——Objectjs的oop与loader
 
mypurplemartini.com
mypurplemartini.commypurplemartini.com
mypurplemartini.com
 
Definición depsicología evolutiva
Definición depsicología evolutivaDefinición depsicología evolutiva
Definición depsicología evolutiva
 
Social Media for Crisis Communication - Sneak Peak
Social Media for Crisis Communication - Sneak PeakSocial Media for Crisis Communication - Sneak Peak
Social Media for Crisis Communication - Sneak Peak
 
презентация.фрагмент.луканина
презентация.фрагмент.луканинапрезентация.фрагмент.луканина
презентация.фрагмент.луканина
 

Similar to JS单元测试之路

Java script测试之js unit ut
Java script测试之js unit utJava script测试之js unit ut
Java script测试之js unit utfangdeng
 
July.2011.w3ctech
July.2011.w3ctechJuly.2011.w3ctech
July.2011.w3ctechKai Cui
 
2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發AgileCommunity
 
PHPUnit slide formal
PHPUnit slide formalPHPUnit slide formal
PHPUnit slide formaljameslabs
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1netdbncku
 
Dynamic JS Loader
Dynamic JS LoaderDynamic JS Loader
Dynamic JS Loaderfeifeipan
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代scott liao
 
恶意网页分析实战
恶意网页分析实战恶意网页分析实战
恶意网页分析实战Huang Toby
 
Script with engine
Script with engineScript with engine
Script with engineWebrebuild
 
Class 20170126
Class 20170126Class 20170126
Class 20170126Ivan Wei
 
AngularJS training in Luster
AngularJS training in LusterAngularJS training in Luster
AngularJS training in LusterJason Chung
 
钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具taobao.com
 
Web爬虫那点事
Web爬虫那点事Web爬虫那点事
Web爬虫那点事Yihua Huang
 
Full stack-development with node js
Full stack-development with node jsFull stack-development with node js
Full stack-development with node jsXuefeng Zhang
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发litaocheng
 
美团前端架构简介
美团前端架构简介美团前端架构简介
美团前端架构简介pan weizeng
 
猴子也能懂的Node.js
猴子也能懂的Node.js猴子也能懂的Node.js
猴子也能懂的Node.jsHopenglishRD
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 

Similar to JS单元测试之路 (20)

Java script测试之js unit ut
Java script测试之js unit utJava script测试之js unit ut
Java script测试之js unit ut
 
Berserk js
Berserk jsBerserk js
Berserk js
 
July.2011.w3ctech
July.2011.w3ctechJuly.2011.w3ctech
July.2011.w3ctech
 
2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發
 
PHPUnit slide formal
PHPUnit slide formalPHPUnit slide formal
PHPUnit slide formal
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
 
Dynamic JS Loader
Dynamic JS LoaderDynamic JS Loader
Dynamic JS Loader
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
 
Glider
GliderGlider
Glider
 
恶意网页分析实战
恶意网页分析实战恶意网页分析实战
恶意网页分析实战
 
Script with engine
Script with engineScript with engine
Script with engine
 
Class 20170126
Class 20170126Class 20170126
Class 20170126
 
AngularJS training in Luster
AngularJS training in LusterAngularJS training in Luster
AngularJS training in Luster
 
钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具
 
Web爬虫那点事
Web爬虫那点事Web爬虫那点事
Web爬虫那点事
 
Full stack-development with node js
Full stack-development with node jsFull stack-development with node js
Full stack-development with node js
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发
 
美团前端架构简介
美团前端架构简介美团前端架构简介
美团前端架构简介
 
猴子也能懂的Node.js
猴子也能懂的Node.js猴子也能懂的Node.js
猴子也能懂的Node.js
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 

JS单元测试之路

  • 2. + 聊聊现实,谈谈理想 + 初步规划 + 写单元测试 + 跑单元测试 + objectjs与单元测试 + 回顾理想,任重道远
  • 3. + 当你改了: – 一段底层基础库代码 – 一个全站使用的公共组件 –… + 提交代码之前会不会纠结? + 提交代码之后会不会担忧? + 理想: – 克服上线恐惧症 – 无后顾之忧、轻松happy的提交代码 + “理想是人们在实践中形成的、具有实现可能 的,对未来的向往和追求”
  • 4. + “面对现实,立足现实,追求美好,向往明 天,是我们处理理想和现实关系的一条重 要准则” + 从前端开发人员自己能够充分控制的方面 入手:从JS单元测试开始 + “JS单元测试之路” – 标题党? – 条条大路通罗马,我们的路
  • 5. + 什么是单元测试? – 单元测试(模块测试)  开发者编写的一小段代码,  用于检验被测代码的一个很小、很明确的功能是否 正确。 – 白盒 – 关键词  开发者编写(并不一定仅限于本人哟~~)  明确:模块化(CommonJS) 小 – 优点:  验证(保障)、设计、文档、快速、沟通
  • 6. + 测试驱动开发( Test-Driven Development ) – 待办列表:明确要完成的功能 – 开发功能:先编写测试代码再写功能代码 – 重构代码:改进设计 – 一顶帽子/小步前进/及时重构 … + 重构(Refactoring) – 软件内部结构的一种调整,目的是在不改变“软 件之可察行为”前提下,提高其可理解性,降低 其修改成本(Martin Fowler) – 有了(单元)测试,才能确保重构满足前提, 才会让我们更有勇气重构代码
  • 7. + 问题: – 是什么?OK? – 写什么? 怎 – 怎么写? 么 – 用什么写? 写 – 怎么组织代码? – 怎么运行? 怎 – 怎么收集运行结果? 么 – 什么时候运行测试? 跑 – 如何保证测试必定会运行? – 如何保证上线之前的代码是经过单元测试的 –…
  • 8. + 单元测试主要考虑的两个问题: – “怎么写” – “怎么跑” + 坚持两手抓,两手都要硬! + 两手还得互相配合~~
  • 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
  • 24.
  • 25. + 手动调用jsTestDriver的服务 – 本地搭建的服务 – 测试服务器的服务
  • 26. + 如何在某一时刻自动跑单元测试? + 需要粘合哪些东西? – 测试集 – jsTestDriver – hg – 邮件系统 + 用什么粘合? + 啊哈!Python,因为: – hg用Python实现的~~ – 用Python写hg扩展灰常方便~ – Python很时髦哇~
  • 27.
  • 28. + objectjs 是FED的一个开源JavaScript框架 – 强大的OOP – 强大的Loader  遵循CommonJS规范  强烈支持父子模块命名空间 – 各种实用的模块 + objectjs: – 朴实低调~~ – 厚积薄发~~
  • 30.
  • 31. + 理想: – 拒绝上线恐惧症 – 无后顾之忧的提交代码 + 现在:适当缓解了上线恐惧症 + 但是: – 前端的复杂性(HTML/CSS/JS) – 前端的单元测试作用是有限的 + 嗯… 其实还处于社会主义初级阶段~ + 更多的手段(TODO): – 自动化的功能测试 – 线上错误反馈与快速反应修补 –…
  • 32. + 单元测试也会有写错的时候 + 写测试前最好能确定比较稳定的接口~ + 基于原则,勿急功近利 + 拿来主义,勿重复造车 + 基于共识,勿钻牛角尖 + 持久关注,勿一蹴而就 + 协同互补,勿以偏概全 + 测试可能不那么有趣,但是边开发边单元测试,将 使开发和测试都变得相当有趣~ + 最后,乐于分享,不怕炮轰~