Nodejs测试:从0到90(实践篇)

简介: 继上一篇理论,本篇重点说明实践,包括nodejs中异步、Promises、私有方法、mock及web等的测试方法。

继上一篇理论,本篇重点说明实践,包括nodejs中异步、Promises、私有方法、mock及web等的测试方法。

方法

以下示例均基于mocha.

异步

在异步操作完成时,调用回调(通常是 done) 即可。

describe('User', function() {
  describe('#save()', function() {
    it('should save without error', function(done) {
      var user = new User('Luna');
      user.save(done);
    });
  });
});
AI 代码解读

Mocha的超时设定默认是2s,如果执行的测试超过2s的话,就会报timeout错误。可以修改超时时间,有两种方法:

  • 命令行式
mocha -t 10000
AI 代码解读
  • API式
describe('async', function () {
  this.timeout(10000);
  
  it('async', function (done) {
    lib.async(function (result) {
      done();
    });
  });
});
AI 代码解读

Promises

如果异步操作的返回结果是 Promise,可以使用 Chai as Promised

'use strict';

require('should');
require('chai').use(require('chai-as-promised'));

describe('test/app/simple/promise.test.js', () => {

  it('#Promise', ()=> {
    (new Promise(function(resolve) {
      resolve(10);
    })).should.be.a.Promise();

    (10).should.not.be.a.Promise();
  });

  it('#fulfilled', () => {
    return new Promise(resolve => resolve(10))
        .should.be.fulfilled();
  });

  it('#fulfilledWith', () => {
    return new Promise((resolve) => resolve(10))
        .should.be.fulfilledWith(10);
  });

  it('#rejected', () => {
    return new Promise((resolve, reject) => reject(new Error('boom')))
        .should.be.rejected();
  });
});
AI 代码解读

私有方法

一般测试只测试接口或公共方法,并不直接测试私有方法。但是如果当私有方法特别多且复杂时,测试私有方法比测试接口或公共方法更直接、有效。

严格上讲,javascript并没有私有方法的概念,这里所讨论的私有方法指未被导出(exports)的方法。

一个简单的盒子,在一个 cal.js 里有一个 add 方法,如下所示:

function add(a, b) {
  return a + b;
}
AI 代码解读

此方法为私有方法,无法直接通过 cal 测试,但可以通过 rewire 获取。

rewire adds a special setter and getter to modules so you can modify their behaviour for better unit testing.

获取上面的私有方法,并测试:

it('1 + 1 should equals 2', function () {
  let cal = rewire('./cal.js');
  let add = cal.__get__('add');
  add(1, 1).should.be.eql(2);
});
AI 代码解读

除了获取私有方法,rewire 还可以设置私有变量或方法, 以便测试。

比如有这样一个模块,

// lib/myModules.js
// With rewire you can change all these variables
var fs = require("fs"),
    path = "/somewhere/on/the/disk";

function readSomethingFromFileSystem(cb) {
    console.log("Reading from file system ...");
    fs.readFile(path, "utf8", cb);
}

exports.readSomethingFromFileSystem = readSomethingFromFileSystem;
AI 代码解读

设置并获取私有变量。

myModule.__set__("path", "/dev/null");
myModule.__get__("path"); // = '/dev/null'
AI 代码解读

还可以用作mock。

var fsMock = {
    readFile: function (path, encoding, cb) {
        expect(path).to.equal("/somewhere/on/the/disk");
        cb(null, "Success!");
    }
};
myModule.__set__("fs", fsMock);
AI 代码解读

更多用法见 文档

mock

mock就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。nodejs中常用的mock工具有 muksinon 等,以sinon为例简要说明一下其用法。

需要测试的方法:

function once(fn) {
    var returnValue, called = false;
    return function () {
        if (!called) {
            called = true;
            returnValue = fn.apply(this, arguments);
        }
        return returnValue;
    };
}
AI 代码解读
  • Spy
it("calls the original function", function () {
    var spy = sinon.spy();
    var proxy = once(spy);
    proxy();

    assert(spy.called);
});
AI 代码解读
  • Stubs
it("returns the return value from the original function", function () {
    var stub = sinon.stub().returns(42);
    var proxy = once(stub);

    assert.equals(proxy(), 42);
});
AI 代码解读
  • Mocks
it("returns the return value from the original function", function () {
    var myAPI = { method: function () {} };
    var mock = sinon.mock(myAPI);
    mock.expects("method").once().returns(42);

    var proxy = once(myAPI.method);

    assert.equals(proxy(), 42);
    mock.verify();
});
AI 代码解读

更多参考 文档

web

主要依赖 SuperTest ,已在工具部分说明,不再赘述。

更多

持续集成

