본문 바로가기
IT/이더리움 Ethereum

이더리움 solidity 스마트 계약 truffle 이용해서 테스트 하기 . console test

by SidePower 2022. 9. 25.

solidity로 이더리움 스마트 계약을 만들었다면

생각대로 처리가 잘 되는지 검증을 위해 테스트를 해야 겠죠.

 

상태변수에는 값이 제대로 들어가는지 

함수 결과가 맞는지

지갑 주소는 무엇인지

parameter 인자값을 임의로 변경해서 테스트하기 등... 

truffle에 내장된 test 기능을 이용해서 쉽게 테스트 해볼수 있습니다.

 

 

 truffle console 접속

truffle console --network [네트워크 이름]

사설 테스트넷에 접속해서 이더리움 블록체인에서 테스트를 진행합니다.

C:\pjdapp>truffle console --network localnw
truffle(localnw)>
 truffle(네트워크 이름)이 나오면 정상 접속된거에요.


 truffle-config.js 파일에 설정한 네트워크 이름 참조합니다.
  networks: {

     localnw: {
      host: "127.0.0.1",     // Localhost (default: none)
      port: 7545,            // Standard Ethereum port (default: none)
      network_id: "1337",       // Any network (default: none)
     }

  }

 

 solidity로 작성된 문자열 입/출력하는 간단한 스마트 계약

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

contract Hello {
    //상태변수 선언
    string public greet;

    //생성자
    constructor(string memory _greet) {
        greet = _greet;
    }

    //문자열 입력 받아 상태변수에 저장
    function setGreet(string memory _greet) public {
        greet = _greet;
    }

    //상태변수에 저장된 문자열 출력하기
    function getGreet() public view returns(string memory){
        return greet;
    }
}

 

 truffle test 준비

프로젝트 폴더안에 test 폴더가 존재합니다.

test 폴더안에 테스트 수행 js 파일을 넣어두세요.

C:\pjdapp>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: A8FA-0147

 C:\pjdapp 디렉터리

2021-12-21  오후 04:12    <DIR>          .
2021-12-21  오후 04:12    <DIR>          ..
2021-12-21  오후 03:44    <DIR>          build
2021-12-21  오후 10:57    <DIR>          contracts
2021-12-21  오후 11:14    <DIR>          migrations
2021-12-21  오후 03:43    <DIR>          test
2021-12-22  오후 09:15             3,173 truffle-config.js
               2개 파일               6,223 바이트
               6개 디렉터리  72,778,452,992 바이트 남음

C:\pjdapp>cd test

C:\pjdapp\test>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: A8FA-0147

 C:\pjdapp\test 디렉터리

2021-12-23  오후 04:32    <DIR>          .
2021-12-23  오후 04:32    <DIR>          ..
2021-12-20  오후 10:57                 0 .gitkeep
2021-12-23  오후 05:29               641 hello_test.js
               3개 파일               1,139 바이트
               2개 디렉터리  72,741,801,984 바이트 남음

 

 hello_test.js

Hello라는 contract에 대한 테스트 수행 JS를 만듭니다.

파일명(hello_test.js)은 규칙이 없으니 편한대로 정하세요.


//Hello라는 contract를 반환
const Hello = artifacts.require("Hello");

//beforeEach와 afterEach함수는 test 전과 후에 호출되며
//async와 await 키워드로 node.js의 비동기 처리
//user0,user1...user9 10개까지 가능하며 접속한 블록체인 계정(지갑)주소입니다.
contract('Hello', function([user0,user1,user2]){
    let hello;

    //테스트 실행 단위 it 실행 전 
    beforeEach(async () =>{
        console.log('');
        console.log('Before each');
        hello = await Hello.new('Big Start Hello');
    })

    //테스트 실행 단위 it 실행 후 
    afterEach(async () =>{
        console.log('After each');
        console.log('Good bye');
    })

    //첫번째 it - 기본 테스트
    it('Basic test',async () =>{
        console.log('Basic test');
        let igreet = await hello.greet();        //상태 변수 greet 값 확인
        let ivalue1 = await hello.getGreet();  //getGreet 함수 결과 확인

        //console.log안에 `는 작은따옴표가 아니고 숫자 1 왼쪽의 그레이브입니다.
        console.log(`user0 addr : ${user0}`);  //첫번째 지갑 주소 
        console.log(`vari greet : ${igreet}`);
        console.log(`fun getGreet1 : ${ivalue1}`);
    })

    //두번째 it - 문자열 입력 후 greet 변수 값 변경 확인
    it('greet value change test', async () =>{
        console.log('Change test');
        let value1 = 'greet change';
        let value2;
        await hello.setGreet(value1);          //setGreet 함수에 value1값 지정해서 수행
        value2 = await hello.greet();
        console.log(`change value2 : ${value2}`);
    })

});

 

 테스트 수행

truffle test [js파일]

js파일 지정하지 않고 truffle test를 수행하면 test 폴더안의 모든 js파일을 실행합니다.

지금은 하나만 있어 js파일 입력 안해도 상관없지만 

많을 경우에는 시간이 좀 걸리니 꼭 지정해서 테스트 수행해주세요.

그리고 js파일이 truffle console 접속할때의 폴더와 다른 폴더에 있을때는

경로도 같이 지정해야 됩니다.

truffle test C:/pjdapp/test/hello_test.js 또는 truffle test test/hello_test.js


truffle(localnw)> truffle test hello_test.js
Using network 'localnw'.


Compiling your contracts...
===========================
> Compiling .\contracts\Hello.sol
> Compiling .\contracts\Migrations.sol
> Artifacts written to C:\Users\bedro\AppData\Local\Temp\test--5384-LG4DJwxC1Kri
> Compiled successfully using:
   - solc: 0.8.10+commit.fc410830.Emscripten.clang


  Contract: Hello

Before each
Basic test
user0 addr : 0x455f67C03e7f834e30cF0Ad17c984C47034C0A38
vari greet : Big Start Hello
fun getGreet1 : Big Start Hello
    √ Basic test (523ms)
After each
Good bye

Before each
Change test
change value2 : greet change
    √ greet value change test (4055ms)
After each
Good bye


  2 passing (8s)
truffle(localnw)>

여기까지 truffle 스마트 계약 테스트까지 끝나고

이더리움 DApp 개발에 필요한 사전 지식은 어느정도 마무리 된거 같아요.

 

이렇게 준비하면서 solidity와 js에 대한 지식이 부족한거 같아

개발 언어를 더 공부해야 겠다는 생각이 들었습니다.^^;;

 

 

감사합니다.

반응형

댓글