zoukankan      html  css  js  c++  java
  • 单元测试 Qunit

     
    选中 "Check for Globals" 会暴露全局对象,看你的代码会不会无意中输出到全局对象属性去了
     
    选中 No try-catch 的话,出现错误testrunner就会挂掉,让你看到原生的错误提示,帮助在老浏览器调试  ie6啦
     
    本质上任何一个单元测试的元素都是进行认定,测试框架将测试者定义的期望结构和实际结果进行比对,Qunit提供了八个方法来认定。
     
    assert.ok( 1 == "2", "成功啦!" );    当第一个参数返回TRUE就表示测试通过了,后面的字符串用来描述该测试
     
    assert.equal( 0, 0, "Zero, Zero; equal succeeds" );    这个方法是用==来比较现实参数和期望参数,第一个是现实的值,第二个是期望的值
    assert.strictEqual( 0, 0, "Zero, Zero; equal succeeds" );    这个方法是用=== 绝对相等来比较的
    assert.deepEqual( obj, { foo: "bar" }, "Two objects can be the same in value" );    这也是用绝对相等来比较的,并且会比较两个对象里面的属性是否一致,还可以比较NaN,日期对象,正则表达式,函数等equal()不能胜任的
     
    有时候你的代码可能会让测试没有运行到,加上expect()告诉测试器一共要执行多少个测试:
    QUnit.test( "a test", function( assert ) {
      expect( 4 );
      function calc( x, operation ) {
        return operation( x );
      }
      var result = calc( 2, function( x ) {
        assert.ok( true, "calc() calls operation function" );
        return x * x;
      });
      assert.equal( result, 4, "2 square equals 4" );
    });
     
    对于异步回调函数的话,要使用asyncTest,配备QUnit.start();:
    QUnit.asyncTest( "asynchronous test: one second later!", function( assert ) {
      expect( 1 );

      setTimeout(function() {
        assert.ok( true, "Passed and ready to resume!" );
        QUnit.start();
      }, 1000);
    });
     
    测试需要交互的场景:
    function KeyLogger( target ) {
      if ( !(this instanceof KeyLogger) ) {
        return new KeyLogger( target );
      }
      this.target = target;
      this.log = [];
     
      var self = this;
     
      this.target.off( "keydown" ).on( "keydown", function( event ) {
        self.log.push( event.keyCode );
      });
    }
    测试代码:
    QUnit.test( "keylogger api behavior", function( assert ) {
     
      var event,
          $doc = $( document ),
          keys = KeyLogger( $doc );
     
      // trigger event
      event = $.Event( "keydown" );
      event.keyCode = 9;
      $doc.trigger( event );
     
      // verify expected behavior
      assert.equal( keys.log.length, 1, "a key was logged" );
      assert.equal( keys.log[ 0 ], 9, "correct key was logged" );
    });
     
    在module()方法之后的测试属于同一个模块:
    QUnit.module( "group a" );        
    QUnit.test( "a basic test example", function( assert ) {
      assert.ok( true, "this test is fine" );
    });
    QUnit.test( "a basic test example 2", function( assert ) {
      assert.ok( true, "this test is fine" );
    });
     
    QUnit.module( "group b" );
    QUnit.test( "a basic test example 3", function( assert ) {
      assert.ok( true, "this test is fine" );
    });
    QUnit.test( "a basic test example 4", function( assert ) {
      assert.ok( true, "this test is fine" );
    });
    module()还可以提取模块中各测试的共同部分,setup在每个测试之前运行,teardown在测试后运行:
    QUnit.module( "module", {
      setup: function( assert ) {
        assert.ok( true, "one extra assert per test" );
      }, teardown: function( assert ) {
        assert.ok( true, "and one extra assert after each test" );
      }
    });
    QUnit.test( "test with setup and teardown", function() {
      expect( 2 );
    });
     
    还可以定制自己的测试方法:
    QUnit.assert.contains = function( needle, haystack, message ) {
      var actual = haystack.indexOf(needle) > -1;
      QUnit.push(actual, actual, needle, message);
    };
    QUnit.test("retrieving object keys", function( assert ) {
      var objectKeys = keys( { a: 1, b: 2 } );
      assert.contains( "a", objectKeys, "Object keys" );
      assert.contains( "b", objectKeys, "Object keys" );
     
      var arrayKeys = keys( [1, 2] );
      assert.contains( "1", arrayKeys, "Array keys" );
      assert.contains( "2", arrayKeys, "Array keys" );
    });
  • 相关阅读:
    读《程序是怎样跑起来的》第七章有感
    读《程序是怎样跑起来的》第六章有感
    读《程序是怎样跑起来的》第五章有感
    读《程序是怎样跑起来的》第四章有感
    读《程序是怎样跑起来的》第三章有感
    读《怎样成为一个高手 183》有感
    读《程序是怎样跑起来的》第二章有感
    《程序是怎样跑起来的》第一章读后感
    我与计算机
    师生关系
  • 原文地址:https://www.cnblogs.com/chuangweili/p/5166355.html
Copyright © 2011-2022 走看看