Main Content

고급 사용자 지정 픽스처(Fixture) 생성하기

이 예제에서는 숫자형 값의 출력 표시 형식을 변경하는 사용자 지정 픽스처를 만드는 방법을 보여줍니다. 단일 테스트 클래스에 픽스처를 적용하거나 여러 테스트 클래스에서 픽스처를 공유할 수 있습니다. 테스트 후 픽스처가 표시 형식을 원래 상태로 복원합니다.

NumericFormatFixture 클래스 만들기

현재 폴더의 NumericFormatFixture.m 파일에서, matlab.unittest.fixtures.Fixture 인터페이스에서 파생하여 NumericFormatFixture 클래스를 만듭니다. 픽스처에 수치 형식을 전달할 것이므로 클래스에 Format 속성을 추가합니다.

    properties (SetAccess=immutable)
        Format (1,1) string
    end

픽스처 생성자 추가하기

클래스의 methods 블록에서 Format 속성을 설정하는 생성자를 정의합니다.

    methods
        function fixture = NumericFormatFixture(fmt)
            fixture.Format = fmt;
        end
    end

setup 메서드 구현하기

Fixture 인터페이스의 서브클래스는 테스트 프레임워크가 픽스처를 설정하면 환경을 변경하는 setup 메서드를 구현해야 합니다. 프레임워크가 픽스처를 해제할 때 환경이 복원되도록 하려면 setup 메서드 내에서 addTeardown 메서드를 호출합니다.

methods 블록에서 setup 메서드를 구현하여 픽스처가 생성된 동안에는 수치 형식을 지정된 형식으로 변경하고 테스트 후에는 형식을 원래 상태로 복원합니다. 프레임워크가 픽스처를 설정하고 해제할 때 설명 정보를 제공하려면 메서드 내에서 SetupDescription 속성 및 TeardownDescription 속성을 설정합니다.

    methods
        function setup(fixture)
            originalFormat = format;
            fixture.addTeardown(@format,originalFormat)
            format(fixture.Format)
            fixture.SetupDescription = "Set the numeric format to " + ...
                fixture.Format + ".";
            fixture.TeardownDescription =  ...
                "Restored the numeric format to " + ...
                originalFormat.NumericFormat + ".";
        end
    end

isCompatible 메서드 구현하기

픽스처를 구성할 수 있는 경우(예: 해당 클래스 생성자가 입력 인수를 받는 경우) Fixture 서브클래스에서 isCompatible 메서드를 구현하십시오. 이 예제에서는 클래스 생성자를 사용하여 Format 속성을 설정하므로 isCompatible을 구현해야 합니다.

테스트 프레임워크는 isCompatible을 호출하여 동일한 Fixture 서브클래스의 인스턴스들이 동일한 공유 테스트 픽스처 상태에 해당하는지 확인합니다. 픽스처 호환성에 대한 정보는 프레임워크가 언제 해제 동작이나 설정 동작을 수행할지 결정할 때 유용합니다. 두 개의 NumericFormatFixture 인스턴스는 Format 속성이 같을 때 환경을 똑같이 변경합니다. protected 액세스로 지정된 methods 블록에서 isCompatible 메서드를 구현하여 호환성 정의를 지정하십시오.

    methods (Access=protected)
        function tf = isCompatible(fixture1,fixture2)
            tf = fixture1.Format == fixture2.Format;
        end
    end

픽스처 클래스 정의

다음 코드는 NumericFormatFixture 클래스의 전체 내용을 제공합니다.

classdef NumericFormatFixture < matlab.unittest.fixtures.Fixture
    properties (SetAccess=immutable)
        Format (1,1) string
    end

    methods
        function fixture = NumericFormatFixture(fmt)
            fixture.Format = fmt;
        end

        function setup(fixture)
            originalFormat = format;
            fixture.addTeardown(@format,originalFormat)
            format(fixture.Format)
            fixture.SetupDescription = "Set the numeric format to " + ...
                fixture.Format + ".";
            fixture.TeardownDescription =  ...
                "Restored the numeric format to " + ...
                originalFormat.NumericFormat + ".";
        end
    end

    methods (Access=protected)
        function tf = isCompatible(fixture1,fixture2)
            tf = fixture1.Format == fixture2.Format;
        end
    end
end

단일 테스트 클래스에 사용자 지정 픽스처 적용하기

현재 폴더의 ExampleTest.m 파일에서, 사용자 지정 픽스처를 적용하고 숫자형 값이 예상 형식으로 표시되는지 확인하는 ExampleTest 클래스를 만듭니다. 이 예제를 단순화하기 위해 실제 값은 formattedDisplayText 함수의 호출로 생성됩니다. 실제 상황에서는 사용자가 정의한 코드를 테스트합니다.

classdef ExampleTest < matlab.unittest.TestCase
    methods (Test)
        function formatTest(testCase)
            testCase.applyFixture(NumericFormatFixture("bank"))
            actual = strtrim(formattedDisplayText(pi));
            expected = "3.14";
            testCase.verifyEqual(actual,expected)
        end
    end
end

