引言

上次那个网站,里面有讲foundry,虽然以前学习过,但是还是没能具体学习过,只会一些测试的用法,其他高深的用法还没有了解到,借此机会再次学习一下,就写了这个笔记

安装

推荐这个网站Foundry-Book;
安装完成后,在终端使用指令:Forge –version 查看有没有安装好,如果没有,就删除从头再来一遍

我们使用的是windows的系统就要去找属于window安装教程(我就反复安装,吃了很多亏),如果你想使用windows上的子系统Linux,就可以在你的终端使用 wsl –install ,然后重启安装即可

使用 (forge )

最开始我还没有了解到怎么自己用Foundry全是从仓库 git clone 下来,它自带Foundry,就不需要自己构建文件夹。现在就介绍一下怎么构建一个文件夹包含Foundry测试框架。(注意我们使用的是VSCODE这个软件,非常好用)

  • 首先创建一个文件夹,在git base终端上输入 forge init 文件夹名字
  • 进入文件夹 cd 文件夹名字
  • 再构建项目 forge build 或则 forge compile
  • 测试时使用 forge test 如果要测试,测试合约中的一个测试函数,是可以使用过滤条件方法:forge test –match-contract 测试合约名 –match-test 测试函数,也可以使用路径测试$ forge test –match-path test/ContractB.t.sol

cast

一些Cast的指令:

  • 获取当前链的ID:cast chain-id
  • 获取当前客户端版本:cast client
  • 获取当前gas价格:cast gas-price
  • 查询最新的区块号:cast block-number
  • 获取当前的网络基础费:cast basefee
  • 获取block的详细信息:cast block
  • 获取区块的时间戳信息:cast age
  • 查询特定的以太坊账户地址:cast balance 地址 如果不知道地址,就使用ENS查询:cast balance vitalik.eth
  • 查看源代码:cast etherscan-source 地址

anvil

它可以提供一个方便测试和开发的以太坊节点
使用anvil指令,它可以输出账户,私钥,链ID,基本费用等
通过使用anvil-h,可以查看anvil所有的配置选项
使用anvil -a 数量,可以生成指定的数量开发账户

Chisel

Chisel是一个Solidity REPL,用于编写和测试Solidity代码片段,它提供了一个用于编程和执行ASolidity代码的交互式环境

Forge Std

它是Forge标准库,为Foundry框架提供了丰富的辅组合约,简化和加速编写智能合约测试的过程并提升用户体验
使用Forge Std 只需要在测试合约导入Test.sol并继承Test

核心功能:
访问Hevm:通过vm实例直接使用,cheatcode模拟各种区块链状态和行为

Hevm是DappHub团队开发的以太坊虚拟机实现,专门用于测试和调试智能合约,它是一个命令行工具,可以模拟以太坊网络的行为,允许开发人员在本地执行测试和调试它们的合约,而无需连接到实际的以太坊网络
断言和日志:从Dappsys Test 继承,具有断言功能和一Hardhat为风格的日志记录
标准库功能:Forge Std 提供的标准库包括各种实用的工具和功能,例如,向指定账户发送代币

在Forge标准库的测试合约中,通过vm实例可以方便的访问作弊码
例如:身份转化:vm.prank;使用vm.prank()函数,我们可以暂时切换调用者的身份

编写测试合约

必要工作,导入:import “forge-std/Test.sol”
setUP函数,是一个可选函数,在运行测试用例之前调用,用于初始化测试环境
以test为前缀的函数将被识别为测试用例并执行
testFail函数,用于指示预期的测试失败,如果此函数未触发还原,则测试失败

还有一些高级的测试技术:expectRevert:它是进行精准的错误处理,例如,vm.expectRevert(Some.Error.selector) //可触发SomeError一些错误

共享设置:通过创建抽象合约并在测试合约中继承它,可以设置共享:

abstract contract SetupHelper {
// Shared setup codes
}

contract MyTest is Test, SetupHelper {
function setUp() public {
// Shared setup
}
}

通过共享设置可以避免在每个测试合约中重复相同的初始化代码,提高代码的可重用性和可维护性

导入文件,用
import “forge-std/Test.sol”
这个是必要的