测试

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

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

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

$ forge test
No files changed, compilation skipped

Ran 2 tests for test/Counter.t.sol:CounterTest
[PASS] testFuzz_SetNumber(uint256) (runs: 256, μ: 30977, ~: 31288)
[PASS] test_Increment() (gas: 31303)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 8.10ms (7.84ms CPU time)

Ran 1 test suite in 9.41ms (8.10ms CPU time): 2 tests passed, 0 failed, 0 skipped (2 total tests)

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

$ forge test --match-contract ComplicatedContractTest --match-test test_Deposit
Compiling 24 files with Solc 0.8.10
Solc 0.8.10 finished in 1.09s
Compiler run successful!

Ran 2 tests for test/ComplicatedContract.t.sol:ComplicatedContractTest
[PASS] test_DepositERC20() (gas: 102193)
[PASS] test_DepositETH() (gas: 61414)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.16ms (1.49ms CPU time)

Ran 1 test suite in 5.78ms (1.16ms CPU time): 2 tests passed, 0 failed, 0 skipped (2 total tests)

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

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

$ forge test --match-path test/ContractB.t.sol
Compiling 1 files with Solc 0.8.10
Solc 0.8.10 finished in 1.06s
Compiler run successful!

Ran 1 test for test/ContractB.t.sol:ContractBTest
[PASS] testExample() (gas: 257)
Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 328.36µs (46.13µs CPU time)

Ran 1 test suite in 5.94ms (328.36µs CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)

--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