Truffle 入门教学

451 阅读3分钟

当你在使用 Solidity 编写智能合约时,你可能希望编写一些测试用例来验证合约的正确性和预期行为。Truffle 是一个流行的用于开发、测试和部署以太坊智能合约的开发框架。在本教程中,我们将介绍如何使用 Truffle 编写和运行测试用例来测试智能合约。

步骤 1: 安装 Truffle

首先,你需要安装 Truffle。你可以通过运行以下命令来全局安装 Truffle:

npm install -g truffle

步骤 2: 创建 Truffle 项目

在你的工作目录中创建一个新的 Truffle 项目。打开终端并运行以下命令:

mkdir hello-world-test
cd hello-world-test
truffle init

这将创建一个新的 Truffle 项目并初始化目录结构。

创建相关测试脚本文件

truffle.cmd create contract HelloWord 
truffle.cmd create migrations HelloWord 
truffle.cmd create test HelloWord

补充 contract/HelloWord.sol文件

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

contract HelloWord {
    string public _name;

    constructor(string memory name) {
        _name = name;
    }

    function setName(string memory name) public {
        _name = name;
    }

    function getName() public view returns (string memory) {
        return _name;
    }
}

修改 migrations/HelloWord.js文件

const Hello = artifacts.require("HelloWord")

module.exports = function(_deployer) {
  _deployer.deploy(Hello, "123")
};

步骤 3: 编写测试用例

在 Truffle 项目中,测试用例文件存放在 test 目录下。在该目录会生成一个新的文件,例如 hello-world.js。将以下代码复制到该文件中:

    // 导入 HelloWord 合约
    const HelloWord = artifacts.require("HelloWord");

    // 定义合约测试套件
    contract("HelloWord", function (accounts) {
      let helloWordInstance;

      // 在每个测试用例运行之前执行的钩子函数
      beforeEach(async () => {
        // 部署 HelloWord 合约并将其实例存储在 helloWordInstance 变量中
        helloWordInstance = await HelloWord.deployed();
      });

      // 第一个测试用例:测试 setName 函数是否成功设置了合约中的名字
      it("set name", async () => { 
        // 定义一个新的名字
        const newName = "姓名";
        // 调用合约的 setName 函数,将新的名字设置到合约中
        await helloWordInstance.setName(newName);
        // 获取合约中更新后的名字
        const updatedName = await helloWordInstance.getName();
        // 使用断言来检查更新后的名字是否与设置的新名字相同
        assert.equal(updatedName, newName, "设置姓名失败");
      });

      // 第二个测试用例:测试 getName 函数是否能够正确返回合约中的名字
      it("get Name", async () => {
        // 调用合约的 getName 函数获取合约中的名字
        const name = await helloWordInstance.getName();
        // 使用断言来检查获取的名字是否与预期的名字相同
        assert.equal(name, "姓名", "获取姓名失败");
      });
    });

在上述代码中,我们首先导入了 HelloWord 合约,然后定义了一个合约测试套件。在每个测试用例之前,我们使用 beforeEach 钩子函数部署了 HelloWord 合约并将其实例存储在 helloWordInstance 变量中。

接下来,我们编写了两个测试用例来测试 HelloWord 合约的功能。第一个测试用例验证 setName 函数是否能成功设置合约中的名字,而第二个测试用例验证 getName 函数是否能正确返回合约中的名字。

步骤 4: 运行测试

在终端中,确保你的智能合约正在运行,并进入项目的根目录。然后运行以下命令来执行测试:

truffle test .\test\hello_word.js

Truffle 将自动编译合约并执行测试用例。你将能够看到测试结果和断言是否通过。

测试结果示例:

Compiling your contracts...
===========================
> Compiling ./contracts/HelloWord.sol
> Artifacts written to ./build/contracts
> Compiled successfully using:
   - solc: 0.8.10+commit.fc410830.Emscripten.clang

  Contract: HelloWord
    √ set name (68ms)
    √ get Name (54ms)

  2 passing (1s)

以上示例显示了两个测试用例都通过了测试。

通过编写测试用例并运行测试,你可以确保你的智能合约在不同情况下都能正确运行,并验证其预期行为。