Truffle测试
一、快速入门truffle
(1)创建项目工程
为 Truffle 项目创建新目录:
mkdir MetaCoin
cd MetaCoin
下载 (“unbox”) MetaCoin box:
truffle unbox metacoin
在操作完成之后,就有这样的一个项目结构:
contracts/
: Solidity合约目录migrations/
: 部署脚本文件目录test/
: 测试脚本目录,参考 如何测试应用?truffle.js
: Truffle 配置文件
(2)项目结构
contracts/MetaCoin.sol
: 这是一个用 Solidity 编写的 MetaCoin 代币 智能合约。注意他还引用了目录下的另外一个合约文件contracts/ConvertLib.sol
。contracts/Migrations.sol
: 这是一个单独的 Solidity 文件,用来管理和升级智能合约. 每一个工程都有这样的一个文件,并且通常不需要编辑它。migrations/1_initial_migration.js
: 这是一个部署脚本,用来部署Migrations
合约,对应Migrations.sol
文件。migrations/2_deploy_contracts.js
: 这是一个部署脚本,用来部署MetaCoin
合约. (部署脚本的运行是有顺序的,以2开头的脚本通常在以1开头的脚本之后运行)test/TestMetacoin.sol
: 这是一个用Solidity编写的测试用例文件,用来检查合约是否像预期一样工作。test/metacoin.js
: 这是一个用JavaScript编写的测试用例脚本,用途和上面一样。truffle-config.js
(之前是truffle.js
): Truffle 配置文件, 用来设置网络信息,和其他项目相关的设置。当我们使用内建的默认的Truffle命令时,这个文件留空也是可以的。
(3)使用测试
运行 JavaScript 测试用例
truffle test ./test/metacoin.js
(4)编译合约
编译智能合约:
truffle compile
(5)使用 Truffle Develop 部署合约
为了部署我们的合约,我们需要连接到区块链网络。Truffle 提供了一个内置的个人模拟区块链,它可以帮助我们用来测试。注意,这个区块链是内地在我们本地的系统里面,他不和以太坊的组网进行连接。
我们可以使用Truffle Develop来创建区块链,并与之交互。
运行 Truffle Develop:
truffle develop
这也显示了10个账号,和他们对你的私钥,这些账号可以用来和区块链进行交互
在 truffle(develop)> 提示符(因为提供了一个交互式控制台)下, Truffle 的命令可以不带前缀 truffle
执行。比如,可以直接输入compile
来执行truffle compile
,以及直接输入 migrate
来部署编译的智能合约到区块链(相当于truffle migrate
):
migrate
(6)通过 Ganache 部署
除了用上面的 Truffle Develop,还可以选择使用 Ganache, 这是一个桌面应用,他同样会创建一个个人模拟的区块链。 对于刚接触以太坊的同学来说,Ganache
会更容易理解,因为他把所有的信息,都输在前端的界面。
不像 Truffle Develop 把链和控制台集成在一起,使用 Ganache 需要编辑配置文件,以便 Truffle 能链接 Ganache 实例。
- 下载安装 Ganache.
- 编辑器打开
truffle.js
,使用下面的内容:
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 7545,
network_id: "*"
}
}
};
3.保存关闭配置文件。
4.启动Ganache
5.打开控制台,执行部署:
truffle migrate
在 Ganache 里,点击 “Transactions” 可以看到交易详情。
为了和合约进行交互,我们可以使用 Truffle 的控制台:truffle console
, Truffle console 和 Truffle Develop 类似,仅仅是他们连接的链不一样而已,这里是连接 Ganache 。
truffle console
(7)合约交互
在 Truffle v5, 控制台支持 async/await 方法(同步方式), 这样让跟合约交互更简单了,方法如下:
-
从获取部署合约实例 及获取账号列表 开始:
truffle(development)> let instance = await MetaCoin.deployed() truffle(development)> let accounts = await web3.eth.getAccounts()
-
检查账号余额:
truffle(development)> let balance = await instance.getBalance(accounts[0]) truffle(development)> balance.toNumber()
-
查看以太价值(其实就是调用了一个合约方法:合约方法里定义了一个metacoin 价值 2 ether):
truffle(development)> let ether = await instance.getBalanceInEth(accounts[0]) truffle(development)> ether.toNumber()
-
发送一些 metacoin 到其他的账号 :
truffle(development)> instance.sendCoin(accounts[1], 500)
-
检查刚刚收款人的余额:
truffle(development)> let received = await instance.getBalance(accounts[1]) truffle(development)> received.toNumber()
-
检查刚刚发送方的余额:
truffle(development)> let newBalance = await instance.getBalance(accounts[0]) truffle(development)> newBalance.toNumber()
二、实战演练
1.创建测试项目
mkdir truffle_demo && cd truffle
truffle init && npm init -y
2.导入合约
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
contract test_demo {
address public owner;
uint public last_completed_test;
constructor() {
owner = msg.sender;
}
modifier restricted() {
require(
msg.sender == owner,
"This function is restricted to the contract's owner"
);
_;
}
function setCompleted(uint completed) public restricted {
last_completed_test = completed;
}
}
3.编译合约
truffle compile
4.编写测试脚本
const test_demo = artifacts.require("test_demo");
if ("owner succeed",async function[] {
const myConttract = await test_demo.deployed[];
await debug[myContract.owner()];
} );
5.测试合约
truffle test
const test_demo = artifacts.require(“test_demo”);
if (“owner succeed”,async function[] {
const myConttract = await test_demo.deployed[];
await debug[myContract.owner()];
} );
5.测试合约
truffle test