SlideShare una empresa de Scribd logo
1 de 58
前端测试
个人介绍:

赵勇 / 淘宝UED / 前端 / 遇春(花名)
前端测试
Why   前端
      测试
找一个
说服自己的
理由
产品的变化

• RIA
• Base on Browser
• Heavy Javascript
• Html 5
开发量的变化

       Server        Browser




   Server       Browser
前端关注点的变化
 内部质量       外部质量

 可维护性   前   功能
 性能     端
        质   界面
 设计模式
        量
 开发效率
前端团队的变化

游击队




          正规军
测试同学:

“前端的问题越来越多了”
别再找理由了
先搞起来再说
How   前端
      测试
• 产品界面

         • 功能可用
前端测试目标
         • 性能高效稳定

         • 代码可维护性强
声音
“前端不好测”
“界面老是改,改完用例就没用了”
“单元测试不好做,很难隔离,不好做mock”
“业内没有成熟的实践”
“项目太紧,没时间”
“前端测试性价比不高”
前端的痛
                Dom
                           兼容
                            性
      匿名函
       数
                 Ajax
                            面向过
  异         闭                程
  步         包
                      浏览
       性               器
       能
分而治之
  浏览     兼容    匿名函       Ajax
   器      性     数

                          闭
  Dom                     包
        Dom测试 单元测试
        功能测试 性能测试

  异      面向过         性
  步       程          能
Dom测试              单元测试
•   结构,布局          •   对象属性,方法
•   兼容性            •   过程函数



            前端测试

    功能测试               性能测试
•   过程             •   动态执行响应
DOM测试
• DOM结构完整

测试目标   • 模块布局样式无错乱

       • 浏览器兼容性
谁动了我的TAG




       </div>
还有

• 加个样式,Ie6乱掉了

• 开发html嵌套时,标签没闭合

• 某个元素的样式名写错了

• …
DEMO

http://www.labs.com/sample/ershou.html#testOn
代码

 describe('UI-logo',function(){
      var logo = KISSY.get('#logo');
      it('exist',function(){
       expect(logo).toBeNode();
      });
 })
代码
describe('UI-logo',function(){
     var logo = KISSY.one('#logo');
     it('position is right',function(){
           var oPos = (KISSY.DOM.viewportWidth() – 990)/2;

           expect(logo.width()).toNear(177);
           expect(logo.height()).toNear(48);
           expect(logo.offset().left).toNear(oPos);
           expect(logo.offset().top).toNear(47);
     });
})
代码
describe('UI-新鲜货',function(){
     var freshItem = KISSY.one('#J_FreshItems');
     it('childNode is right',function(){

       expect(freshItem.children().length).toBe(2);

     });
})
功能测试
• 功能可用
功能测试目标
         • 交互过程正确
DEMO

http://www.labs.com/sample/ershou.html#testOn
代码
describe('功能-城市切换', function(){
     var cityTrigger = KISSY.get('.J_CityPicker'),
     cityPopup = KISSY.get('.more-city-bd');


     it('打开地区浮出层', function(){
           jasmine.simulate(cityTrigger, 'mouseover');
           expect(cityPopup).toBeVisible();
     });
})
性能测试
• 同步执行耗时
性能测试目标
         • 异步响应耗时
DEMO

