본문 바로가기
Blockchain

Truffle Testing 방법 (Mocha, chai 사용)

by 개발자 염상진 2022. 8. 20.

Truffle 에서 개발, 배포, 테스팅 까지 원큐에 끝낼 수 있습니다.

 

 

Truffle Test 

 

Truffle에서 테스트를 할 수 있는 방법은 2가지가 있습니다. solidity파일로도 가능하고, test.js 파일로도 가능합니다. 두가지 모두 진행해본 결과 개인적으로 js 파일로 테스팅을 진행하는게 안정적이고 빠른 코드 작성이 가능했습니다. 컨트랙트에서 계정을 따로 설정해주는 부분에서 Mocha 테스트 프레임워크 기반의 test.js 이 편했습니다.

 

 

 

1. 컨트랙트 코드 작성

간단한 컨트랙트 코드를 작성합니다. 이름은 Noonoo고 val 변수의 값을 설정하고 읽어오는 컨트랙트입니다.

pragma solidity ^0.8.7;

contract SampleContract {
    uint public val;
    string public name;

    constructor(){
        name = "Noonoo";
    }

    function set(uint x) public {
        val = x;
    }

    function get() public returns(uint){
        uint _val = val;
        return _val;
        
    }
}

 

2. 배포 진행

가볍게 배포를 진행합니다. migrations 폴더 내에 deploy.js 파일을 작성합니다.

const SampleContract = artifacts.require("SampleContract");

module.exports = function(deployer){
    deployer.deploy(SampleContract);
}

 

3. 테스트 파일 작성

chai 모듈을 설치합니다.

$ npm i chai

chai 라이브러리에서 assert를 가져옵니다. 

const assert = require('chai').assert;

 

4. 배포한 컨트랙트 연결하기

artifacts에는 배포된 컨트랙트의 정보가 담겨있습니다. 컨트랙트의 이름을 통해 가져올 수 있습니다.

const SampleContract = artifacts.require("SampleContract");

 

web3 객체에 provider를 공급해줍니다. Truffle Develop의 기본 네트워크 포트는 9545입니다.

const web = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:9545/'));

 

Truffle 테스트에서는 describe 함수 대신 contract 함수를 사용합니다.

이 때, 첫번째 인자에는 컨트랙트 이름을, 두번째 인자로는 accounts를 인자로 받는 함수를 받습니다.

contract 내부에서는 beforeEach() 함수는 동일하게 사용합니다. 유닛 테스트 시나리오를 담은 it 함수가 실행될 때 마다 beforeEach 함수가 작동합니다. 

아래 코드는 컨트랙트 객체를 정상적으로 받아와서 계정 정보를 정상적으로 받아오는지 테스트하는 코드입니다.

contract("SampleContract", async (accounts) => {
    let sc;
    
    beforeEach(async ()=>{
        sc = await SampleContract.deployed();
    })
    
    it('account test', ()=>{
        assert.ok(accounts.length > 0, 'ok');
    })
    
})

 

 

Truffle console 이 켜져 있는 상태라면 test 명령어를 입력하고 터미널 환경에서는 truffle test 명령어를 입력합니다.

truffle(develop)> test
Using network 'develop'.


Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.


  Contract: SampleContract
    ✔ account test


  1 passing (173ms)

 

 

 

[에러 해결] Invalid options object. Dev Server has been initialized using an options object that does not match the API sche

Node.js에 axios 요청을 보내는 통로를 proxy로 설정했습니다. React package.json에 "proxy" : "http://localhost:8080/" 형식으로 proxy를 지정해주고, 서버와 통신을 합니다. Git에 코드를 올려두고, 동료분이..

about-tech.tistory.com

 

 

Mocha Chai framework for testing install

Mocha는 Javascript에서 유닛 테스트를 위한 테스트 프레임워크 입니다. 프로덕션 개발을 진행하는 경우 유닛 테스트 => 통합테스트 -> 시스템 테스트 -> 인수 테스트 순서로 테스팅을 진행하게 되는

about-tech.tistory.com

 

 

[Blockchain] getTransactionsByAccount() 함수 구현하기

이더스캔을 보면 지갑 Account(EOA)나 컨트랙트 Account(CA)를 통해 해당 계정에서 발생한 트랜잭션을 모니터링 할 수 있습니다. 이더스캔의 경우 독립적인 데이터베이스를 두고, 트랜잭션이 발생할

about-tech.tistory.com

 

댓글