forge test

名称

forge-test - 运行项目的测试。

简介

forge test [options]

描述

运行项目的测试。

分叉

通过传递 --fork-url <URL>,可以在分叉环境中运行测试。

当在分叉环境中运行测试时,你可以像部署合约那样访问分叉链的所有状态。作弊代码 仍然可用。

你也可以通过 --fork-block-number <BLOCK> 来指定分叉的区块编号。当从一个特定的区块分叉时,链上的数据会被缓存到 ~/.foundry/cache。如果你不想缓存链上的数据,请传递 --no-store-caching

在分叉环境中运行时,本地合约无法解码的追踪(例如调用发布在主网的合约,如代币)可以选择使用Etherscan 解码。要使用 Etherscan 进行追踪解码,请设置 ETHERSCAN_API_KEY 或传递 --etherscan-api-key <KEY>

调试

可以在交互式调试器中运行一个测试。要启动调试器,请通过 --debug <TEST>

如果多个测试与指定的模式相匹配,你必须使用其他测试过滤器,以便将匹配的测试数量减少到刚好 1 个。

如果该测试是一个单元测试,它将在调试器中立即打开。

如果测试是模糊测试,模糊测试会被运行,并且在第一个失败的情况下打开调试器。 如果模糊测试没有失败的情况,调试器会在最后一个情况下打开。

关于调试器的更多信息可以在 调试器章节 中找到。

Gas 报告

你可以通过传递 --gas-report 来生成气体报告。

关于 Gas 报告的更多信息可以在 Gas 报告章节 中找到。

List

可以列出测试而不运行它们。 你可以传递 --json,使外部扩展更容易解析结构化内容。

选项

Test Options

-m regex
--match regex
    只运行与指定正则匹配的测试函数。     已废弃: 请见 --match-test.

--match-test regex
    只运行与指定正则匹配的测试函数。

--no-match-test regex
    只运行与指定正则不匹配的测试函数。

--match-contract regex
    只运行与指定正则匹配的测试合约。

--no-match-contract regex
    只运行与指定正则不匹配的测试合约。

--match-path glob
    只运行与指定 glob 匹配的测试源文件。

--no-match-path glob
    只运行与指定 glob 不匹配的测试源文件。

--debug regex
    在调试器中运行一个测试。

    传递给这个标志的参数是你想要运行的测试函数的名称,它的作用与 --match-test 相同。     如果符合你指定标准的测试超过一个,你必须添加额外的过滤器,直到只找到一个测试(见 --match-contract-match-path)。

    无论测试的结果如何,匹配的测试将在调试器中打开。

    如果匹配的测试是一个模糊测试,那么它将在第一个失败用例上打开调试器。如果模糊测试没有失败,它将在最后一个模糊用例下打开调试器。

    为了更精细地控制运行哪种模糊用例,请参阅 forge debug

--gas-report
    打印一个 Gas 报告。

--allow-failure
    即使测试失败,也以代码 0 退出。

--fail-fast
    在第一次测试失败时终止测试。

--etherscan-api-key key
    Etherscan 的 API 密钥。如果被设置了,同时 --fork-url 也被设置了,就会使用 Etherscan 解码追踪。     环境变量:ETHERSCAN_API_KEY

EVM 选项

-f url
--rpc-url url
--fork-url url
    通过远程端点获取状态,而不是从一个空的状态开始。

    如果你想从一个特定的区块号码中获取状态,请参阅 --fork-block-number.

--fork-block-number block
    通过一个远程端点从一个特定的区块号中获取状态。请见 --fork-url.

--fork-retry-backoff <BACKOFF>
     初始化遇到错误时的重试退避。

--no-storage-caching
    明确禁止使用 RPC 缓存。

    所有存储槽完全从端点读取。请见 --fork-url

-v
--verbosity
    EVM 的日志级别。

    多次传递,以提高日志级别 (例如 -v, -vv, -vvv)。

    日志级别:     - 2: 打印所有测试的日志     - 3: 打印失败测试的执行追踪     - 4: 对所有测试进行跟踪,并对失败的测试进行设置跟踪     - 5: 打印所有测试的执行和设置跟踪

--sender address
    用作执行测试的地址

--initial-balance balance
    已部署合约的初始余额

--ffi
    开启 FFI 作弊码

Executor 选项

--base-fee <FEE>
--block-base-fee-per-gas <FEE>
    一个区块的基本费用(单位:Wei)。

--block-coinbase address
    区块的 coinbase。

