单元测试

我们通过编写 Javascript/Typescript 来测试合约。样板项目 中有很多合约的测试用例。

首先,在工程根目录下运行 npm init 来创建一个 npm 项目。接下来安装依赖:

  1. 安装 scryptlib

npm i scryptlib

提示

scryptlib 是官方提供的用于集成以 sCrypt 语言编写的比特币智能合约的 Javascript/TypeScript SDK。

  1. 安装 mocha 测试框架

npm i -D chai mocha

提示

我们推荐使用 mocha 测试框架来进行合约的测试,当然您可以使用其它测试框架。

  1. package.json 中配置测试命令

package.json 文件的脚本部分中应该存在一个名为 single-test 的脚本。IDE 用它来运行单个文件测试。通常它看起来像 "single-test": "mocha",但您可以自定义它。

{
    "name": "helloworld",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "test": "mocha -r ts-node/register tests/**/*scrypttest.*  --reporter spec --timeout 600000",
        "single-test": "mocha --reporter spec --timeout 120000" //测试命令
    },
    "author": "",
    "license": "ISC",
    "dependencies": {
        "scryptlib": "^0.3.10"
    },
    "devDependencies": {
        "chai": "^4.3.4",
        "mocha": "^8.4.0"
    }
}

IDE 支持在代码编辑器/资源管理器上下文菜单中运行单元测试文件。开始运行后,IDE 会为你自动打开VS Code底部面板,并显示 输出 视图, 测试报告将输出到 输出 面板。

备注

测试文件必须以 .scrypttest.js.scrypttest.ts 为后缀,否则菜单中不会出现“Run sCrypt Test”选项。

_images/run_testting.gif
  1. 测试合约时,您可以使用加载编译输出的 合约描述文件 (也是就 _desc.json 文件)比如:

const MyContract = buildContractClass(JSON.parse(descFileContent));

也可以使用 scryptlib 导出 compileContract 或者 compile 函数来编译合约。

const MyContract = buildContractClass(compileContract('demo.scrypt'));
  1. 创建合约的实例

const instance = new MyContract(1234, true, ...parameters);
  1. 执行合约的 public 函数来验证合约的正确性。

const funcCall = instance.someFunc(new Sig('0123456'), new Bytes('aa11ff'), ...parameters);
const result = funcCall.verify(context);
expect(result.success, result.error).to.be.true;

Launch Debugger 命令

通常情况下,可使用右键菜单来运行单元测试,这样可以从 输出 中单击测试报告中的链接来打开调试器。 但是某些情况下,测试在外部环境运行,比如终端。 这种情况您将无法通过单击测试报告中的链接来打开调试器。这个时候,可以使用 Launch Debugger 命令,将 scryptlaunch:///{file} 粘贴到命令的输入弹出框中,并按 Enter 来启动调试器。

备注

即使即将调试的合约不在当前项目中,也可以启动调试器

_images/scryptlaunch.gif