블록체인

Solidity 실습: Foundry

sungjae0309 2026. 5. 22. 01:54

이번 실습의 순서는 다음과 같다. 

1. 실습 폴더 생성 

2.Foundry 프로젝트 생성

3.Foundry 폴더 기본 구조 

4.src/Counter.sol 이해 

5. 테스트 실행

6.test/Counter.t.sol 

setUp, test, fuzz test 개념 이해

7. gas

8.최종 결과 


1. 실습 폴더 생성

우선 바탕 화면에 앞으로 계속 작업할 실습 폴더를 생성한다 

cd ~/Desktop
mkdir solidity
cd solidity

2. Foundry 프로젝트 생성

forge init foundry
cd foundry

forge는 Foundry에서 가장 핵심이 되는 Solidity 개발용 CLI 도구이다. 

  • 이 명령어를 실행하면 Foundry 기본 프로젝트가 생성된다.
  • 쉽게 말해서 forge = Solidity 프로젝트를 만들고, 컴파일하고, 테스트까지 전부 가능한 명령어이다 

3. Foundry 폴더 기본 구조

foundry/
├── src/
│   └── Counter.sol
├── test/
│   └── Counter.t.sol
├── script/
│   └── Counter.s.sol
└── foundry.toml

4. src/Counter.sol  코드 

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
        number = newNumber;
    }

    function increment() public {
        number++;
    }
}

 

  • src/Counter.sol 파일을 열면 위와 같은 코드가 있고 여기서 중요한 건 아래와 같다. 

uint256 public number;
  • uint는 unsigned integer의 줄임말로 부호가 없는 정수를 의미한다. 즉, 음수가 없는 숫자
  • 뒤의 256은 256비트 크기의 정수라는 뜻 
  • 아무튼 여기서 number는 숫자를 저장하는 상태 변수이자 블록체인에 저장되는 값이다 

function setNumber(uint256 newNumber) public
  • 이건 외부에서 숫자를 직접 변경할 수 있는 함수이다. 

function increment() public
function doubleIncrement() public
  • 현재 숫자를 1 증가 시키는 함수와, 2씩 증가 시키는 함수가 있다. 

5. 테스트 실행

  • 터미널에 forge test를 입력하면, Foundry 프로젝트 안의 test/ 폴더에 있는 테스트 파일을 실행한다. 

6. test/Counter.t.sol 

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Test} from "forge-std/Test.sol";
import {Counter} from "../src/Counter.sol";

contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
        counter = new Counter();
        counter.setNumber(0);
    }

    function test_Increment() public {
        counter.increment();
        assertEq(counter.number(), 1);
    }

    function test_DoubleIncrement() public {
        counter.doubleIncrement();
        assertEq(counter.number(), 2);
    }
    
    function testFuzz_SetNumber(uint256 x) public {
        counter.setNumber(x);
        assertEq(counter.number(), x);
    }
}
  • test폴더 안에는 Counter.t.sol 파일이 있고 코드는 위와 같다. 
  • function test_Increment() 함수의 의미는 "increment()를 실행했을 때 number 값이 1이 되는가?" 이다 
  • testFuzz_SetNumber(uint256)은 Foundry의 fuzz test라는 것이다. 의미는 아무 숫자 x를 넣어도 setNumber(x)를 실행하면 number값이 x로 잘 저장되는지를 테스트한다. 즉, Foundry가 여러 숫자를 자동으로 넣어보며 테스트한다. 
  • 근데 함수가 4개인데 테스트는 3개만 실행될까? 이유는 setUp() 테스트 함수가 아니기 때문이다. . 

3개 함수 테스트 결과

  • 그럼 다음과 같이 각 함수들 테스트 결과가 터미널에 출력된다. 
  • 여기선 3개의 테스트 모두 성공한 상황이다. 

7. gas란? 

  • 테스트 결과 출력 문장을 자세히 보면 "gas: 28862, gas: 28827"이 있는데 gas가 뭘까? 
  • 이건 해당 함수를 실행할 때 사용된 가스 비용의 추정치이다. 
  • 블록체인에서는 함수를 실행할 때 연산 비용이 발생한다. 그 단위를 gas라고 하고 지금은 로컬 테스트라서 돈이 나간 건 아니고 "이 함수 실행에 이 정도 연산 비용이 든다" 정도로 보면 된다. 

8. 최종 결과

마지막 줄인 3 tests passed, 0 failed, 0 skipped이 보인다 

뜻은 3개의 테스트가 전부 성공했다는 뜻이다.