Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

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

이 예제에서는 환경 변수를 설정하는 사용자 지정 픽스처를 만드는 방법을 보여줍니다. 테스트 전에 이 픽스처는 현재 UserName 변수를 저장하게 됩니다.

UserNameEnvironmentVariableFixture 클래스 정의 생성하기

작업 폴더의 파일에 matlab.unittest.fixtures.Fixture 클래스에서 상속되는 새 클래스 UserNameEnvironmentVariableFixture를 만듭니다. 픽스처에 사용자 이름을 전달할 계획이므로 메서드 간 데이터를 전달하도록 UserName 속성을 만드십시오.

classdef UserNameEnvironmentVariableFixture < ...
        matlab.unittest.fixtures.Fixture
    
    properties (SetAccess=private)
        UserName
    end

픽스처 생성자 정의하기

UserNameEnvironmentVariableFixture.m 파일의 methods 블록에서, 입력값을 확인하고 SetupDescription을 정의하는 생성자 메서드를 만드십시오. 이 생성자가 문자형 벡터를 받고 픽스처의 UserName 속성을 설정하도록 하십시오.

    methods
        function fixture = UserNameEnvironmentVariableFixture(name)
            validateattributes(name, {'char'}, {'row'}, '','UserName')
            fixture.UserName = name;
            fixture.SetupDescription = sprintf( ...
                'Set the UserName environment variable to "%s".',...
                fixture.UserName);
        end

설정 메서드 구현하기

Fixture 클래스의 서브클래스는 setup 메서드를 구현해야 합니다. 이 메서드를 사용하여 원본 UserName 변수를 저장하십시오. 이 메서드는 또한 TeardownDescription을 정의하고 테스트 후에 UserName을 원래 상태로 설정하는 해제(Teardown) 작업을 등록합니다.

UserNameEnvironmentVariableFixture.m 파일의 methods 블록 내에서 setup 메서드를 정의하십시오.

        function setup(fixture)
            originalUserName = getenv('UserName');
            fixture.assertNotEmpty(originalUserName, ...
                'An existing UserName environment variable must be defined.')
            fixture.addTeardown(@setenv, 'UserName', originalUserName)
            fixture.TeardownDescription = sprintf(...
                'Restored the UserName environment variable to "%s".',...
                originalUserName);
            setenv('UserName', fixture.UserName)
        end
    end

isCompatible 메서드 구현하기

생성자가 구성 가능한 경우, Fixture에서 파생되는 클래스는 isCompatible 메서드를 구현해야 합니다. 생성자를 통해 UserName 속성을 구성할 수 있기 때문에 UserNameEnvironmentVariableFixtureisCompatible을 구현해야 합니다.

isCompatible 메서드는 동일한 클래스의 두 인스턴스와 함께 호출됩니다. 이 예제에서는, UserNameEnvironmentVariableFixture의 두 인스턴스와 함께 호출됩니다. UserName 속성이 동일한 경우, 테스트 프레임워크는 두 인스턴스가 호환된다고 간주합니다.

UserNameEnvironmentVariableFixture.m 내의 새 methods 블록에서, 논리값 1(true)이나 논리값 0(false)을 반환하는 isCompatible 메서드를 정의하십시오.

    methods (Access=protected)
        function bool = isCompatible(fixture, other)
            bool = strcmp(fixture.UserName, other.UserName);
        end
    end

픽스처 클래스 정의 요약

다음은 UserNameEnvironmentVariableFixture.m의 전체 내용입니다.

classdef UserNameEnvironmentVariableFixture < ...
        matlab.unittest.fixtures.Fixture
    
    properties (SetAccess=private)
        UserName
    end
    
    methods
        function fixture = UserNameEnvironmentVariableFixture(name)
            validateattributes(name, {'char'}, {'row'}, '','UserName')
            fixture.UserName = name;
            fixture.SetupDescription = sprintf( ...
                'Set the UserName environment variable to "%s".',...
                fixture.UserName);
        end
        
        function setup(fixture)
            originalUserName = getenv('UserName');
            fixture.assertNotEmpty(originalUserName, ...
                'An existing UserName environment variable must be defined.')
            fixture.addTeardown(@setenv, 'UserName', originalUserName)
            fixture.TeardownDescription = sprintf(...
                'Restored the UserName environment variable to "%s".',...
                originalUserName);
            setenv('UserName', fixture.UserName)
        end
    end
    
    methods (Access=protected)
        function bool = isCompatible(fixture, other)
            bool = strcmp(fixture.UserName, other.UserName);
        end
    end
