How to Setup Foundry and Write a Basic Unit Test
Learn how to set up Foundry and use the Forge command-line tool to run your smart contract tests written in Solidity.
What you will accomplish
Prerequisites
Before you begin, you should be familiar with the following:
Get started
Set up project
To follow along, start with the main
branch, which is the default branch of this repository. This gives you the initial state from which you can follow along with the steps as described in the tutorial.
Add a submodule
Forge manages dependencies by using git submodules. Run the steps below to add and install the git submodules necessary to use Forge.
Next, add the Forge Standard Library to your project:
This command will add the forge standard library to our project by creating a folder named lib
. The forge standard library is the preferred testing library when working with Foundry.
Install Foundryup
Foundryup represents Foundry's tool management approach. Executing this command will install forge
and other essential Foundry CLI tools.
You should see output similar to the following:
You may need to add foundry to PATH and open a new terminal to make the foundryup
command available. Then run foundryup
to install Foundry.
Install the submodule dependencies
Remap dependencies
In order to make the import of the forge standard library easier to write, we will remap the dependency.
Open the project setup-foundry-and-write-basic-unit-test
, in a code editor.
Create a new text file under the root directory named remappings.txt
Paste in the following line of code
When we want to import from forge-std
we will write: import "forge-std/Contract.sol"
Setup the test
A test file named TodoList.t.sol
has been provided to you under the test
folder.
On line 7, we see our TodoListTest
contract inherits Forge Standard Library's Test contract, which provides us access to the necessary functionality to test our smart contracts.
Step 1: Create your test instance
Create an instance of the contract TodoList.sol
in TodoList.t.sol
order to be able to test it.
Look for a comment in the code to locate the specific lines of code that you will need to edit. For example, in this step, look for this: // Step (1) in the accompanying tutorial. You will need to delete the inline comment that looks like this: /* ... */. Replace it with the correct code.
Write a test
Step 2: Deploy a new contract every time you run a test
The setup()
function is invoked before each test case is run and is optional. Have the TodoList.t.sol
test contract deploy a new TodoList contract by adding the following code in the setUp()
function.
Step 3: Confirm that the number of todos increases by one after calling createTodo()
createTodo()
Assert that the numberOfTodosAfter
executing createTodo()
is equal to the numberOftodosBefore
+ 1.
Build and run your test
Foundry expects the test
keyword as a prefix to distinguish a test. Therefore, all tests you want to run must be prefixed with the test
keyword.
Foundry expects the test
keyword as a prefix to distinguiash a test. Therefore, all tests that you want to run must be prefixed with the test
keyword.
In the terminal, ensure you are in the root project directory and build the project.
You should see output similar to the following:
After a successful build, run your test.
You should see output similar to the following:
By default forge test
only displays a minimal summary of a test, whether it failed or passed. You can display more detailed information by using the -v
flag and increasing the verbosity.
In the terminal, re-run your test but include a verbosity level 4. This will display stack traces for all tests, including the setup.
Forge Gas Reports
Forge has functionality built in to give you gas reports of your contracts. You can specify which contract should generate a gas report in the foundry.toml
file.
The foundry.toml
file is a configuration file that is used to configure forge.
Create a new file in the root directory named foundry.toml
. Paste the following contents.
Step 4: Configure foundry to produce a gas report for TodoList.sol
TodoList.sol
Replace the comment #/* ... */
with the line below:
In the terminal, generate a gas report.
You should see output similar to the following:
Your output will show you an estimated gas average, median, and max for each contract function used in a test and total deployment cost and size.
Complete
Congratulations, you have completed how to setup Foundry and write a basic unit test.
You have learned how to:
Last updated