前端单元测试总结

1.为什么需要单元测试

  • 正确性:测试可以验证代码的正确性,在上线前做到心里有底
  • 自动化:当然手工也可以测试,通过console可以打印出内部信息,但是这是一次性的事情,下次测试还需要从头来过,效率不能得到保证。通过编写测试用例,可以做到一次编写,多次运行
  • 解释性:测试用例用于测试接口、模块的重要性,那么在测试用例中就会涉及如何使用这些API。其他开发人员如果要使用这些API,那阅读测试用例是一种很好地途径,有时比文档说明更清晰
  • 驱动开发,指导设计:代码被测试的前提是代码本身的可测试性,那么要保证代码的可测试性,就需要在开发中注意API的设计,TDD将测试前移就是起到这么一个作用
  • 保证重构:互联网行业产品迭代速度很快,迭代后必然存在代码重构的过程,那怎么才能保证重构后代码的质量呢?有测试用例做后盾,就可以大胆的进行重构

2.前端相关的单元测试技术

2.1 测试框架

目前,前端的测试框架很多,像QUnit、jasmine、mocha、jest、intern等框架,这些框架各有特点,简单描述下,感兴趣的可以具体研究:

  • Qunit: 该框架诞生之初是为了jquery的单元测试,后来独立出来不再依赖于jquery本身,但是其身上还是脱离不开jquery的影子
  • jasmine: Behavior-Drive development(BDD)风格的测试框架,在业内较为流行,功能很全面,自带asssert、mock功能
  • mocha: node社区大神tj的作品,可以在node和browser端使用,具有很强的灵活性,可以选择自己喜欢的断言库,选择测试结果的report
  • intern: 看官方介绍该测试框架功能极其全面,似乎囊括了业内跟测试相关的所有功能

2.2 断言库

  • chai:应该是目前组流行的断言库了,支持TDD(assert)、BDD(expect、should)两个风格的断言库

    var chai = require(‘chai‘); 
    
    var assert = chai.assert; // typef assert === ‘object‘
    chai.should(); // 对Obejct.prototype进行拓展
  • should.js: TJ的另外一个开源贡献
  • expect.js:BDD风格的另外一个断言库,基于should.js,是mini版的BDD库
  • assert(node自带核心模块): 可以在node中使用的断言模块

2.3 mock库
先来说说为什么需要mock吧:需要测试的单元依赖于外部的模块,而这些依赖的模块具有一些特点,例如不能控制、实现成本较高、操作危险等原因,不能直接使用依赖的模块,这样情况下就需要对其进行mock,也就是伪造依赖的模块。例如在使用XMLHttpRequest时,需要模拟http statusCode为404的情况,这种情况实际很难发生,必然要通过mock来实现测试。

  • sinon.js: 目前使用最多的mock库,将其分为spies、stub、fake XMLHttpRequest、Fake server、Fake time几种,根据不同的场景进行选择。

2.4 test runner

  • karma: 设置测试需要的框架、环境、源文件、测试文件等,配置完后,就可以轻松地执行测试。

3.单元测试技术的实现原理

  1. 测试框架:判断内部是否存在异常,存在则console出对应的text信息
  2. 断言库:当actual值与expect值不一样时,就抛出异常,供外部测试框架检测到,这就是为什么有些测试框架可以自由选择断言库的原因,只要可以抛出异常,外部测试框架就可以工作。
  3. mock函数:创建一个新的函数,用这个函数来取代原来的函数,同时在这个新函数上添加一些额外的属性,例如called、calledWithArguments等信息

    function describe (text, fn) {
        try {
            fn.apply(...);
        } catch(e) {
            assert(text)
        }
    }
    
    function fn () {
        while (...) {
            beforeEach();
            it(text, function () {
                assert();
            });
            afterEach();
        }
    }
    
    function it(text, fn) {
        ...
        fn(text)
        ...
    }
    
    function assert (expect, actual) {
        if (expect not equla actual ) {
            throw new Error(text);
        }
    }
    function fn () {
        ...
    }
    
    function spy(cb) {
        var proxy = function () {
            ...
        }
        proxy.called = false;
        proxy.returnValue = ‘...‘;
        ...
        return proxy;
    } 
    
    var proxy = spy(fn); // 得到一个mock函数


4.如何写单元测试用例

4.1原则

  • 测试代码时,只考虑测试,不考虑内部实现
  • 数据尽量模拟现实,越靠近现实越好
  • 充分考虑数据的边界条件
  • 对重点、复杂、核心代码,重点测试
  • 利用AOP(beforeEach、afterEach),减少测试代码数量,避免无用功能
  • 测试、功能开发相结合,有利于设计和代码重构

4.2 TDD

一句话简单来说,就是先写测试,后写功能实现。TDD的目的是通过测试用例来指引实际的功能开发,让开发人员首先站在全局的视角来看待需求。具体定义可以查看维基;

