📜  Node.js 应用程序的单元测试

📅  最后修改于: 2022-05-13 01:56:34.219000             🧑  作者: Mango

Node.js 应用程序的单元测试

Node.js 是一个广泛使用的 JavaScript 库,基于 Chrome 的 V8 JavaScript 引擎,用于在 Web 开发中开发服务器端应用程序。

单元测试是一种软件测试方法,其中单独测试单个单元/组件。一个单元可以描述为应用程序中最小的可测试代码部分。单元测试通常由开发人员在应用程序的开发阶段进行。

在 Node.js 中,有许多框架可用于运行单元测试。他们之中有一些是:

  • 摩卡
  • 笑话
  • 茉莉花
  • 艾娃

使用这些框架对节点应用程序进行单元测试:

  1. Mocha: Mocha 是一个古老且广泛使用的节点应用程序测试框架。它支持异步操作,如回调、promise 和 async/await。它是一个高度可扩展和可定制的框架,支持不同的断言和模拟库。

    要安装它,请打开命令提示符并键入以下命令:

    # Installs globally
    npm install mocha -g
    
    # installs in the current directory
    npm install mocha --save-dev
    

    如何使用摩卡?
    为了在您的应用程序中使用此框架:

    1. 打开项目的根文件夹并在其中创建一个名为test的新文件夹。
    2. 在 test 文件夹中,创建一个名为 test.js 的新文件,其中包含与测试相关的所有代码。
    3. 打开 package.json 并在脚本块中添加以下行。
      "scripts": {
      "test": "mocha --recursive --exit"
      }

    例子:

    // Requiring module
    const assert = require('assert');
      
    // We can group similar tests inside a describe block
    describe("Simple Calculations", () => {
      before(() => {
        console.log( "This part executes once before all tests" );
      });
      
      after(() => {
        console.log( "This part executes once after all tests" );
      });
          
      // We can add nested blocks for different tests
      describe( "Test1", () => {
        beforeEach(() => {
          console.log( "executes before every test" );
        });
          
        it("Is returning 5 when adding 2 + 3", () => {
          assert.equal(2 + 3, 5);
        });
      
        it("Is returning 6 when multiplying 2 * 3", () => {
          assert.equal(2*3, 6);
        });
      });
      
      describe("Test2", () => {
        beforeEach(() => {
          console.log( "executes before every test" );
        });
          
        it("Is returning 4 when adding 2 + 3", () => {
          assert.equal(2 + 3, 4);
        });
      
        it("Is returning 8 when multiplying 2 * 4", () => {
          assert.equal(2*4, 8);
        });
      });
    });
    

    复制上面的代码并将其粘贴到我们之前创建的 test.js 文件中。要运行这些测试,请在项目的根目录中打开命令提示符并键入以下命令:

    npm run test

    输出:

    什么是柴?
    Chai 是一个断言库,经常与 Mocha 一起使用。它可以用作 Node.js 的 TTD(测试驱动开发)/BDD(行为驱动开发)断言库,可以与任何基于 JavaScript 的测试框架配对使用。类似于上面代码中的 assert.equal() 语句,我们可以使用 Chai 来编写类似英语句子的测试。

    要安装它,请在项目的根目录中打开命令提示符并键入以下命令:

    npm install chai

    例子:

    const expect = require('chai').expect;
      
    describe("Testing with chai", () => {
        it("Is returning 4 when adding 2 + 2", () => {
          expect(2 + 2).to.equal(4);
        });
      
        it("Is returning boolean value as true", () => {
          expect(5 == 5).to.be.true;
        });
          
        it("Are both the sentences matching", () => {
          expect("This is working").to.equal('This is working');
        });
     });
    

    输出:

  2. Jest: Jest 也是一个流行的测试框架,以其简单性着称。它由 Facebook 定期开发和维护。 jest 的关键特性之一是它有很好的文档记录,并且它支持并行测试运行,即每个测试都将在自己的进程中运行以最大限度地提高性能。它还包括一些功能,如测试观察、覆盖和快照。

    您可以使用以下命令安装它:

    npm install --save-dev jest

    注意:默认情况下,Jest 期望在您的根文件夹中名为“ __tests__ ”的文件夹中找到所有测试文件。

    例子:

    describe("Testing with Jest", () => {
      test("Addition", () => {
        const sum = 2 + 3;
        const expectedResult = 5;
        expect(sum).toEqual(expectedResult);
      });
        
      // Jest also allows a test to run multiple
      // times using different values
      test.each([[1, 1, 2], [-1, 1, 0], [3, 2, 6]])(
      'Does %i + %i equals %i', (a, b, expectedResult) => {
        expect(a + b).toBe(expectedResult);
      });
    });
    

    输出:

  3. Jasmine: Jasmine 也是一个强大的测试框架,自 2010 年以来一直存在。它是一个用于测试 JavaScript 代码的行为驱动开发(BDD)框架。它以与其他测试框架(如 Sinon 和 Chai)的兼容性和灵活性而闻名。这里的测试文件必须有一个特定的后缀 (*spec.js)。

    您可以使用以下命令安装它:

    npm install jasmine-node

    例子:

    describe("Test", function() {
      it("Addition", function() {
        var sum = 2 + 3;
        expect(sum).toEqual(5);
      });
    });
    
  4. AVA: AVA 是一个相对较新的简约框架,允许您同时运行 JavaScript 测试。与 Jest 框架一样,它也支持快照和并行处理,这使得它与其他框架相比相对较快。关键特性包括没有隐式全局变量和对异步函数的内置支持。

    您可以使用以下命令安装它:

    npm init ava

    例子:

    import test from 'ava';
      
    test('Addition', t => {
      t.is(2 + 3, 5);
    });