创建高级自定义脚手架
此示例说明如何创建一个自定义的脚手架,以更改数值的输出显示格式。您可以将该脚手架应用于单个测试类,也可以在多个测试类之间共享该脚手架。在测试后,脚手架会将显示格式还原为其原始状态。
创建 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 类。请注意,替代类定义包含附加属性 OriginalFormat,用于将有关原始格式的信息传递给 teardown 方法。
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