generate-test-case

1.2.4 • Public • Published

generate-test-case

一个为 OJ 生成测试用例的 CLI 工具

环境

node: 14.x

安装

npm install -g generate-test-case
gtc -h

指南

gtc 通过'输入模版'(template)和'代码源文件'(source.js),来生成输入输出的测试用例。 他内部的实现原理就是通过 template 生成输入测试用例,然后使用输入测试用例执行source.js文件,最后生成输出测试用例。(如果你是 C 语言这样的编译性质的语言可以配置 config.js 文件实现编译运行) template 是一个由普通字符串和模版代码构成的文本文件。 source.js 是标准的 OJ 程序。

接下来试的用一下

我们先创建一个文件夹比如1000,然后按照题的描述describe.md创建文件templatesource.js,如果你想控制某些参数可以通过config.js文件 (如果只是生成 node 程序的测试用例,可以不创建) 目前我们的目录是这样的 (https://github.com/WumaCoder/generate-test-case/tree/master/tests/.example):

  • 1000/
    • template
    • source.js
    • config.js
    • lib/
      • stdin.js
    • describe.md

describe.md

## 速算机器人

### 题目描述

小扣在秋日市集发现了一款速算机器人。店家对机器人说出两个数字(记作 x 和 y),请小扣说出计算指令:

"A" 运算:使 x = 2 _ x + y;
"B" 运算:使 y = 2 _ y + x。
在本次游戏中,店家说出的数字为 x = 1 和 y = 0,小扣说出的计算指令记作仅由大写字母 A、B 组成的字符串 s,字符串中字符的顺序表示计算顺序,请返回最终 x 与 y 的和为多少。

**示例:**

输入:s = "AB"

输出:4

解释:
经过一次 A 运算后,x = 2, y = 0。
再经过一次 B 运算,x = 2, y = 2。
最终 x 与 y 之和为 4### 样例输入

"AB"

### 样例输出

4

template

在花阔号内的是一段可执行的 JS 脚本,在这里可以执行 JS 的语句和方法,GTC 提供了一些常用的生成方法可以调用,具体请查看 Generate API

{ "AB".repeat($i+1) }

source.js

/**
 * @param {string} s
 * @return {number}
 */
var calculate = function (s) {
  return 1 << s.length;
};

async function main() {
  const input = await getLine();
  const output = calculate(input);
  console.log(output);
  close();
}

main();

lib/stdin.js

const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const buffer = [];
var getLineCount = 0;

rl.on("line", function lineEvent(v) {
  buffer.push(v);
});

rl.on("close", function closeEvent() {
  setImmediate(function closeProcess() {
    if (buffer.length === 0 || getLineCount === 0) {
      process.exit(0);
    } else {
      setImmediate(closeProcess);
    }
  });
});

function getLine() {
  getLineCount++;
  return new Promise((resolve) => {
    setImmediate(function run() {
      if (buffer.length !== 0) {
        resolve(buffer.shift());
        getLineCount--;
      } else {
        setImmediate(run);
      }
    });
  });
}

function close() {
  rl.close();
}

module.exports = { getLine, close };

config.js

module.exports = {
  root: ".", // 当前目录
  exec: "node", // 执行的命令

  execFilePath: "./source.js", // 执行的文件
  injectLibs: ["./lib/stdin.js"], // 执行之前要注入的文件

  stdinTemplatePath: "./template", // 输入模版位置

  outDir: "./data", // 测试实例输出位置
  count: 10, // 生成数量
};

然后在当前目录下执行 gtc, 后查看 ./data 下的文件 到这里你已经会基本操作,更多详细内容请查看 Config APIGenerate API

Cli Options

Cli 基本与下面的配置文件一致 这里只需要说一下三个特殊的选项

gtc -c "./config.js" -sdc
# -c ,--config 表示的是配置文件的位置,默认是 "./config.json"
# -sdc ,--setDefaultConfig 表示是否将当前的配置替换为默认配置

gtc -i
# -i ,--init 创建默认配置文件

Config API

interface Config {
  root: string; // 根目录 default:"."
  compile: string; // 编译命令,不包含文件路径
  exec: string; // 执行命令,不包含文件路径

  compileFilePath: string; // 要编译的源文件,他会拼接到compile后面
  execFilePath: string; // 要执行的文件,他会拼接到exec后面 default: <compileFilePath>
  source: string; // 源码 他和compileFilePath只能写一个
  injectLibs: string[]; // 执行之前注入的文件,比如上面的 getLine

  stdinTemplatePath: string; // 输入数据的模版文件的位置 default: template
  stdinTemplate: string; // 输入文件模版

  outDir: string; // 测试用例输出位置
  count: number; // 生成数量 default: 10
}

Generate API

independent variable

变量名 类型 功能
$i number 每执行完一个输入用例就会加 1

string

方法名 参数说明 功能
randomChar(strList = []):string @param {string[]} strList 待选字符数组,如果不传入表示随机生产一个字母 随机生成字符
randomStr(len, strList = []):string @param {number} len 随机生成长度为 len 的字符串
@param {string[]} strList 待选字符数组,如果不传入表示随机生产一个字母
随机生成字符串
randomWord(n, strList = []): string @param {number} n 生成由 n 个单词组成的字符串,没有.号。
@param {string[]} strList 待选字符数组,如果不传入表示随机生产一个字母
随机生成多个字

array

方法名 参数说明 功能
randomNumArr(start, end, Len):number[] @param {number} start 开始数
@param {number} end 结束的数
@param {number} len 数组个数
生成 [start,end) 个随机数的数组
randomStrArr(strLen, len):string[] @param {number} strLen 字符串长度
@param {number} len 数组个数
@param {string} separator 分割符
生成长度为 strLen 的字符串数组
incrNumArr(start, len, step = 1):number[] @param {number} start 初始值
@param {number} len 长度
@param {number} step 步长
生成一个顺序数列

number

方法名 参数说明 功能
random(start, end):number @param {number} start
@param {number} end
生成 [start, end) 区间内的随机数

tree

返回的与leetcode的二叉树字符串一样,都是层序遍历的字符串

方法名 参数说明 功能
randomBinaryTree(start = 0, end = 100, len = 100, vacancy = 5): string @param {number} start 开始值
@param {number} end 结束值
@param {number} len 数组长度
@param {number} vacancy 空节点概率 0 是100% 1是50% 2是33%
生成一个随机的二叉树
symmetryBinaryTree(base = 0, dep = 10): string @param {number} base 基础值
@param {number} dep 深度
成对称二叉树
randomBST(start, end, len):TreeNode @param {number} start 开始值
@param {number} end 结束值
@param {number} len 长度
生成随机的二叉搜索树

base

方法名 参数说明 功能
repeat(cb, n):array @param {(i:number)=>any} cb 回调
@param {number} n 执行次数
执行 n 次 cb,并且将结果返回成数组

About

如果这个工具对你有用,请不要吝啬你的 Star,如果有问题可以提交 Issue,如果你想添加更多的 Generate API 请提交 PR,并且同步 API 文档

Readme

Keywords

Package Sidebar

Install

npm i generate-test-case

Weekly Downloads

0

Version

1.2.4

License

MIT

Unpacked Size

40.9 kB

Total Files

57

Last publish

Collaborators

  • mark_npm