블록체인/이더리움

[Hardhat] 컴파일 및 테스트하기

dev_dean 2022. 5. 7. 11:33

하드햇으로 컴파일과 테스트를 진행해보겠습니다.

 

컨트랙트는 기본 샘플 파일로 진행하겠습니다.

 

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "hardhat/console.sol";

contract Greeter {
    string private greeting;

    constructor(string memory _greeting) {
        console.log("Deploying a Greeter with greeting:", _greeting);
        greeting = _greeting;
    }

    function greet() public view returns (string memory) {
        return greeting;
    }

    function setGreeting(string memory _greeting) public {
        console.log("Changing greeting from '%s' to '%s'", greeting, _greeting);
        greeting = _greeting;
    }
}
npx hardhat compile

컴파일 성공

 

컴파일이 성공했다고 뜬다면 디렉토리에 artifacts 디렉토리가 생성된 것을 확인할 수 있습니다.

 

 

hardhat.config.js 파일을 보면 기본 셋팅으로 ether.js 와 waffle로 테스트를 진행하도록 세팅되어있습니다.

require("@nomiclabs/hardhat-waffle");

// This is a sample Hardhat task. To learn how to create your own go to
// https://hardhat.org/guides/create-task.html
task("accounts", "Prints the list of accounts", async (taskArgs, hre) => {
  const accounts = await hre.ethers.getSigners();

  for (const account of accounts) {
    console.log(account.address);
  }
});

// You need to export an object to set up your config
// Go to https://hardhat.org/config/ to learn more

/**
 * @type import('hardhat/config').HardhatUserConfig
 */
module.exports = {
  solidity: "0.8.4",
};

 

 

test/sample-test.js를 보면 Greeter를 테스트하는 샘플 코드가 있습니다.

const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("Greeter", function () {
  it("Should return the new greeting once it's changed", async function () {
    const Greeter = await ethers.getContractFactory("Greeter"); //컨트랙트 가져오기
    const greeter = await Greeter.deploy("Hello, world!");  
    await greeter.deployed(); //테스트 환경에서 배포 

    expect(await greeter.greet()).to.equal("Hello, world!"); // greet 함수 실행 반환 값이 "Hello World"와 같은지 확인 아니라면 테스트 실패

    const setGreetingTx = await greeter.setGreeting("Hola, mundo!");

    // wait until the transaction is mined
    await setGreetingTx.wait();

    expect(await greeter.greet()).to.equal("Hola, mundo!");
  });
});

 

터미널에서 다음과 같이 입력해줍니다.

npx hardhat test

실행 결과

출력 결과를 보시면 샘플 테스트 코드에서 describe에 적힌 "Greeter"와 It의 "Should return the new... "이 첫 번째와 맨 마지막 라인에서 출력되고 Greeter.sol 에서 작성되었던 console.log 함수들이 중간에 출력되었습니다.

 

테스트는 기본적으로 컨트랙트 배포자(Owner)의 계정으로 테스트되는데 다른 계정을 사용할 수도 있습니다.

const [owner, addr1] = await ethers.getSigners();
await greeter.connect(addr1).setGreeting("Hallo, Erde!");

addr1이라는 가상의 다른 계정을 getSigners로 가져오고 원래 greeter.setGreeting 했던 것을 중간에 addr1으로 connect 해주면 됩니다.

 

만약 여러 개의 테스트함수를 실행하고 싶다면 다음과 같은 사용이 가능합니다.

const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("Greeter", function () {
  let greeter;
  before(async () => {
    const Greeter = await ethers.getContractFactory("Greeter");
    greeter = await Greeter.deploy("Hello, world!");
    await greeter.deployed();
  });
  
  it("Should return the new greeting once it's changed", async function () {
    expect(await greeter.greet()).to.equal("Hello, world!");
    const setGreetingTx = await greeter.setGreeting("Hola, mundo!");

    // wait until the transaction is mined
    await setGreetingTx.wait();

    expect(await greeter.greet()).to.equal("Hola, mundo!");
  });

  it("Shoud return some of two numbers its given", async function () {
    let a = 4;
    let b = 6;
    expect(await greeter.addTwoNumbers(a, b)).to.equal(10);
    
  });
});