--block-difficulty difficulty
    区块的难度。

--block-gas-limit gas_limit
    区块的 Gas 限制。

--block-number block
    区块号。

--block-timestamp timestamp
    区块的时间戳(以秒为单位)。

--chain-id chain_id
    链 ID。

--gas-limit gas_limit
    区块的 Gas 限制。

--gas-price gas_price
    Gas 价格(单位:Wei)。

--tx-origin address
    交易的 origin。

缓存选项

--force
    清除缓存和 artifacts 文件夹并重新编译。

链接器选项

--libraries libraries
    设置预链接库。

    参数的格式必须是 <remapped path to lib>:<library name>:<address>,例如 src/Contract.sol:Library:0x...

    也可以在你的配置文件中设置为 libraries = ["<path>:<lib name>:<address>"].

编译器选项

--optimize
    激活 Solidity 优化器。

--optimizer-runs runs
    优化器 runs 的选项。

--via-ir
    使用 Yul 作为编译管道的中间语言。

--revert-strings
    如何处理 revert 和 require 的结果字符串。

--use solc_version
    指定 solc 的版本,或一个本地 solc 的路径,以进行编译。

    有效值的格式为 x.y.zsolc:x.y.zpath/to/solc

--offline
    不使用网络,缺失的 solc 版本将不会被安装。

--no-auto-detect
    不使用 solc 的自动检测。

--ignored-error-codes error_codes
    从错误代码中忽略 solc 警告。该参数是一个以逗号分隔的错误代码列表。

--extra-output selector
    额外的产出要包括在合约的 artifact 中。

    示例键: abi, storageLayout, evm.assembly, ewasm, ir, ir-optimized, metadata

    关于完整的描述, 请参阅 [Solidity docs][output-desc]。

--extra-output-files selector
    额外的输出写到单独的文件。

    示例键: abi, storageLayout, evm.assembly, ewasm, ir, ir-optimized, metadata.

    关于完整的描述, 请参阅 [Solidity docs][output-desc].

--evm-version version
    目标 EVM 版本

Project Options

--build-info
    生成构建信息文件。

--build-info-path path
    输出目录的路径,构建信息文件将被写入。

--root path
    项目的根路径。默认情况下,这是当前 git 仓库的根目录,或当前工作目录。

-C path
--contracts path
    合约源代码目录。     环境变量:DAPP_SRC

--lib-paths path
    库的文件夹路径。

-R remappings
--remappings remappings
    项目的重映射。

    该参数是一个逗号分隔的重映射列表,格式为 <source>=<dest>

--cache-path path
    编译器缓存的路径。

--config-path file
    配置文件的路径。

--hh
--hardhat
    这是一个方便的标志,与传递 --contracts contracts --lib-paths node-modules 相同。

-o path
--out path
    项目的 artifacts 目录。

--silent
    抑制所有输出。

Watch Options

-w [path...]
--watch [path...]
    监听特定的文件或文件夹。

    默认情况下,项目的源目录被监听着。

-d delay
--delay delay
    文件更新的退避延迟。

    在延迟期间,传入的变化事件被累积,只有在延迟过后,才会采取相应的行动。     请注意,这并不意味着一个命令会被启动:如果给出了 --no-restart,而一个命令已经在运行,那么这个动作的结果将是什么都不做。

    默认为 50ms。默认解析为十进制的秒,但使用带有 ms 后缀的整数可能更方便。

    当使用 --poll 模式时,你需要一个更大的持续时间,否则会有磁盘 I/O 过载的风险。

--no-restart
    在命令运行时不要重新启动。

--run-all
    当有变化时,明确地对所有文件重新运行命令。

Display Options

-j
--json
     将部署信息打印成 JSON 格式。

--list
    列出测试而不是运行它们。

普通选项

-h
--help
    打印帮助信息。

例子

  1. 运行测试:

    forge test
    
  2. 在调试器中打开一个测试:

    forge test --debug testSomething
    
  3. 生成一个 Gas 报告:

    forge test --gas-report
    
  4. 只运行 test/Contract.t.sol 中的 BigTest 合约且以 testFail 开头的测试:

    forge test --match-path test/Contract.t.sol --match-contract BigTest \
      --match-test "testFail*"
    
  5. 以期望的格式列出测试:

    forge test --list
    forge test --list --json
    forge test --list --json --match-test "testFail*" | tail -n 1 | json_pp
    

另请参阅

forge, forge build, forge snapshot