블록체인/이더리움
[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);
});
});