고급 사용자 지정 픽스처(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
메서드에 따르면, 테스트 프레임워크는 TestA
와 TestB
의 픽스처가 호환되는 것으로 파악합니다. 그러나 TestC
의 픽스처는 다른 픽스처와 호환되지 않는다고 파악합니다.
픽스처 호환성에 대한 정보는 프레임워크가 언제 해제 동작이나 설정 동작을 수행할지 결정할 때 유용합니다. TestA
, TestB
, TestC
를 동일한 테스트 스위트로 실행하는 경우, TestA
와 TestB
의 클래스는 둘 다 동일한 환경을 필요로 하기 때문에 이 두 테스트 간에 전환할 때는 프레임워크가 픽스처를 해제하지 않습니다. 그러나 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
참고 항목
matlab.unittest.fixtures.Fixture
| matlab.unittest.TestCase
| format