Writing unit tests

This page demonstrates how to write unit tests for your Starknet contracts. The cairo-lang package provides a set of Python classes that simulates the behavior of the Starknet system. We’ll use pytest as the unit test infrastructure.

Start by installing pytest:

pip install pytest pytest-asyncio

Let’s write a unit test for the contract from Your first contract. Create a file named contract.cairo and copy the contract code into it.

Now, copy the following code into a Python file named contract_test.py:

import os
import pytest

from starkware.starknet.testing.starknet import Starknet

# The path to the contract source code.
CONTRACT_FILE = os.path.join(
    os.path.dirname(__file__), "contract.cairo")

# The testing library uses Python's asyncio. So the following
# decorator and the ``async`` keyword are needed.
@pytest.mark.asyncio
async def test_increase_balance():
    # Create a new Starknet class that simulates the Starknet
    # system.
    starknet = await Starknet.empty()

    # Deploy the contract.
    contract = await starknet.deploy(
        source=CONTRACT_FILE,
    )

    # Invoke increase_balance() twice.
    await contract.increase_balance(amount=10).execute()
    await contract.increase_balance(amount=20).execute()

    # Check the result of get_balance().
    execution_info = await contract.get_balance().call()
    assert execution_info.result == (30,)

This test creates an instance of the Starknet testing class. This class allows deploying Starknet contracts and interacting with them. The test deploys our contract and invokes increase_balance twice. At the end it verifies that calling the get_balance() method returns the expected result.

Run the test using pytest:

pytest contract_test.py