고급 사용자 지정 픽스처(Fixture) 생성하기
이 예제에서는 환경 변수를 설정하는 사용자 지정 픽스처를 만드는 방법을 보여줍니다. 테스트 전에 이 픽스처는 현재 UserName
변수를 저장하게 됩니다.
UserNameEnvironmentVariableFixture 클래스 정의 생성하기
작업 폴더의 파일에 matlab.unittest.fixtures.Fixture
클래스에서 상속되는 새 클래스 UserNameEnvironmentVariableFixture
를 만듭니다. 픽스처에 사용자 이름을 전달할 계획이므로 메서드 간 데이터를 전달하도록 UserName
속성을 만드십시오.
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 end
설정 메서드 구현하기
Fixture
클래스의 서브클래스는 setup
메서드를 구현해야 합니다. 이 메서드를 사용하여 원본 UserName
변수를 저장하십시오. 이 메서드는 또한 TeardownDescription
을 정의하고 테스트 후에 UserName
을 원래 상태로 설정하는 해제(Teardown) 작업을 등록합니다.
UserNameEnvironmentVariableFixture.m
파일의 methods
블록 내에서 setup
메서드를 정의하십시오.
methods 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
속성을 구성할 수 있기 때문에 UserNameEnvironmentVariableFixture
는 isCompatible
을 구현해야 합니다.
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'
와 동일하지 않기 때문에, testA
와 testB
의 테스트는 호환되지 않는 공유 픽스처를 사용합니다. 그러므로, testA
호출과 testB
호출 사이에 프레임워크에서는 픽스처의 teardown
메서드와 setup
메서드를 불러옵니다. 그러나, testC
의 공유 테스트 픽스처는 testB
의 픽스처와 호환되므로 프레임워크에서 testC
이전에 픽스처 해제와 설정을 반복하지 않습니다.
설정 메서드에서 addTeardown을 호출하는 다른 접근 방식
setup
메서드 내에서 addTeardown
메서드를 사용하는 또 다른 접근 방식은 별도의 teardown
메서드를 구현하는 것입니다. 위에서 설명한 setup
메서드 대신, UserNameEnvironmentVariableFixture.m
내에서 다음 setup
메서드와 teardown
메서드를 구현하십시오.
대체
UserNameEnvironmentVariableFixture
클래스 정의
setup
메서드에는 addTeardown
호출이나 TeardownDescription
의 정의가 있지 않습니다. 이런 작업은 teardown
메서드에 위임됩니다. 이 대체 클래스 정의는 메서드 간 정보 전달을 허용하는 추가 속성 OriginalUser
를 포함하고 있습니다.
참고 항목
matlab.unittest.fixtures.Fixture