Main Content

高度なカスタム フィクスチャの作成

この例では、数値の出力表示形式を変更するカスタム フィクスチャを作成する方法を示します。フィクスチャは単一のテスト クラスに適用するか、複数のテスト クラスで共有できます。テスト後に、フィクスチャによって表示形式が元の状態に復元されます。

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 メソッドの実装に従って、テスト フレームワークは TestATestB のフィクスチャに互換性があると判定します。一方、TestC のフィクスチャについては、他のフィクスチャと互換性がないと判定されます。

フィクスチャの互換性に関する情報は、フレームワークで破棄アクションやセットアップ アクションを実行するタイミングを決めるのに役立ちます。TestATestB、および 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

参考

| |

関連するトピック