测试

Forge 可以使用 forge test 命令运行测试(用例)。 所有测试都是用 Solidity 编写的。

Forge 将在您的源目录中的任何位置查找测试。 任何具有以test开头的函数的合约都被认为是一个测试。 通常,测试将按照约定放在 test 中,并以 .t.sol 结尾。

下面是在新创建的项目中运行 forge test 的示例,该项目只有默认测试:

$ forge test
No files changed, compilation skipped

Running 2 tests for test/Counter.t.sol:CounterTest
[PASS] testIncrement() (gas: 28312)
[PASS] testSetNumber(uint256) (runs: 256, μ: 27376, ~: 28387)
Test result: ok. 2 passed; 0 failed; finished in 24.43ms

您还可以通过传递过滤器来运行特定测试:

$ forge test --match-contract ComplicatedContractTest --match-test testDeposit
Compiling 7 files with 0.8.10
Solc 0.8.10 finished in 4.20s
Compiler run successful

Running 2 tests for test/ComplicatedContract.t.sol:ComplicatedContractTest
[PASS] testDepositERC20() (gas: 102237)
[PASS] testDepositETH() (gas: 61458)
Test result: ok. 2 passed; 0 failed; finished in 1.05ms

这将在名称中带有 testDepositComplicatedContractTest 测试合约中运行测试。 这些标志的反向版本也存在(--no-match-contract--no-match-test)。

您可以使用 --match-path 与 glob 模式匹配的文件名中运行测试。

$ forge test --match-path test/ContractB.t.sol
No files changed, compilation skipped

Running 1 test for test/ContractB.t.sol:ContractBTest
[PASS] testExample() (gas: 257)
Test result: ok. 1 passed; 0 failed; finished in 492.35µs

--match-path 标志的反面是 --no-match-path

日志和跟踪

forge test 的默认行为是只显示通过和失败测试的摘要。 您可以通过增加详细程度(使用-v标志)来控制此行为。 每个详细级别都会添加更多信息:

  • 级别 2 (-vv):还会显示测试期间发出的日志。 这包括来自测试的断言错误,显示诸如预期与实际结果等之类的信息。
  • 级别 3 (-vvv):还显示失败测试的堆栈跟踪。
  • 级别 4 (-vvvv):显示所有测试的堆栈跟踪,并显示失败测试的设置(setup)跟踪。
  • 级别 5 (-vvvvv):始终显示堆栈跟踪和设置(setup)跟踪。

Watch模式

当您使用forge test --watch对文件进行更改时,Forge 可以重新运行您的测试。

默认情况下,仅重新运行更改的测试文件。 如果你想重新运行更改的所有测试,你可以使用 forge test --watch --run-all