Move 튜토리얼 (3) — 모듈에 단위 테스트 추가하기

공식 튜토리얼 Step 2: Adding unit tests to my first Move module

Eugene
4 min readSep 27, 2022

이전 글: Move 튜토리얼 (2) — 모듈 작성하기 (링크)

안녕하세요, CC Lab 입니다. 이번에는 저번에 만들었던 첫 번째 Move 모듈에 단위 테스트를 추가해보겠습니다. 해당 글은 Move 공식 깃허브를 참고하여 작성되었습니다.

이제 디렉토리를 step_2/BasicCoin으로 변경하여 발행이 예상대로 작동하는지 확인하는 테스트를 살펴보겠습니다. Move의 단위 테스트는 Rust의 단위 테스트와 유사합니다. 테스트는 #[test]로 주석 처리되고 일반적인 Move 함수처럼 작성됩니다.

패키지 test 명령으로 테스트를 실행할 수 있습니다.

move test

이제 FirstModule.move 파일의 내용을 살펴보겠습니다. 새롭게 생긴 것 중에 가장 먼저 보게 될 것은 이 테스트입니다.

module 0xCAFE::BasicCoin {
...
// Declare a unit test. It takes a signer called `account` with an
// address value of `0xC0FFEE`.
#[test(account = @0xC0FFEE)]
fun test_mint_10(account: signer) acquires Coin {
let addr = 0x1::signer::address_of(&account);
mint(account, 10);
// Make sure there is a `Coin` resource under `addr` with a value of `10`.
// We can access this resource and its value since we are in the
// same module that defined the `Coin` resource.
assert!(borrow_global<Coin>(addr).value == 10, 0);
}
}

이것은 test_mint_10이라는 단위 테스트를 선언하여 값이 10인 계정 아래에 Coin 구조체를 발행합니다. 그런 다음 저장소에 발행된 발행된 코인이 assert!호출에서 기대하는 값을 갖는지 확인합니다 어설션이 실패하면 단위 테스트가 실패합니다.

상위 개념 및 연습

볼만한 가치가 있는 테스트 관련 주석이 많이 있으며 여기에서 찾을 수 있습니다. 이들 중 일부는 튜토리얼 5단계 에서 사용된 것을 볼 수 있습니다.

단위 테스트를 실행하기 전에 항상 Move 표준 라이브러리에 대한 종속성을 추가해야 합니다. 이것은 Move.toml의 [dependencies] 섹션에 항목을 추가하여 수행할 수 있습니다. 예:

[dependencies]
MoveStdlib = { local = "../../../../move-stdlib/", addr_subst = { "std" = "0x1" } }

<path_to_move>/language 아래의 move-stdlib 디렉토리를 가리키도록 경로를 변경해야 할 수도 있습니다. 깃 종속성을 지정할 수도 있습니다. 여기에서 패키지 종속성 이동에 대해 자세히 알아볼 수 있습니다.

연습하기

테스트가 실패하도록 어설션을 11로 변경합니다. 테스트가 실패할 때 전역 상태를 표시하는 move test 명령에 전달할 수 있는 플래그를 찾으세요. 다음과 같이 표시되어야 합니다.

┌── test_mint_10 ──────
│ error[E11001]: test failure
│ ┌─ ./sources/FirstModule.move:24:9
│ │
│ 18 │ fun test_mint_10(account: signer) acquires Coin {
│ │ ------------ In this function in 0xcafe::BasicCoin
│ ·
│ 24 │ assert!(borrow_global<Coin>(addr).value == 11, 0);
│ │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Test was not expected to abort but it aborted with 0 here


│ ────── Storage state at point of failure ──────
│ 0xc0ffee:
│ => key 0xcafe::BasicCoin::Coin {
│ value: 10
│ }

└──────────────────

테스트 커버리지 정보를 수집할 수 있는 플래그를 찾은 다음 커버리지 통계 및 소스 커버리지를 보기 위해 move coverage명령을 통해 탐색해보세요.

--

--