• node相关--测试


    测试:

    • assert模块; //node自带
      var assert = require('assert');
       
      var now = Date.now();
      console.log(now);
      assert.ok(now % 2 == 0);
      
      
      ----------------------------------------
      var request = require('superagent');
      var assert = require('assert');
       
      request.get('http://localhost:3000')
             .send({q: 'bieber'})
             .end(function (res) {
              //断言判断响应状态码是否正确
              assert.ok(200 == res.status);
              //断言关键字是否存在
              assert.ok(~res.text.toLowerCase().indexOf('bieber'));
              //断言列表项是否存在
              assert.ok(~res.text.indexOf('<li>'));
             });
    • ecpect.js,优化assert的代码书写方式; API:
      • ok:断言是否为真:
        expect(1).to.be.ok();
        expect(true).to.be.ok();
        expect({}).to.be.ok();
        expect(0).to.not.be,ok();
      • be/equal: === 

        expect(1).to.be(1);
        expect(NaN).not.to.equal(NaN);
        expect(1).not.to.be(true);
      • eql:断言非严格相等,支持对象

        expect({a: 'b'}).to.eql({a: 'b'});
        expect(1).to.eql('1');
      • a/an:断言所属属性类型,支持数组的instanceof
        expect(5).to.be.a('number');
        expect([]).to.be.an('array');
        expect([]).to.be.an('object');
        //constructor
        expect(5).to.be.a('Number');
        expect([]).to.be.an('Array');
        expect(tobi).to.be.a(Ferrect); //instanceof
      • match:断言字符串是否匹配一段正则表达式
        expect(program.version).to.match(/[0-9]+.[0-9]+.[0-9]+/);
      • contain:断言字符串是否包含另一个字符串;
        expect([1,2]).to.contain(1);
        expect('hello world').to.contain('world');
      • length:断言数组长度;
        expect([]).to.have.length(0);
        expect([1,2,3]).to.have.length(3);
      • empty:断言数组是否为空;
        expect([]).to.be.empty();
        expect([1,2,3]).to.not.be.empty();
      • property:断言某个自身属性/值是否存在;
        expect(window).to.have.property('expect');
        expect(window).to.have.property('expect',expect);
        expect({a: 'b'}).to.have.property('a');
      • key/keys:断言键是否存在,支持only修饰符;
        expect({a: 'b'}).to.have.key('a');
        expect({a: 'b', c: 'd'}).to.only.have.keys('a', 'c');
        expect({a: 'b', c: 'd'}).to.only.have.keys(['a'.'c']);
        expect({a: 'b', c: 'd'}).to.not.only.have.keys('a');
      • throwException:断言Function在调用时是否会抛出异常;
        expect(fn).to.throwException();
        expect(fn2).to.not.throwException();
      • within:断言数组是否在某一个区间内;
        expect(1).to.be.within(0,Infinity);
      • greaterThan/above:   >
        expect(3).to,be.above(0);
        expect(5).to.be.greaterThan(3);
      • lessThan/below: <
        expect(0).to.be.below(3);
        expect(1).to.be.lessThan(3);

    Moncha: 测试框架

    • 例子:
      • test.js
        describe('a topic', function () {
            it('should test something', function () {
         
            });
            describe('anthor topic', function () {
                it('should test something else', function () {
                     
                })
            })
        });
      • 运行:mocha test.js   ;报告列表形式:  mocha -R list test.js
    • 测试异步代码:Mocha默认在一个测试用例执行之后立即执行另一个;但有时候希望延缓下一个测试用例的执行;
      it('should not know', function (done) {
         setTimeout(function () {
            assert.ok(1 == 1);
            done();
         }, 100);   
      });
      

        如果一个测试用例中有许多异步操作,可以添加一个计数器:

      it('should complete three requests', function (done) {
        var total = 3;
        request.get('http://localhost:3000/1', function (res) {
           if(200 != res.status) throw new Error('Request error'); --total || done();
        });
        request.get('http://localhost:3000/2', function (res) {
           if(200 != res.status) throw new Error('Request error'); --total || done();
        });
        request.get('http://localhost:3000/3', function (res) {
           if(200 != res.status) throw new Error('Request error'); --total || done();
        });
      })
    • BDD风格: 前面的测试例子风格为BDD(行为驱动开发);
    • TDD风格: 测试驱动开发,组织方式是使用测试集(suit)和测试(test);每个测试集都有setup和teardowm函数,这些方法会在测试集中的测试执行前执行,为了避免代码重复已经最大限度使得测试之间相互独立;
      suite('net', function () {
         suite('Stream', function () {
            var  client;
            suiteSetup(function () {
               client = net.connect(3000, 'localhost');
            });
       
            test('connect event', function (done) {
               client.on('connect', done);
            });
       
            test('receiving data', function (done) {
              client.write('');
              client.once('data', done);
            });
       
            suiteTeardown( function () {
              client.end();
            })
         })
      })
    • export风格:使用node模块系统来输出测试;每个export的键都表示测试集,嵌套的测试集可以用子对象来表示
      exports.Array = {
         '#indecOf()' : {
            'should return -1 when the value is not present' : function () {},
            'should return the correct index when the value is present' : function () {}
         }
      }

    在浏览器端使用Mocha:  例子

  • 相关阅读:
    objc_setAssociatedObject 使用(转)
    UIWebView加上safari风格前进后退按钮(转)
    解决 ios7.0 以后自定义导航栏左边按钮靠右的问题
    iOS开发中邮箱,电话号码,身份证,密码,昵称正则表达式验证
    利用openURL,在IOS应用中打开另外一个应用
    点击按钮打开文件
    CString的中文显示乱码的解决办法
    Unicode字符集和多字节字符集关系(转载)
    MFC基础--C++中的字符集(转自MSDN)http://msdn.microsoft.com/zh-cn/library/06b9yaeb(v=vs.90).
    MFC基础--CString的Tokenize()和_tcstok()的用法对比
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/4133441.html
Copyright © 2020-2023  润新知