end

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

작업 폴더의 파일에서 다음과 같은 테스트 클래스 ExampleTest.m을 만드십시오.

classdef ExampleTest < matlab.unittest.TestCase
    methods(TestMethodSetup)
        function mySetup(testCase)
            testCase.applyFixture(...
                UserNameEnvironmentVariableFixture('David'));
        end
    end
    
    methods (Test)
        function t1(~)
            fprintf(1, 'Current UserName: "%s"', getenv('UserName'))
        end
    end
end

이 테스트는 ExampleTest 클래스의 각 테스트에 대해 UserNameEnvironmentVariableFixture를 사용합니다.

명령 프롬프트에서 테스트를 실행합니다.

run(ExampleTest);
Running ExampleTest
Current UserName: "David".
Done ExampleTest
__________

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

작업 폴더에서, 공유 픽스처를 사용하여 세 개의 테스트 클래스를 만드십시오. 공유 픽스처를 만들면 여러 클래스에서 UserNameEnvironmentVariableFixture를 공유할 수 있습니다.

다음과 같이 testA.m을 만드십시오.

classdef (SharedTestFixtures={...
        UserNameEnvironmentVariableFixture('David')}) ...
        testA < matlab.unittest.TestCase
    methods (Test)
        function t1(~)
            fprintf(1, 'Current UserName: "%s"', getenv('UserName'))
        end
    end
end

다음과 같이 testB.m을 만드십시오.

classdef (SharedTestFixtures={...
        UserNameEnvironmentVariableFixture('Andy')}) ...
        testB < matlab.unittest.TestCase
    methods (Test)
        function t1(~)
            fprintf(1, 'Current UserName: "%s"', getenv('UserName'))
        end
    end
end

다음과 같이 testC.m을 만드십시오.

classdef (SharedTestFixtures={...
        UserNameEnvironmentVariableFixture('Andy')}) ...
        testC < matlab.unittest.TestCase
    methods (Test)
        function t1(~)
            fprintf(1, 'Current UserName: "%s"', getenv('UserName'))
        end
    end
end

명령 프롬프트에서 테스트를 실행합니다.

runtests({'testA','testB','testC'});
Setting up UserNameEnvironmentVariableFixture
Done setting up UserNameEnvironmentVariableFixture: Set the UserName environment variable to "David".
__________

Running testA
Current UserName: "David".
Done testA
__________

Tearing down UserNameEnvironmentVariableFixture
Done tearing down UserNameEnvironmentVariableFixture: Restored the UserName environment variable to "Kim".
__________

Setting up UserNameEnvironmentVariableFixture
Done setting up UserNameEnvironmentVariableFixture: Set the UserName environment variable to "Andy".
__________

Running testB
Current UserName: "Andy".
Done testB
__________

Running testC
Current UserName: "Andy".
Done testC
__________

Tearing down UserNameEnvironmentVariableFixture
Done tearing down UserNameEnvironmentVariableFixture: Restored the UserName environment variable to "Kim".
__________

UserName 속성이 일치하는 경우 픽스처가 호환된다는 점에 유의하십시오. 'David''Andy'와 동일하지 않기 때문에, testAtestB의 테스트는 호환되지 않는 공유 픽스처를 사용합니다. 그러므로, testA 호출과 testB 호출 사이에 프레임워크에서는 픽스처의 teardown 메서드와 setup 메서드를 불러옵니다. 그러나, testC의 공유 테스트 픽스처는 testB의 픽스처와 호환되므로 프레임워크에서 testC 이전에 픽스처 해제와 설정을 반복하지 않습니다.

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

setup 메서드 내에서 addTeardown 메서드를 사용하는 또 다른 접근 방식은 별도의 teardown 메서드를 구현하는 것입니다. 위에서 설명한 setup 메서드 대신, UserNameEnvironmentVariableFixture.m 내에서 다음 setup 메서드와 teardown 메서드를 구현하십시오.

 대체 UserNameEnvironmentVariableFixture 클래스 정의

setup 메서드에는 addTeardown 호출이나 TeardownDescription의 정의가 있지 않습니다. 이런 작업은 teardown 메서드에 위임됩니다. 이 대체 클래스 정의는 메서드 간 정보 전달을 허용하는 추가 속성 OriginalUser를 포함하고 있습니다.

참고 항목

관련 항목