Skip to content

Latest commit

 

History

History
88 lines (65 loc) · 2.49 KB

testing_integrate.md

File metadata and controls

88 lines (65 loc) · 2.49 KB

集成测试

前言

前两篇篇文章讲述了普通的单元测试和服务的单元测试,其中第二篇利用run模块执行子进程进行启动服务,等测试完毕或异常就关闭服务。 现实项目中除了单元测试,等项目发布或者上线都要对所有单元测试进行合并测试,这就是最原始集成测试。

上一篇的测试进阶是利用run开启服务子进程进行测试,本篇的集成测试也是利用run模块,将所有单元测试作为一个个子进程逐步启动测试。

实现步骤

  • 步骤1:准备各个单元测试目录下的入口文件 test.ts,设置所有单元测试的子进程列表。
  • 步骤2:利用 AsyncIterableIterator 迭代执行每个子进程,将stdout标准输出捕获打印出来

具体例子

demo地址

https://github.com/chenshenhai/deno-note/tree/master/demo/testing_integrate

具体集成测试源码

./demo/testing_integrate/test.js

#!/usr/bin/env deno test --allow-all test.ts

const decoder = new TextDecoder();

// 这里的单元测试例子 是前两篇的单元测试
// https://github.com/chenshenhai/deno-note/tree/master/demo/testing_unit
// https://github.com/chenshenhai/deno-note/tree/master/demo/testing_integrate

const testUnitRunList = [
  {
    cmd: [Deno.execPath(), "run", "--allow-run", "--allow-net", "test.ts", "--", ".", "--cors"],
    cwd: "./../testing_unit",
    stdout: "piped"
  },
  {
    cmd: [Deno.execPath(), "run", "--allow-run", "--allow-net", "test.ts", "--", ".", "--cors"],
    cwd: "./../testing_progress",
    stdout: "piped"
  }
]

async function runUnitTest(opts: Deno.RunOptions): Promise<string> {
  const unitTest = Deno.run(opts);
  const outStream = await unitTest.output();
  const output = decoder.decode(outStream);
  return output
}

async function *runAllUnitTest(optsList: any[]): AsyncIterableIterator<any[]>{
  for (let i = 0; i < optsList.length; i++) {
    let err = null;
    let log = null;
    const opts: Deno.RunOptions = optsList[i];
    try {
      log = await runUnitTest(opts);
    } catch (e) {
      err = e;
    }
    yield [err, log];
  }
}

async function main() {
  for await(const [err, log] of runAllUnitTest(testUnitRunList)) {
    if (err) {
      throw new Error(err);
    } else {
      console.log(log);
    }
  }
}

main();

执行单元测试

deno run --allow-all test.ts

test_i_001