ExampleTest 클래스를 실행합니다. 테스트 프레임워크가 픽스처를 설정하여 표시 형식을 통화 형식으로 변경합니다. 테스트 실행이 완료되면 프레임워크가 픽스처를 해제하여 원래 표시 형식이 복원됩니다. 이 예제에서 테스트가 통과합니다.

runtests("ExampleTest");
Running ExampleTest
.
Done ExampleTest
__________

사용자 지정 픽스처를 공유 픽스처로 적용하기

현재 폴더에서, NumericFormatFixture 인스턴스를 공유 테스트 픽스처로 사용하는 세 개의 테스트 클래스를 만듭니다.

TestA.m이라는 파일에서 TestA 클래스를 만듭니다.

classdef (SharedTestFixtures={NumericFormatFixture("bank")}) ...
        TestA < matlab.unittest.TestCase
    methods (Test)
        function formatTest(testCase)
            actual = strtrim(formattedDisplayText(pi));
            expected = "3.14";
            testCase.verifyEqual(actual,expected)
        end
    end
end

TestB.m이라는 파일에서 TestB 클래스를 만듭니다.

classdef (SharedTestFixtures={NumericFormatFixture("bank")}) ...
        TestB < matlab.unittest.TestCase
    methods (Test)
        function formatTest(testCase)
            actual = strtrim(formattedDisplayText(100/3));
            expected = "33.33";
            testCase.verifyEqual(actual,expected)
        end
    end
end

TestC.m이라는 파일에서 TestC 클래스를 만듭니다.

classdef (SharedTestFixtures={NumericFormatFixture("hex")}) ...
        TestC < matlab.unittest.TestCase
    methods (Test)
        function formatTest(testCase)
            actual = strtrim(formattedDisplayText(1));
            expected = "3ff0000000000000";
            testCase.verifyEqual(actual,expected)
        end
    end
end

TestA 클래스와 TestB 클래스에는 환경을 똑같이 변경하는 공유 픽스처가 할당되었습니다. 반면에 TestC 클래스에는 다른 수치 형식을 적용하는 픽스처가 할당되었습니다. 이 예제에 구현된 isCompatible 메서드에 따르면, 테스트 프레임워크는 TestATestB의 픽스처가 호환되는 것으로 파악합니다. 그러나 TestC의 픽스처는 다른 픽스처와 호환되지 않는다고 파악합니다.

픽스처 호환성에 대한 정보는 프레임워크가 언제 해제 동작이나 설정 동작을 수행할지 결정할 때 유용합니다. TestA, TestB, TestC를 동일한 테스트 스위트로 실행하는 경우, TestATestB의 클래스는 둘 다 동일한 환경을 필요로 하기 때문에 이 두 테스트 간에 전환할 때는 프레임워크가 픽스처를 해제하지 않습니다. 그러나 TestB에서 TestC로 전환할 때는 프레임워크가 기존 픽스처를 해제하고 TestC에 필요한 새 픽스처를 설정합니다. 이 예제에서 모든 테스트가 통과합니다.

runtests(["TestA" "TestB" "TestC"]);
Setting up NumericFormatFixture
Done setting up NumericFormatFixture: Set the numeric format to bank.
__________

Running TestA
.
Done TestA
__________

Running TestB
.
Done TestB
__________

Tearing down NumericFormatFixture
Done tearing down NumericFormatFixture: Restored the numeric format to short.
__________

Setting up NumericFormatFixture
Done setting up NumericFormatFixture: Set the numeric format to hex.
__________

Running TestC
.
Done TestC
__________

Tearing down NumericFormatFixture
Done tearing down NumericFormatFixture: Restored the numeric format to short.
__________

setup 메서드에서 addTeardown을 호출하는 다른 접근 방식

setup 메서드 내에서 addTeardown 메서드를 호출하는 또 다른 접근 방식은 별도의 teardown 메서드를 구현하는 것입니다. 다음 코드는 setup 메서드와 teardown 메서드를 모두 구현하여 NumericFormatFixture 클래스를 다시 만드는 방법을 보여줍니다. 참고로, 이 다른 방식의 클래스 정의는 원래 형식에 대한 정보를 teardown 메서드에 전달하기 위해 추가 속성 OriginalFormat을 포함하고 있습니다.

classdef NumericFormatFixture < matlab.unittest.fixtures.Fixture
    properties (SetAccess=immutable)
        Format (1,1) string
    end

    properties (Access=private)
        OriginalFormat
    end

    methods
        function fixture = NumericFormatFixture(fmt)  
            fixture.Format = fmt;
        end

        function setup(fixture)
            fixture.OriginalFormat = format().NumericFormat;
            format(fixture.Format)
            fixture.SetupDescription = "Set the numeric format to " + ...
                fixture.Format + ".";
        end

        function teardown(fixture)
            format(fixture.OriginalFormat)
            fixture.TeardownDescription =  ...
                "Restored the numeric format to " + ...
                fixture.OriginalFormat + ".";
        end
    end

    methods (Access=protected)
        function tf = isCompatible(fixture1,fixture2)
            tf = fixture1.Format == fixture2.Format;
        end
    end
end

참고 항목

| |

관련 항목