在 node.js 中自动化功能测试

Automate Functional Testing in node.js

我检查了一些 NPM 库来测试网页或网络服务。但是他们都希望服务器已经 运行ning。由于我想自动化功能测试,我该如何设置 NPM 包

  1. 可以启动服务器
  2. 测试应用程序
  3. 停止服务器

这样我就可以在本地以及在线 CI 工具(例如 travis-ci 或 circleci.

上进行测试

案例一:网络服务

我写了一个启动 nodejs HTTP(s) 服务器的 NPM 包。它可以从命令行 $stubmatic 启动。目前,我使用两种方法来测试它,

  1. manual : 我从命令行手动启动它。然后 运行 测试。
  2. 自动:我使用 exec 模块到 运行 可以启动应用程序的 unix 命令和 运行 pkill 命令来终止应用程序。但是对于这个自动化,我的应用程序需要安装在测试机器上。

案例二:网站

我已经创建了一个 NPM 包:fast-xml-parser 并在存储库中创建了一个演示页面,以便我可以在浏览器中进行测试。为了测试演示页面,我目前手动使用 http-server npm 包启动本地服务器。测试应用程序。

为 node js 应用程序编写自动化功能测试的更好方法是什么?

注:

这个问题提到了一个新的 Docker Travis 容器系统,可以在本地复制。这可能是一种方式:How to run travis-ci locally

你看过supertest (SuperAgent driven library for testing HTTP servers) and expect (Assertions library)(documented here) with mocha (Test Framework)了吗?

我使用它们,直到现在我做的所有测试都没有遇到过任何问题。

链接中的文档包含构建测试所需的所有信息。

案例一:网络服务

问题 1 由于 nodejs server.close() 不工作。我将这段代码复制粘贴到每个启动我的网络服务的测试文件中。

try{
    server.setup(options);
    server.start();
}catch(err){
    console.log(err);
}

所有测试完成后,服务器停止。

**问题2 我错误地使用了 chai-http。这是完整的工作解决方案。

//Need to be placed before importing chai and chai-http
if (!global.Promise) {
  global.Promise = require('q');
}

var server = require('.././lib/server');
var chai = require('chai')
  , chaiHttp = require('chai-http');

 chai.use(chaiHttp);

try{
    server.setup(someoptions);
    server.start();
}catch(err){
    console.log(err);
}

describe('FT', function () {

  describe('scenario::', function () {

    it('responds to POST', function (done) {
        chai.request("http://localhost:9999")
            .post('/someurl')
            .then(res => {
                expect(res.status).toBe(200);
                //console.log(res.text);
                done();
            }).catch( err => {
                console.log(err);
                done();
            });
    });

});

案例2:网站 这很简单。

  • 我使用 http-server 启动服务器,以便可以访问我的 html 文件。
  • 我用僵尸js做浏览器测试。 (还有许多其他选项可用于浏览器测试)

这是代码

process.env.NODE_ENV = 'test';

const Browser = require('zombie');
const httpServer = require('http-server');

describe("DemoApp", function() {
  var browser = new Browser({site: 'http://localhost:8080'});
  var server = httpServer.createServer();
  server.listen(8080);

  beforeEach(function(done){
      browser.visit('/', done);
  });

  describe("Parse XML", function() {

    it("should parse xml to json", function(done) {
       browser.pressButton('#submit');
       browser.assert.text('#result', 'some result text');
       done();
    });
   });

   afterEach(function(){
       server.close();
   })
});