브라우니는 단위 테스트를 위해 pytest 프레임워크를 사용합니다. Pytest는 성숙하고 기능이 풍부한 테스트 프레임워크입니다. 최소한의 코드로 작은 테스트를 작성할 수 있으며 대규모 프로젝트에 확장성이 뛰어납니다.

테스트를 실행하려면:

$ brownie test

이 문서에서는 기본 pytest 사용 방법을 간단하게 설명하며, 특히 Brownie와 관련된 기능에 중점을 둡니다. pytest의 많은 구성 요소는 부분적으로 또는 전혀 설명되지 않았습니다. pytest에 대해 더 자세히 알고 싶다면 공식 pytest 문서를 참조해야합니다 (https://docs.pytest.org/en/latest/).

시작하기

테스트 파일 구조

Pytest는 프로젝트의 테스트 스위트에 포함해야하는 함수를 찾기 위해 test discovery 프로세스를 수행합니다.

  1. 테스트는 프로젝트의 tests/ 디렉토리 또는 하위 디렉토리에 저장되어야합니다.
  2. 파일 이름은 test_*.py 또는 *_test.py와 일치해야합니다.

테스트 파일 내에서 다음 메서드가 테스트로 실행됩니다.

  1. test로 시작하는 클래스 외 함수
  2. test로 시작하는 클래스 메서드 (클래스는 Test로 시작하고 init 메서드를 포함하지 않음)

첫 번째 테스트 작성하기

다음은 Brownie 및 pytest를 사용하여 계정 잔액이 거래를 수행한 후 올바르게 변경되었는지 확인하는 매우 간단한 테스트 예입니다.

from **brownie** import accounts

def test_account_balance():
    balance = accounts[0].balance()
    accounts[0].transfer(accounts[1], "10 ether", gas_price=0)

    assert balance - "10 ether" == accounts[0].balance()

픽스처

픽스처는 하나 이상의 테스트 함수에 적용되는 함수로, 각 테스트 실행 전에 호출됩니다. 픽스처는 테스트에 필요한 초기 조건을 설정하는 데 사용됩니다.

픽스처는 @pytest.fixture 데코레이터를 사용하여 선언됩니다. 테스트에 픽스처를 전달하려면, 테스트의 입력 인수로 픽스처 이름을 포함하면 됩니다:

import **pytest**
from **brownie** import Token, accounts

**@pytest**.fixture
def token():
    return accounts[0].deploy(Token, "Test Token", "TST", 18, 1000)

def test_transfer(token):
    token.transfer(accounts[1], 100, {'from': accounts[0]})
    assert token.balanceOf(accounts[0]) == 900

이 예제에서는 token 픽스처가 test_transfer를 실행하기 전에 호출됩니다. 픽스처는 배포된 Contract 인스턴스를 반환하며 이것은 테스트에서 사용됩니다.