Solidity unit testing using remix-tests -part 1
As a Remix IDE plugin
If you are a Solidity developer and looking to write unit tests for your smart contract, you don’t need to learn any other language. You can test your contract in Solidity itself using the tool: remix-tests
Remix-tests is a tool to test Solidity smart contracts which is developed and maintained by Remix Team. remix-tests works underneath Remix IDE plugin “Solidity Unit Testing” and can be also used as a CLI tool. In this article we will go over its use as a Remix IDE plugin.
Solidity Unit Testing: A Remix IDE Plugin
Usually when developing in Solidity you’d click the Solidity button in the Environments section of the Remix homepage.
This will load a standard set of plugins for Solidity development.
You can also load the plugins as you need them from plugin manager.
Now double check
icon will appear on the left side icon bar. Clicking it will land you into the Solidity unit testing plugin.
This shows some initial information and two buttons: Generate test file
and Run Tests
For now, these buttons are disabled. To activate them, you need to select a file from File explorers
.
Generate & analyse test file
Generate test file
button is used to generate a sample test file to start with. Click on it and you will get a new file in file manager .
Let’s observe this file:
- Its name is suffixed with
_test.sol
, which is mandatory for a test file to get executed. - It imports
remix_tests.sol
. This import is injected by Remix which is responsible for providingAssert
library features. Explicit import of this file is optional as it will be injected internally if not found while processing. - We see two contracts with multiple sets of functions. We can define our tests in multiple contracts to use the available feature. Like in this file, we can have a separate
beforeAll
method for a set of functions.beforeAll
is one of the available special functions of theremix-tests
. All special functions are as:
beforeEach()— Runs before each test
beforeAll() — Runs before all tests
afterEach() — Runs after each test
afterAll() — Runs after all tests
With remix-tests
, we get a built-in Assert
library and we can use it test output of defined functions. Inside the methods beforeAll
and check1
, we use some of the available methods of Assert library. You can see well explained documentation of all the functions on Remix IDE official docs.
You can also use a normal bool
return of Solidity for testing like check2
.
Write tests
Create a new sample file simple_storage.sol
with this code:
pragma solidity >=0.4.22 <0.7.0;
contract SimpleStorage {
uint public storedData;
constructor() public {
storedData = 100;
}
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint retVal) {
return storedData;
}
}
Now we will write unit tests for it. Create a test file simple_storage_test.sol
(suffixed with ‘_test.sol’)
Add pragma, inject remix_tests.sol
, import the contract you want to test and declare your test contract. With these updates, the file will look like this:
pragma solidity >=0.4.22 <0.7.0;
import "remix_tests.sol";
import "./simple_storage.sol";
contract MyTest {
}
Time to create an instance of your contract to be tested so that you can access its methods. Lets use beforeEach
for this. This way, before each test you will be getting a fresh instance of contract.
pragma solidity >=0.4.22 <0.7.0;
import "remix_tests.sol";
import "./simple_storage.sol";
contract MyTest {
SimpleStorage foo;
function beforeEach() public {
foo = new SimpleStorage();
}
}
Now we will write a test to check initial value of storedData
set by the contract constructor. We can use theequal
method of Assert
library. Let’s write it inside function named initialValueShouldBe100
pragma solidity >=0.4.22 <0.7.0;
import "remix_tests.sol";
import "./simple_storage.sol";
contract MyTest {
SimpleStorage foo;
function beforeEach() public {
foo = new SimpleStorage();
}
function initialValueShouldBe100() public returns (bool) {
return Assert.equal(foo.get(), 100, "initial value is not correct");
}
}
You have successfully written your first test in Solidity. Now you can click on ‘Run Tests’ to run your test. It will show:
Now lets use `set` method to update the value and test if value if updated.
pragma solidity >=0.4.22 <0.7.0;
import "remix_tests.sol";
import "./simple_storage.sol";
contract MyTest {
SimpleStorage foo;
function beforeEach() public {
foo = new SimpleStorage();
}
function initialValueShouldBe100() public returns (bool) {
return Assert.equal(foo.get(), 100, "initial value is not correct");
}
function valueIsSet200() public returns (bool) {
foo.set(200);
return Assert.equal(foo.get(), 200, "value is not 200");
}
}
Running tests will show:
Thus more tests can be added as per the contract implementation. Tests will run in the sequence they are defined in the file.
Write tests for your smart contract using this plugin and express your views/queries on Remix gitter channel.
Compilation & deployment parameter customisation and using remix-tests
as a CLI is explained in part 2 of this blog.
Stay Tuned!