이번 실습의 순서는 다음과 같다.
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개의 테스트 모두 성공한 상황이다.
7. gas란?
- 테스트 결과 출력 문장을 자세히 보면 "gas: 28862, gas: 28827"이 있는데 gas가 뭘까?
- 이건 해당 함수를 실행할 때 사용된 가스 비용의 추정치이다.
- 블록체인에서는 함수를 실행할 때 연산 비용이 발생한다. 그 단위를 gas라고 하고 지금은 로컬 테스트라서 돈이 나간 건 아니고 "이 함수 실행에 이 정도 연산 비용이 든다" 정도로 보면 된다.
8. 최종 결과
마지막 줄인 3 tests passed, 0 failed, 0 skipped이 보인다
뜻은 3개의 테스트가 전부 성공했다는 뜻이다.
'블록체인' 카테고리의 다른 글
| Gas fee란 (0) | 2026.05.25 |
|---|---|
| Solidity 실습: Mapping으로 사용자별 데이터 저장 (0) | 2026.05.24 |
| Solidity 실습 준비: MacOS에서 Foundry 개발 환경 설치 (0) | 2026.05.20 |
| Solidity 알아보기 ( 공식 문서 참고 ) (0) | 2026.05.19 |
| 스마트 컨트랙트란 (1) | 2026.05.18 |