node.js入门02

使用 async 控制并发:

//上例爬虫的问题,实际情况对一次性发送的请求数是要控制的;

  • 例子:
    var async = require('async');
    
    var concurrencyCount = 0;
    var fetchUrl = function (url, callback) {
    	//delay 2s内随机数
      var delay = parseInt((Math.random() * 10000000) % 2000, 10);
      concurrencyCount++;
      console.log('现在的并发数是', concurrencyCount, ',正在抓取的是', url, ',耗时' + delay + '毫秒');
      setTimeout(function () {
        concurrencyCount--;
        callback(null, url + ' html content');
      }, delay);
    };
    
    //伪造一组链接
    var urls = [];
    for(var i = 0; i < 30; i++) {
      urls.push('http://datasource_' + i);
    }
    
    //并发连接数始终控制在 5 个。
    async.mapLimit(urls, 5, function (url, callback) {
      fetchUrl(url, callback);
    }, function (err, result) {
      console.log('final:');
      console.log(result);
    });
    

    //与eventproxy相比:如果抓取是小于 10 个源来汇总数据的时候,用 eventproxy;当需要用到队列,需要控制并发数使用 async

 测试:

  • 使用mocha,should.js来测试;
    • 待测试例子:
      var fibonacci = function (n) {
      	if (n === 0) {
      		return 0;
      	}
      	if (n === 1) {
      		return 1;
      	}
      	return fibonacci(n-1) + fibonacci(n-2);
      };
      
      //当文件直接从Node运行时,require.main设置为它的模块
      if (require.main === module) {
      	var n = Number(process.argv[2]);
      	console.log('fibonacci(' + n + ') is', fibonacci(n));
      }
      
      exports.fibonacci = fibonacci;
    • 测试方法:
      var main = require('./main');
      var should = require('should');
      
      describe('/test.js', function () {
      	it('should qual 55 when n === 10', function () {
      		main.fibonacci(10).should.equal(55);
      	});
      });
  • 测试驱动开发例子:先描述要达到的目标,然后让现有的程序跑不过 case,再修补程序,让 case 通过。接上例:
    • 测试方法中描述目标:
      describe('/test.js', function () {
      	it('should qual 55 when n === 10', function () {
      		main.fibonacci(10).should.equal(55);
      	});
      	it('should throw when n > 10', function () {
      		(function () {
      			main.fibonacci(11);
      		}).should.throw('n should <= 10');
      	});
      });
    • 测试报错后修改被测试代码:
      var fibonacci = function (n) {
      	if (n === 0) {
      		return 0;
      	}
      	if (n === 1) {
      		return 1;
      	}
      	if (n > 10) {
      	    throw new Error('n should <= 10');
      	}
      	return fibonacci(n-1) + fibonacci(n-2);
      };
  • 用istanbul 显示覆盖率:
    • 执行:istanbul cover _mocha; //window不能直接用_mach,用具体path替代如:istanbul cover .\node_modules\mocha\bin\_mocha; url
    • 执行之后会生成coverage文件,可以通过里面的文件在浏览器端查看;

浏览器端单元测验:

  • 用mocha,chai.js测试
    • 初始化测试文件:mocha init filename;  //会生成一个简单的测试原型
    • 加入chai.js断言库,测试文件,待测试文件,注意顺序:
      <div id="mocha"></div>
      <script src="vendor/mocha.js"></script>
      <script src="vendor/chai.js"></script>
      <script src='cow.js'></script>
      <script>mocha.setup('bdd')</script>
      <script src="cow_test.js"></script>
      <script>  mocha.run(); </script>
    • 然后直接打开index.html看结果;
    • 安装mocha-phanatomjs
  • 测试反馈:mocha没有提供一个命令行的前端脚本测试环境,可以使用phanatomjs搭建一个模拟环境;这里直接使用mocha-phantomjs;
    • 安装:
       npm i -g mocha-phantomjs
    • 将index.html对应部分修改为 :
      <script>
        if (window.mochaPhantomJS) { mochaPhantomJS.run(); }
        else { mocha.run(); }
      </script>
    • 然后在命令行中运行:

       mocha-phantomjs index.html
    • 也可以在文件夹内安装mocha-phantomjs之后,直接在package.json中定义
      "scripts": {
        "test": "./node_modules/.bin/mocha-phantomjs  /index.html"
      },
      ----
      然后运行: npm test

 

你可能感兴趣的:(node.js)