-
Notifications
You must be signed in to change notification settings - Fork 668
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Docs for in-line test configuration. * Added description about base config inheritance * Rewording * Pages that describe "tests" now reference pages that describe how to config tests. * Config in block comments explained
- Loading branch information
Showing
4 changed files
with
92 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
## In-line test configuration | ||
Foundry users are enabled to specify overall test configurations, using a combination of ENV variables and config statements in the `foundry.toml`. Checkout the [📚 Testing reference](./testing) for a detailed description. | ||
|
||
Despite this may work in the general case, some tests may need finer control over their configuration. For such reason Forge provides a way to specify per-test configs for invariant and fuzz testing scenarios. | ||
|
||
Users can in-line test config statements directly in Solidity comments. This would affect the behavior of the `forge test` command for a specific test instance, as illustrated in the example below. | ||
|
||
```solidity | ||
contract MyTest is Test { | ||
/// forge-config: default.fuzz.runs = 100 | ||
/// forge-config: ci.fuzz.runs = 500 | ||
function test_SimpleFuzzTest(uint256 x) public { | ||
// --- snip --- | ||
} | ||
} | ||
``` | ||
|
||
What we are asking here is to run our fuzzer `100` and `500` times for the `default` and `ci` profiles respectively. The interesting fact is that this would override any fuzz `runs` setup existing at a global level. All other configs would be inherited from the global context, making this acting as a fallback for all possible configurations. | ||
|
||
### Block comments | ||
In-line test configurations can also be expressed in block comments, as illustrated in the example. | ||
|
||
```solidity | ||
contract MyTest is Test { | ||
/** | ||
* forge-config: default.fuzz.runs = 1024 | ||
* forge-config: default.fuzz.max-test-rejects = 500 | ||
*/ | ||
function test_SimpleFuzzTest(uint256 x) public { | ||
// --- snip --- | ||
} | ||
} | ||
``` | ||
|
||
### In-line fuzz configs | ||
Users can specify the configs described in the table. Each statement must have a prefix of the form `forge-config: ${PROFILE}.fuzz.` | ||
|
||
| Parameter | Type | Description | | ||
|-|-|-| | ||
|`runs`|integer|The amount of fuzz runs to perform for this specific test case [📚 ref](./testing#runs).| | ||
|`max-test-rejects`|integer|The maximum number of combined inputs that may be rejected before the test as a whole aborts [📚 ref](./testing#max_test_rejects).| | ||
|
||
Fuzz config example | ||
```solidity | ||
contract MyFuzzTest is Test { | ||
/// forge-config: default.fuzz.runs = 100 | ||
/// forge-config: default.fuzz.max-test-rejects = 2 | ||
function test_InlineConfig(uint256 x) public { | ||
// --- snip --- | ||
} | ||
} | ||
``` | ||
|
||
### In-line invariant configs | ||
Users can specify the configs described in the table. Each statement must have a prefix of the form `forge-config: ${PROFILE}.invariant.` | ||
|
||
| Parameter | Type | Description | | ||
|-|-|-| | ||
|`runs`|integer|The amount of invariant runs to perform for this specific test case [📚 ref](./testing#runs-1). | ||
|`depth`|integer|The number of calls executed to attempt to break invariant in one run [📚 ref](./testing#depth). | ||
|`fail-on-revert`|boolean|Fails the invariant fuzzing if a revert occurs [📚 ref](./testing#fail_on_revert). | ||
|`call-override`|boolean|Overrides unsafe external calls when running invariant test [📚 ref](./testing#call_override). | ||
|
||
Invariant config example | ||
```solidity | ||
contract MyInvariantTest is Test { | ||
/// forge-config: default.invariant.runs = 100 | ||
/// forge-config: default.invariant.depth = 2 | ||
/// forge-config: default.invariant.fail-on-revert = false | ||
/// forge-config: default.invariant.call-override = true | ||
function invariant_InlineConfig() public { | ||
// --- snip --- | ||
} | ||
} | ||
``` | ||
|
||
|
||
|