就个人而言,TDD不是一个技术,而是一种开发的指导思想。在目前互联网的开发环境下,业务开发很难做到TDD开发,一是因为需要更多时间编写单元测试用例;二是要求非常了解业务需求;三是要求开发人员有很强的代码设计能力。但是当我们写组件、工具方法、类库的时候,TDD就可以得到很好地使用。

4.3 BDD

行为驱动开发要求更多人员参与到软件的开发中来,鼓励开发者、QA、相关业务人员相互协作。BDD是由商业价值来驱动,通过用户接口(例如GUI)理解应用程序。详见维基.

时间: 2024-08-30 13:25:51

前端单元测试总结的相关文章

转:前端单元测试总结

源:http://www.cnblogs.com/bigbrother1984/p/4599915.html 1.为什么需要单元测试 正确性:测试可以验证代码的正确性,在上线前做到心里有底 自动化:当然手工也可以测试,通过console可以打印出内部信息,但是这是一次性的事情,下次测试还需要从头来过,效率不能得到保证.通过编写测试用例,可以做到一次编写,多次运行 解释性:测试用例用于测试接口.模块的重要性,那么在测试用例中就会涉及如何使用这些API.其他开发人员如果要使用这些API,那阅读测试用

前端单元测试总结及测试工具介绍

1.为什么需要单元测试 正确性:测试可以验证代码的正确性,在上线前做到心里有底 自动化:当然手工也可以测试,通过console可以打印出内部信息,但是这是一次性的事情,下次测试还需要从头来过,效率不能得到保证.通过编写测试用例,可以做到一次编写,多次运行 解释性:测试用例用于测试接口.模块的重要性,那么在测试用例中就会涉及如何使用这些API.其他开发人员如果要使用这些API,那阅读测试用例是一种很好地途径,有时比文档说明更清晰 驱动开发,指导设计:代码被测试的前提是代码本身的可测试性,那么要保证

单元测试总结(一)

单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复.改进或重构之后的正确性. 一般来说,单元测试任务包括 接口功能测试:用来保证接口功能的正确性.边界条件测试变量没有赋值(即为NULL)变量是数值(或字符)主要边界:最小值,最大值,无穷大(对于DOUBLE等)溢出边界(期望异常或拒绝服务):最小值-1,最大值+1临近边界:最小值+1,最大值-1 变量是字符串:引用"字符变量"的边界空字符串对字符串长度应用&q

在实际项目中第一次使用单元测试总结

之前我做过单元测试的博,但是在实际的项目中一直还没有使用. 因为之前的项目都是我一个人写的,但是单元测试的必要性真的不大,而且项目本身不难. 但是这次不一样,这次项目本身比较大,而且分工也很明确. 我负责的是服务层和数据层,也就是说,与页面交互上面的代码需要使用我的服务. 也就是说我没有拿页面测试我自己代码的情况了. 一开始我没有写单元测试,然后项目中每当有人说要用我服务的时候,我就特别心慌,万一那个一个点错误了,就会导致别人时间耽误,所以每次别人使用的时候我都赶紧看一下我写的有没有什么问题,但

mvc+webapi 单元测试

1.前言 现在这个项目已经有阶段性的模块完成了,所以就想着对这些模块进行单元测试,以保证项目的代码的质量.首先虽然标题是mvc+webapi实质上我只是对mvc进行的测试.用的时候vs的unit test generator.至于它的安装和介绍在这不做详细介绍.好的现在开始总结我的单元测试总结. 2.单元测试建立 2.1新建单元测试项目 此项目我是把它当作模块插件来处理. 2.2.添加单元测试类 [TestClass] public class mtnfim { //实例化测试mvc Contr

简易四则运算生成程序——第一次改进后的单元测试

测试项目:减一四则运算生成程序 项目成员:张金生  张政 工程地址:https://coding.net/u/jx8zjs/p/paperOne/git ssh://[email protected]:jx8zjs/paperOne.git 测试单元概览: 1. Fraction: 分数类,支持分数加减乘除法,约分,取相反数等 2.QuestionGen:题目生成类,支持生成各种难度的题目,和答案. 待测单元: Fraction类: 1 public class Fraction { 2 pub

java词频统计——改进后的单元测试

测试项目 博客文章地址:[http://www.cnblogs.com/jx8zjs/p/5862269.html] 工程地址:https://coding.net/u/jx8zjs/p/wordCount/git ssh://[email protected]:jx8zjs/wordCount.git 测试用例: 1. 1 My English is very very pool 2.地址 [http://www.gutenberg.org/files/2600/2600-0.txt] 待测单

高并发秒杀系统--Service事务管理与继承测试

[Spring IoC的类型及应用场景]  [Spring事务使用方式] [Spring事务的特性] [Spring事务回滚的理解] [Service声明式事务的配置] 1.配置事务管理器 2.配置基于注解的声明式事务 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xs

Spring Service、Dao进行Junit单元测试

pring对Controller.Service.Dao进行Junit单元测试总结 ? 所有用Junit进行单元测试,都需要下面的配置 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:applicationContext.xml"}) ? applicationContext.xml 是整个项目的Spring的配置文件.包括数据源配置.MVC配置和各种Bean的注