http://www.labs.com/sample/ershou.html#testOn
代码
describe('功能-城市切换', function(){
     var cityTrigger = KISSY.one('.J_CityPicker').getDOMNode(),
     cityPopup = KISSY.one('.more-city-bd').getDOMNode();
     it('打开速度', function(){
           var start = +new Date();
           jasmine.simulate(cityTrigger, 'mouseover');
           var end = +new Date();
           var runtime = end-start;
           expect(cityPopup).toBeVisible();
           expect(runtime).toBeLessThan(500);
     });
})
代码
describe('搜索推荐-城市切换',function(){
  var searchInput = KISSY.get('#J_TBSearchQuery');
  it('自动搜索推荐', function(){
        searchInput.value = 'nokia';
        jasmine.simulate(searchInput,'keydown');
        waits(1000);
        runs(function(){
          var suggestContainer = KISSY.get('.ks-suggest-container');

          var suggestContent = KISSY.one('.ks-suggest-content').children().length;

          expect(suggestContainer).toBeVisible();
          expect(suggestContent).toBe(1);
        });
  });
单元测试
• 函数

单元测试目标   • 对象的属性和方法

         • 业务逻辑
代码可测试性问题

1. 面向过程,过程嵌套

2. 太多的DOM操作

3. 展现逻辑和业务逻辑混淆

4. 闭包
语言特性

1. 本地对象 & 宿主对象

2. 静态作用域链

3. 动态 & 弱类型
提升可测试性




         抽象
过程式函数结构
  function(){

         var    CONSTANTS = 'constants value',
定义常量            ELEMENTID = 'J_EId';

         var    localVariable,
定义变量            result;
         var    element = KISSY.one(ELEMENTID);

从UI层获取数据        localVariable = element.attr('data-need');

处理数据            result = handle(localVariable);

更新DOM           update(element,result);

绑定事件回调          E.on(element, 'event', EventHandler);

  }
对象结构
Obj : {

      attr-data:'value',               数据属性

      attr-ui:D.get('xid'),          DOM相关属性

      method-data:function(){
             // deal attr-data...   处理数据的方法
      },

      method-ui:function(){
             // deal attr-ui...     操作DOM的方法
      },

      process:function(){
             method-data();
                                    功能或过程方法
             method-ui();
      }
}
如何抽象

  1. 单一职责法则,更细颗粒的过程抽象

  2. 避免使用匿名函数

  3. 将数据处理和DOM操作完全分开

  4. 分离业务逻辑和展现逻辑

  5. 减少闭包,为闭包中待测函数提供全局命名空间
过程抽象范例
//...calculate point
           function getLevel(point){
var level;        var level;
if (point < 100){if (point < 100){
       level = '文艺青年';   level = '文艺青年';
}else if (point >= 100 if (point <>= 100 && point < 200){
                  }else && point   200){
       level = ‘2B青年’; level = '2B青年‘;
}else{            }else{
       level = '普通青年‘;   level = '普通青年‘;
}                 }
                  return level;
           }
//...use level

          //...
          var level = getLevel(point);
          //...
闭包内函数暴露测试接口范例
(function(){
      var a = 1;
      function method1(m){
           return a + m;
      }
      testTarget = window['testTarget‘] || {};
      testTarget.method1 = method1;
})();
逻辑分离范例
           Event.on('#content','blur',function(){
                  if(hasError(this.value)){
Event.on('#content','blur',function(){
                         showError();
                  }
       if(this.value === ''){         hasError(this.value)
           })
           function hasError(v){
              alert('输入有误,不能为空')               showError()
                  return isBlank(v);
       }   }
           function isBlank(v){
})                var BLANK = '';
                  return KISSY.trim(v) === BLANK;
           }
           function showError(){
                  var errMsg = '输入有误,不能为空';
                  alert(errMsg);
           }
提升可测试性




         分层
1. 构建Js本地对象

             2. 处理数据逻辑
Javascript   3. 与 Server 通信

             4. 添加事件回调

             5. 操作DOM,BOM
DOM            BOM

                     Javascript

        UI
                       Control
      Model



      Server
MVC对象结构
View                        Control
 obj           obj    obj   instantia
                            tion

        obj          obj    process

                            bindEvent

                            …
Model
 obj          obj
                     obj
        obj
ViewObj
_Attr:value1
                        1. 获取DOM,BOM数据
AttrEl:someEl
                        2. 修改DOM和BOM
getUIData:function(){
       //…
}                       3. 处理展现层逻辑
setUI:function(){
      //…
}
ModelObj
                      1. 建立业务数据模型
_Attr1:value1

_Attr2:value2         2. 处理数据间的逻辑关系
_Method:function(){

}
       //…
                      3. 提供数据访问器
Method:function(){
      //…             4. 预留数据事件接口
}
Control              1. 对象实例化
Var objUI = new View();
Var obj = new Model();
                          2. 初始化
Function Process1(){
       //…
}                         3. 定义过程,实现view
Function Process2(){
       //…
}                          和model层对接
E.on(someEl,’event’,
process1);                4. 事件绑定
分层的好处

  1. 可测试性提升

  2. 各层关注分离,提升可扩展性

  3. 业务逻辑和展现逻辑分离,UI修改更安全
分层的问题

  1. 面向过程面向对象,推行成本较大

  2. 对于简单的过程,反而增加可理解性

  3. 对开发人员的抽象能力要求较高
DEMO

http://www.labs.com/mvc/talk.html
Dom测试       单元测试


        如何应用?

功能测试        性能测试
首页型                  逻辑复杂型


      DOM测试   单元测试


      功能测试    性能测试


交互型
3QA

Más contenido relacionado

La actualidad más candente

深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试lydiafly
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验QLeelulu
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code cleanmacrochen
 
所谓闭包
所谓闭包所谓闭包
所谓闭包ilovey4
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇Justin Lin
 
Ejb工作原理学习笔记
Ejb工作原理学习笔记Ejb工作原理学习笔记
Ejb工作原理学习笔记yiditushe
 
JavaScript Advanced Skill
JavaScript Advanced SkillJavaScript Advanced Skill
JavaScript Advanced Skillfirestoke
 
Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法yiditushe
 
中心教员J2 Ee面试题
中心教员J2 Ee面试题中心教员J2 Ee面试题
中心教员J2 Ee面试题yiditushe
 
Script with engine
Script with engineScript with engine
Script with engineWebrebuild
 
cppcheck源码分析
cppcheck源码分析cppcheck源码分析
cppcheck源码分析Wu Liang
 
Javascript share
Javascript shareJavascript share
Javascript shareXu Mac
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7Justin Lin
 
Jsp面试知识
Jsp面试知识Jsp面试知识
Jsp面试知识yiditushe
 
Cppcheck分析
Cppcheck分析Cppcheck分析
Cppcheck分析Wu Liang
 

La actualidad más candente (19)

深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code clean
 
所谓闭包
所谓闭包所谓闭包
所谓闭包
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
 
Ejb工作原理学习笔记
Ejb工作原理学习笔记Ejb工作原理学习笔记
Ejb工作原理学习笔记
 
JS2
JS2JS2
JS2
 
JavaScript Advanced Skill
JavaScript Advanced SkillJavaScript Advanced Skill
JavaScript Advanced Skill
 
Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法
 
中心教员J2 Ee面试题
中心教员J2 Ee面试题中心教员J2 Ee面试题
中心教员J2 Ee面试题
 
Script with engine
Script with engineScript with engine
Script with engine
 
cppcheck源码分析
cppcheck源码分析cppcheck源码分析
cppcheck源码分析
 
Javascript share
Javascript shareJavascript share
Javascript share
 
Javascript 闭包
Javascript 闭包Javascript 闭包
Javascript 闭包
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
 
Jsp面试知识
Jsp面试知识Jsp面试知识
Jsp面试知识
 
Cppcheck分析
Cppcheck分析Cppcheck分析
Cppcheck分析
 

Destacado

رازهای بهترین تیم های بازی ساز
رازهای بهترین تیم های بازی سازرازهای بهترین تیم های بازی ساز
رازهای بهترین تیم های بازی سازAmir H. Fassihi
 
As You Like It Designs Llc Presentation
As You Like It Designs  Llc PresentationAs You Like It Designs  Llc Presentation
As You Like It Designs Llc Presentationclarekr
 
A Presentation About Michael Gonzalez
A Presentation About Michael GonzalezA Presentation About Michael Gonzalez
A Presentation About Michael GonzalezMichael Gonzalez
 
презентация рожков
презентация рожковпрезентация рожков
презентация рожковCedar Planks
 
A Presentation About Michael Gonzalez
A Presentation About Michael GonzalezA Presentation About Michael Gonzalez
A Presentation About Michael GonzalezMichael Gonzalez
 
A Presentation About Michael Gonzalez
A Presentation About Michael GonzalezA Presentation About Michael Gonzalez
A Presentation About Michael GonzalezMichael Gonzalez
 
بازی سازی ایرانی! توهم؟ واقعیت؟
بازی سازی ایرانی! توهم؟ واقعیت؟بازی سازی ایرانی! توهم؟ واقعیت؟
بازی سازی ایرانی! توهم؟ واقعیت؟Amir H. Fassihi
 
目录结构规范
目录结构规范目录结构规范
目录结构规范Zheng Biao
 
独爽不如众乐
独爽不如众乐独爽不如众乐
独爽不如众乐Zheng Biao
 
Animation Programming Techniques
Animation Programming TechniquesAnimation Programming Techniques
Animation Programming TechniquesAmir H. Fassihi
 
چگونه موفقیت یا شکست پروژه شما از قبل مشخص شده است
چگونه موفقیت یا شکست پروژه شما از قبل مشخص شده استچگونه موفقیت یا شکست پروژه شما از قبل مشخص شده است
چگونه موفقیت یا شکست پروژه شما از قبل مشخص شده استAmir H. Fassihi
 

Destacado (17)

2012 Dodge Charger For Sale TX | Dodge Dealer Near Fort Worth
2012 Dodge Charger For Sale TX | Dodge Dealer Near Fort Worth2012 Dodge Charger For Sale TX | Dodge Dealer Near Fort Worth
2012 Dodge Charger For Sale TX | Dodge Dealer Near Fort Worth
 
Caso ley servir sentnecia
Caso ley servir sentneciaCaso ley servir sentnecia
Caso ley servir sentnecia
 
رازهای بهترین تیم های بازی ساز
رازهای بهترین تیم های بازی سازرازهای بهترین تیم های بازی ساز
رازهای بهترین تیم های بازی ساز
 
As You Like It Designs Llc Presentation
As You Like It Designs  Llc PresentationAs You Like It Designs  Llc Presentation
As You Like It Designs Llc Presentation
 
A Presentation About Michael Gonzalez
A Presentation About Michael GonzalezA Presentation About Michael Gonzalez
A Presentation About Michael Gonzalez
 
презентация рожков
презентация рожковпрезентация рожков
презентация рожков
 
Mit
MitMit
Mit
 
A Presentation About Michael Gonzalez
A Presentation About Michael GonzalezA Presentation About Michael Gonzalez
A Presentation About Michael Gonzalez
 
Alice v3
Alice v3Alice v3
Alice v3
 
A Presentation About Michael Gonzalez
A Presentation About Michael GonzalezA Presentation About Michael Gonzalez
A Presentation About Michael Gonzalez
 
2 ecbi (1)
2 ecbi (1)2 ecbi (1)
2 ecbi (1)
 
بازی سازی ایرانی! توهم؟ واقعیت؟
بازی سازی ایرانی! توهم؟ واقعیت؟بازی سازی ایرانی! توهم؟ واقعیت؟
بازی سازی ایرانی! توهم؟ واقعیت؟
 
目录结构规范
目录结构规范目录结构规范
目录结构规范
 
独爽不如众乐
独爽不如众乐独爽不如众乐
独爽不如众乐
 
جادوی خلاقیت
جادوی خلاقیتجادوی خلاقیت
جادوی خلاقیت
 
Animation Programming Techniques
Animation Programming TechniquesAnimation Programming Techniques
Animation Programming Techniques
 
چگونه موفقیت یا شکست پروژه شما از قبل مشخص شده است
چگونه موفقیت یا شکست پروژه شما از قبل مشخص شده استچگونه موفقیت یا شکست پروژه شما از قبل مشخص شده است
چگونه موفقیت یا شکست پروژه شما از قبل مشخص شده است
 

Similar a 前端测试

用Jquery实现拖拽层
用Jquery实现拖拽层用Jquery实现拖拽层
用Jquery实现拖拽层yiditushe
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术bigqiang zou
 
J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架wtxidian
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非Tony Deng
 
J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架fangdeng
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
KISSY for starter
KISSY for starterKISSY for starter
KISSY for starteryiming he
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
ES5 introduction
ES5 introductionES5 introduction
ES5 introductionotakustay
 
Kissy design
Kissy designKissy design
Kissy designyiming he
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plusDongxu Yao
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 
前端开发之Js
前端开发之Js前端开发之Js
前端开发之Jsfangdeng
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐zhangsuoyong
 
Kind editor设计思路
Kind editor设计思路Kind editor设计思路
Kind editor设计思路taobao.com
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事Ben Lue
 

Similar a 前端测试 (20)

Mvc
MvcMvc
Mvc
 
用Jquery实现拖拽层
用Jquery实现拖拽层用Jquery实现拖拽层
用Jquery实现拖拽层
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
 
J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非
 
J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
KISSY for starter
KISSY for starterKISSY for starter
KISSY for starter
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
ES5 introduction
ES5 introductionES5 introduction
ES5 introduction
 
Kissy design
Kissy designKissy design
Kissy design
 
jasmine入门指南
jasmine入门指南jasmine入门指南
jasmine入门指南
 
Glider
GliderGlider
Glider
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plus
 
Java script closures
Java script closuresJava script closures
Java script closures
 
前端开发之Js
前端开发之Js前端开发之Js
前端开发之Js
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐
 
Kind editor设计思路
Kind editor设计思路Kind editor设计思路
Kind editor设计思路
 
Berserk js
Berserk jsBerserk js
Berserk js
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
 

前端测试