高度なカスタム フィクスチャの作成
この例では、数値の出力表示形式を変更するカスタム フィクスチャを作成する方法を示します。フィクスチャは単一のテスト クラスに適用するか、複数のテスト クラスで共有できます。テスト後に、フィクスチャによって表示形式が元の状態に復元されます。
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
サブクラスのインスタンスが同一の共有テスト フィクスチャの状態と対応しているかどうかを判別します。フィクスチャの互換性に関する情報は、フレームワークで破棄アクションやセットアップ アクションを実行するタイミングを決めるのに役立ちます。2 つの 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
カスタム フィクスチャを 1 つのテスト クラスに適用する
現在のフォルダー内の 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
のインスタンスを共有テスト フィクスチャとしてそれぞれ使用する 3 つのテスト クラスを作成します。
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