테스트 #
Matplotlib는 pytest 프레임워크를 사용합니다.
테스트는 에 lib/matplotlib/tests
있으며 pytest 테스트 인프라에 대한 사용자 정의는 에 matplotlib.testing
있습니다.
요구 사항 #
테스트를 실행하려면 개발을 위해 Matplotlib를 설정 해야 합니다 . 특히 테스트를 위한 추가 종속성 에 유의하십시오.
메모
개발 설정에서 테스트를 실행한다고 가정합니다.
정기적으로 설치된 Matplotlib 버전에 대해 테스트를 실행할 수 있지만 이는 훨씬 덜 일반적인 사용 사례입니다. 여전히 테스트를 위한 추가 종속성 이 필요합니다. 미리 빌드된 Matplotlib 패키지와 함께 배포되지 않기 때문에 리포지토리에서 추가로 참조 이미지를 가져와야 합니다.
테스트 실행 #
개발 리포지토리의 루트 디렉터리에서 다음을 실행합니다.
python -m pytest
pytest는 많은 명령줄 매개변수 를 통해 구성할 수 있습니다 . 특히 유용한 것들은 다음과 같습니다.
|
좀 더 장황하게 |
|
NUM 프로세스에 대해 병렬로 테스트 실행( pytest-xdist 필요 ) |
|
stdout 캡처 안 함 |
명령줄에서 단일 테스트를 실행하려면 파일 경로를 제공하고 선택적으로 두 개의 콜론으로 구분된 함수를 입력할 수 있습니다. 예를 들어 테스트는 설치할 필요가 없지만 Matplotlib는 설치해야 합니다.
pytest lib/matplotlib/tests/test_simplification.py::test_clipping
간단한 테스트 작성 #
Matplotlib의 많은 요소는 표준 테스트를 사용하여 테스트할 수 있습니다. 예를 들어 다음은 다음의 테스트입니다 matplotlib/tests/test_basic.py
.
def test_simple():
"""
very simple example test
"""
assert 1 + 1 == 2
Pytest는 이름이 로 시작하는 파일을 검색 "test_"
한 다음 해당 파일 내에서 로 시작하는 함수
"test"
또는 로 시작하는 클래스 를 검색하여 어떤 함수가 테스트인지 결정합니다 "Test"
.
일부 테스트에는 실행 후 정리해야 하는 내부 부작용이 있습니다(예: 생성된 그림 또는 수정 rcParams
됨). pytest 픽스처
matplotlib.testing.conftest.mpl_test_settings
는 자동으로 이를 정리합니다. 더 이상 아무것도 할 필요가 없습니다.
테스트의 무작위 데이터 #
무작위 데이터는 예제용 데이터를 생성하는 매우 편리한 방법이지만 무작위성은 테스트에 문제가 됩니다(테스트는 결정론적이어야 하므로!). 이 문제를 해결하려면 각 테스트에서 시드를 설정하십시오. numpy의 기본 난수 생성기의 경우 다음을 사용합니다.
import numpy as np
rng = np.random.default_rng(19680801)
rng
그런 다음 난수를 생성할 때 사용 합니다.
씨앗은 존 헌터의 생일입니다.
이미지 비교 테스트 작성 #
이미지 기반 테스트를 작성하는 것은 간단한 테스트보다 약간 더 어렵습니다. image_comparison
주요 고려 사항은 데코레이터 에서 "기준선" 또는 예상 이미지를 지정해야 한다는 것 입니다. 예를 들어 이 테스트는 단일 이미지를 생성하고 자동으로 테스트합니다.
from matplotlib.testing.decorators import image_comparison
import matplotlib.pyplot as plt
@image_comparison(baseline_images=['line_dashes'], remove_text=True,
extensions=['png'])
def test_line_dashes():
fig, ax = plt.subplots()
ax.plot(range(10), linestyle=(0, (3, 3)), lw=5)
이 테스트를 처음 실행하면 비교할 기본 이미지가 없으므로 테스트가 실패합니다. 출력 이미지(이 경우 )를 소스 디렉터리(이 경우 )에 있는 트리 result_images/test_lines/test_line_dashes.png
의 올바른 하위 디렉터리에 복사합니다
. 이 새 파일을 소스 코드 수정 제어( ) 아래에 두십시오 . 테스트를 다시 실행하면 이제 통과해야 합니다.baseline_images
lib/matplotlib/tests/baseline_images/test_lines
git add
기본 이미지는 Matplotlib 리포지토리에서 많은 공간을 차지합니다. 이미지 비교 테스트를 위한 또 다른 접근 방식은
check_figures_equal
데코레이터를 사용하는 것입니다. 이 데코레이터는 두 개의 매개변수를 사용하는 함수를 장식하는 데 사용되어야 하며 Figure
두 가지 다른 방법(테스트된 방법과 기준선 방법)을 사용하여 그림에 동일한 이미지를 그립니다. 데코레이터는 그림 설정을 준비한 다음 그려진 결과를 수집하고 비교합니다.
사용에 대한 추가 정보 는 image_comparison
및
문서를 참조하십시오 .check_figures_equal
matplotlib.tests에서 새 모듈 만들기 #
우리는 테스트 중인 기본 모듈별로 테스트를 분류하려고 합니다. mathtext.py
예를 들어 모듈 과 관련된 테스트 는 test_mathtext.py
.
CI용 GitHub 작업 사용 #
GitHub Actions 는 "클라우드에서" 호스팅되는 CI 시스템입니다.
GitHub Actions는 GitHub 리포지토리에 대한 새 커밋에 대한 알림을 수신하고 이러한 새 커밋을 볼 때 빌드 또는 테스트를 실행하도록 구성됩니다. .github/workflows
프로젝트를 테스트하는 방법을 확인하기 위해 YAML 파일을 찾습니다 .
기본 Matplotlib GitHub 리포지토리 에 대해 GitHub Actions가 이미 활성화되어 있습니다. 예를 들어 테스트 워크플로 를 참조하세요 .
YAML 워크플로 파일이 포함되면 개인용 Matplotlib 포크에 대해 GitHub Actions가 자동으로 활성화되어야 합니다. 기본 Matplotlib 리포지토리에 대해 제출된 풀 요청이 테스트되기 때문에 일반적으로 이러한 워크플로를 살펴볼 필요가 없습니다. 분기된 리포지토리에서는 테스트 워크플로를 건너뛰지만 GitHub 웹 인터페이스 에서 수동으로 실행을 트리거할 수 있습니다 .
https://github.com/your_GitHub_user_name/matplotlib/actions 에서 GitHub Actions 결과를 볼 수 있습니다 . 여기 에 예가 있습니다.
톡스 사용 #
Tox 는 여러 버전의 Python(예: 3.7, 3.8) 및 심지어 서로 다른 Python 구현(예: CPython, PyPy, Jython 등)을 포함한 여러 Python 환경에 대해 테스트를 실행하기 위한 도구입니다. 시스템의 $PATH에서 사용할 수 있습니다(예: apt-get, yum 또는 Homebrew와 같은 시스템 패키지 관리자를 사용하여 설치하는 것이 좋습니다).
tox를 사용하면 풀 요청을 제출하기 전에 작업 복사본이 회귀를 도입했는지 쉽게 확인할 수 있습니다. 사용 방법은 다음과 같습니다.
$ pip install tox
$ tox
환경의 하위 집합에서 tox를 실행할 수도 있습니다.
$ tox -e py38,py39
Tox는 모든 것을 직렬로 처리하므로 여러 환경을 테스트하는 데 오랜 시간이 걸릴 수 있습니다. 속도를 높이려면 .tox라는 새로운 병렬 버전의 tox를 사용해 볼 수 있습니다 detox
. 시도해 보세요.
$ pip install -U -i http://pypi.testrun.org detox
$ detox
Tox는 tox.ini
. py33
테스트에 새 환경을 추가하려는 경우(예: ) 또는 종속성 또는 테스트 실행 방식을 조정하려는 경우 이 파일을 편집해야 할 수 있습니다
. tox.ini
파일 에 대한 자세한 내용은 Tox 구성 사양 을 참조하십시오 .
이전 버전의 Matplotlib 빌드하기 #
특정 버그를 도입한 커밋을 확인하기 위해 a를 실행할 때 매우 오래된 버전의 Matplotlib를 빌드해야 할 수도 있습니다(거의). 다음 제약 조건을 고려해야 합니다.git bisect
Matplotlib 1.3(또는 이전 버전)에는 numpy 1.8(또는 이전 버전)이 필요합니다.
출시된 Matplotlib 버전 테스트 #
릴리스된 버전(예: PyPI 패키지 또는 conda 패키지)의 설치에서 테스트를 실행하려면 추가 설정이 필요합니다.
메모
최종 사용자의 경우 일반적으로 출시된 Matplotlib 버전에서 테스트를 실행할 필요가 없습니다. 공식 릴리스는 게시하기 전에 테스트됩니다.
추가 종속성 설치 #
테스트를 위한 추가 종속성을 설치합니다 .
참조 이미지 얻기 #
많은 테스트에서 플롯 결과를 참조 이미지와 비교합니다. 참조 이미지는 일반 패키지 버전(pip wheel 또는 conda 패키지)의 일부가 아닙니다. 참조 이미지로 테스트를 실행하려면 테스트하려는 Matplotlib 버전과 일치하는 참조 이미지를 가져와야 합니다.
이렇게 하려면
PyPImatplotlib-X.Y.Z.tar.gz
에서 일치하는 소스 배포를 다운로드
하거나 git 저장소와 . 테스트할 matplotlib 설치 폴더에 폴더 를
복사합니다 . 올바른 대상 폴더는 다음을 사용하여 찾을 수 있습니다.git checkout vX.Y.Z
lib/matplotlib/tests/baseline_images
matplotlib/tests
python -c "import matplotlib.tests; print(matplotlib.tests.__file__.rsplit('/', 1)[0])"
의 유사한 복사 lib/mpl_toolkits/tests/baseline_images
가 테스트에 필요합니다 mpl_toolkits
.
테스트 실행 #
설치된 Matplotlib 버전에서 모든 테스트를 실행하려면:
python -m pytest --pyargs matplotlib.tests
테스트 검색 범위는 단일 테스트 모듈 또는 단일 기능으로 좁힐 수 있습니다.
python -m pytest --pyargs matplotlib.tests.test_simplification.py::test_clipping