持续集成(CI, Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

github 上大部分 ci 都是基于 Travis CI。详细接入方案见官方文档,不在此讨论。

代码风格

当写js代码的时候,一个校验工具可以确保一个项目遵循代码规范、帮助我们避免愚蠢的错误。目前比较流行js校验工具有 JSLintJSHintJSCSESLint, 它们之前的差异比较可以参考 A Comparison of JavaScript Linting Tools,推荐使用 ESLint

代码风格检查同样也可以集成到 ci,只需要在 ci 命令前追加检查命令即可。以 eslint 为例:

  "scripts": {
    // ..
    "lint": "eslint .",
    "cov": "istanbul cover .",
    "ci": "tnpm run lint && TEST_TIMEOUT=60000 istanbul cover ."
  },
AI 代码解读

此时构建会先做代码风格检查,再做单元测试、覆盖率统计,如代码风格检查失败,会直接导致构建中断。

写在后面的

原本计划写一个nodejs的测试参考,帮助还不太了解nodejs测试的同学快速入门,在写的过程中才发现,需要的东西太多,而自己又知道的太少。虽然在一个应用的测试中覆盖率达到了90%,但并不代码在测试方面可以拿到90分。

正如前面写到的,”剩下的10,还有很长的路“,甚至比从0到90更长,唯有不断的学习才能进一步提升,希望自己还能再写个下篇《Nodejs测试:从90到100》。

References

上一篇:Nodejs测试:从0到90(理论篇)

目录
打赏
0
0
0
0
36
分享
相关文章
浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)
最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。
57 4
自动化测试框架的演进与实践###
本文深入探讨了自动化测试框架从诞生至今的发展历程,重点分析了当前主流框架的优势与局限性,并结合实际案例,阐述了如何根据项目需求选择合适的自动化测试策略。文章还展望了未来自动化测试领域的技术趋势,为读者提供了宝贵的实践经验和前瞻性思考。 ###
探索软件测试的深度与广度:从理论到实践
在数字化时代,软件已成为我们生活中不可或缺的一部分。随着技术的不断进步和用户需求的多样化,确保软件质量变得尤为重要。本文将深入浅出地介绍软件测试的核心概念、类型及其在软件开发生命周期中的重要性。我们将通过实际案例,展示如何实施有效的测试策略,并探讨自动化测试的未来趋势,旨在为读者提供一套完整的软件测试知识体系,帮助提升软件质量和开发效率。
探索软件测试的奥秘:从理论到实践
在软件开发的宇宙中,软件测试犹如一颗璀璨的星辰,指引着质量的方向。本文将带你穿梭于软件测试的理论与实践之间,揭示其内在的逻辑和魅力。从测试的重要性出发,我们将探讨不同类型的测试方法,并通过实际案例分析,深入理解测试用例的设计和应用。最后,我们将通过一个代码示例,展示如何将理论知识转化为实际操作,确保软件质量的同时,也提升你的测试技能。让我们一起踏上这段探索之旅,发现软件测试的无限可能。
自动化测试框架的搭建与实践
在软件开发领域,自动化测试是提升开发效率、确保软件质量的关键手段。本文将引导读者理解自动化测试的重要性,并介绍如何搭建一个基本的自动化测试框架。通过具体示例和步骤,我们将探索如何有效实施自动化测试策略,以实现软件开发流程的优化。
88 7
探索软件测试的奥秘:从理论到实践
本文深入探讨了软件测试的基本概念、重要性、主要类型以及实施策略。通过分析不同测试阶段和相应的测试方法,文章旨在为读者提供一套完整的软件测试知识体系,帮助他们更好地理解和应用测试技术,确保软件产品的质量和可靠性。
72 4
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
66 2
软件测试中的自动化测试框架选择与实践
在当今快节奏的软件开发环境中,自动化测试成为了确保软件质量和加速交付的关键。本文将探讨自动化测试的重要性,并比较几种流行的自动化测试框架,包括Selenium、Appium和TestComplete。文章还将提供一些最佳实践和案例研究,以帮助读者更好地理解和实施自动化测试策略。
电商API的测试与用途:深度解析与实践
在电子商务蓬勃发展的今天,电商API成为连接电商平台、商家、消费者和第三方开发者的重要桥梁。本文深入探讨了电商API的核心功能,包括订单管理、商品管理、用户管理、支付管理和物流管理,并介绍了有效的测试技巧,如理解API文档、设计测试用例、搭建测试环境、自动化测试、压力测试、安全性测试等。文章还详细阐述了电商API的多样化用途,如商品信息获取、订单管理自动化、用户数据管理、库存同步、物流跟踪、支付处理、促销活动管理、评价管理、数据报告和分析、扩展平台功能及跨境电商等,旨在为开发者和电商平台提供有益的参考。
69 0
探索软件测试中的自动化框架:从基础到高级实践
在当今快速发展的软件行业中,自动化测试已成为提高开发效率和保障产品质量的关键手段。本文将深入探讨软件测试自动化的各个方面,包括其重要性、主流的自动化测试框架、以及如何有效地实施自动化测试策略。我们还将通过案例分析,展示自动化测试在实际项目中的应用效果,以及面临的挑战和解决方案。无论是软件开发者还是测试工程师,了解并掌握自动化测试技术都将极大提升工作效率和产品质量。
61 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等