복붙노트

[PYTHON] matplotlib를 사용하는 코드에 대해 단위 테스트를 작성하려면 어떻게해야합니까?

PYTHON

matplotlib를 사용하는 코드에 대해 단위 테스트를 작성하려면 어떻게해야합니까?

나는 많은 다른 matplotlib 그림을 생성하는 python (2.7) 프로그램에서 작업하고 있습니다 (데이터는 무작위가 아닙니다). 생성 된 수치가 정확한지 확인하기 위해 unittest를 사용하여 테스트를 구현하고 싶습니다. 예를 들어, 예상 된 수치 (데이터 또는 이미지)를 어떤 위치에 저장하고, 함수를 실행하고 결과를 참조와 비교합니다. 이것을 할 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.내 경험상, 이미지 비교 테스트는 결국 가치가있는 것보다 더 많은 문제를 야기합니다. 약간 다른 글꼴이나 사용 가능한 도면 백엔드가있는 여러 시스템 (예 : TravisCI)에서 연속 통합을 실행하려는 경우 특히 그렇습니다. 함수가 완벽하게 올바르게 작동하는 경우에도 테스트를 통과하는 것은 많은 작업 일 수 있습니다. 또한이 방법을 테스트하면 git 저장소에 이미지가 보관되어야하므로 코드를 자주 변경하는 경우 저장소가 팽창 할 수 있습니다.

    내 경험상, 이미지 비교 테스트는 결국 가치가있는 것보다 더 많은 문제를 야기합니다. 약간 다른 글꼴이나 사용 가능한 도면 백엔드가있는 여러 시스템 (예 : TravisCI)에서 연속 통합을 실행하려는 경우 특히 그렇습니다. 함수가 완벽하게 올바르게 작동하는 경우에도 테스트를 통과하는 것은 많은 작업 일 수 있습니다. 또한이 방법을 테스트하면 git 저장소에 이미지가 보관되어야하므로 코드를 자주 변경하는 경우 저장소가 팽창 할 수 있습니다.

    내 의견으로는 (1) matplotlib이 실제로 그림을 올바르게 그릴 것이라고 가정하고, (2) 플롯 팅 함수가 반환 한 데이터에 대해 수치 테스트를 수행하는 것입니다. (보이는 곳을 아는 경우 항상 Axes 객체 내부에서이 데이터를 찾을 수도 있습니다.)

    예를 들어 다음과 같은 간단한 함수를 테스트하려고한다고 가정 해보십시오.

    import numpy as np
    import matplotlib.pyplot as plt
    def plot_square(x, y):
        y_squared = np.square(y)
        return plt.plot(x, y_squared)
    

    단위 테스트는 다음과 같이 보일 수 있습니다.

    def test_plot_square1():
        x, y = [0, 1, 2], [0, 1, 2]
        line, = plot_square(x, y)
        x_plot, y_plot = line.get_xydata().T
        np.testing.assert_array_equal(y_plot, np.square(y))
    

    또는 이와 동등하게,

    def test_plot_square2():
        f, ax = plt.subplots()
        x, y = [0, 1, 2], [0, 1, 2]
        plot_square(x, y)
        x_plot, y_plot = ax.lines[0].get_xydata().T
        np.testing.assert_array_equal(y_plot, np.square(y))
    
  2. ==============================

    2.Matplotlib에는 테스트 인프라가 있습니다. 예 :

    Matplotlib에는 테스트 인프라가 있습니다. 예 :

    import numpy as np
    import matplotlib
    from matplotlib.testing.decorators import image_comparison
    import matplotlib.pyplot as plt
    
    @image_comparison(baseline_images=['spines_axes_positions'])
    def test_spines_axes_positions():
        # SF bug 2852168
        fig = plt.figure()
        x = np.linspace(0,2*np.pi,100)
        y = 2*np.sin(x)
        ax = fig.add_subplot(1,1,1)
        ax.set_title('centered spines')
        ax.plot(x,y)
        ax.spines['right'].set_position(('axes',0.1))
        ax.yaxis.set_ticks_position('right')
        ax.spines['top'].set_position(('axes',0.25))
        ax.xaxis.set_ticks_position('top')
        ax.spines['left'].set_color('none')
        ax.spines['bottom'].set_color('none')
    

    문서에서 :

  3. from https://stackoverflow.com/questions/27948126/how-can-i-write-unit-tests-against-code-that-uses-matplotlib by cc-by-sa and MIT license