次の方法で共有


単体テスト

この記事では、信頼性の高いテスト ケースを作成して実行する方法を説明します。

前提条件

Power Platform 統合開発者エクスペリエンスをローカル マシンにインストールして構成し、Power Platform 開発者中心のサンドボックス環境をローカル マシンにリンクする必要があります。 クラウドとローカルのコード表現を同じ (同期) に保つことが重要です。

詳細: 開発ツールのインストールと構成

重要な概念

  • SysTest フレームワークを使用して単位またはコンポーネントのテスト コードを作成する
  • テストの分離

SysTest フレームワークを使用して単位またはコンポーネントのテスト コードを作成する

新しいテスト ケースを作成して、アプリケーションで機能をテストすることができます。

  1. Visual Studio を開きます。
  2. ファイル メニューで、開く>Project/Solution を選択してから、デスクトップ フォルダーから FleetManagementソリューション を選択します。 ソリューション ファイルがコンピュータにない場合、この作成手順は、フリート管理サンプル アプリケーションのエンドツーエンド シナリオ. に記載されています。
  3. ソリューション エクスプローラー で、フリート管理 ソリューションを右クリックて Add を選択し、新規プロジェクト を選択します。
  4. プロジェクトの種類に 財務と運用 を選択して作成します。
  5. この新しいプロジェクトに FleetManagementUnitTestSample と名前を付け、デスクトップの FleetManagement フォルダー (C:\Users\Public\Desktop\FleetManagement) を場所として指定してから、OK を選択します。
  6. ソリューション エクスプローラー でプロジェクトを右クリックし、プロパティ を選択します。
  7. Model プロパティを FleetManagementUnitTests に設定し、OK を選択します。
  8. ここで、フリート管理コードに対するテストを含むテスト クラスを追加します。 FleetManagementUnitTestSample プロジェクトを右クリックし、追加 から 新しい項目 を選択します。
  9. 新しい項目の追加ウィンドウで、追加する要素のタイプとしてテスト クラス を選択します。 新しいクラスに FMUnitTestSample という名前を付けて、追加 をクリックします。

テンプレート クラスには、テストの作成を開始するための情報が含まれています。 この例では、テスト クラスは 2 つのテストのみで構成されており、それぞれが SysTestMethod 属性でマークされています。 メソッドは拡張性の対象ではないため、Hookable(false) 属性が付加されています。 さらに、テスト クラスには、テストが実行される前に呼び出される setup() というメソッドが含まれています。 この方法は、多くの場合、すべてのテストで共有される状態の設定に役立ちます。

class FMUnitTestSample extends SysTestCase
{
    public void setup()
    {
        // Reset the test data to be sure things are clean
        FMDataHelper::main(null);
    }

    [SysTestMethod, Hookable(false)]
    public void testFMTotalsEngine()
    {
        FMRental rental;
        FMTotalsEngine fmTotals;
        FMRentalTotal fmRentalTotal;
        FMRentalCharge rentalCharge;
        FMRentalTotal expectedtotal;
        str rentalID = '000022';

        // Find a known rental
        rental = FMRental::find(rentalID);

        // Get the rental charges associated with the rental
        // Data is seeded randomly, so this will change for each run
        select sum(ExtendedAmount) from rentalCharge
                where rentalCharge.RentalId == rental.RentalId;

        fmTotals = FMTotalsEngine::construct();
        fmTotals.calculateRentalVehicleRate(rental);

        // Get the totals from the engine
        fmRentalTotal = fmTotals.totals(rental);

        // Set the expected amount
        expectedTotal = rental.VehicleRateTotal + rentalCharge.ExtendedAmount;

        this.assertEquals(expectedTotal,fmRentalTotal);
    }

    [SysTestMethod, Hookable(false)]
    public void testFMCarValidateField()
    {
        FMCarClass fmCar;

        fmCar.NumberOfDoors = -1;
        this.assertFalse(fmCar.validateField(Fieldnum("FMCarClass", "NumberOfDoors")));

        fmCar.NumberOfDoors = 4;
        this.assertTrue(fmCar.validateField(Fieldnum("FMCarClass", "NumberOfDoors")));
    }
}

残りの手順に従って続行します。

  1. テスト クラスを保存します。
  2. ソリューション エクスプローラー で FleetManagementUnitTestSample プロジェクトを右クリックし、ビルド を選択してプロジェクトをビルドします。

X++ コンパイラによって診断された問題を修正した後は、Visual Studio テスト エクスプローラーを使用して単体テストを実行する準備が整います。 統合された開発者エクスペリエンスでは、実行中の SQL Server に存在するデータに対してクラウドで実行が行われます。 そこで、以下の手順でコンパイルの結果をクラウドに展開する必要があります。

  1. ソリューション エクスプローラーのプロジェクトのコンテキスト メニューから プロジェクト FleetManagementUnitTests にモデルを展開 メニュー項目を選択します。 まだ接続していない場合は、Power Platform に接続するように求められます。

  2. 展開ダイアログが表示されます。 データベースと同期する必要がある新しいテーブルを追加していないため、展開の手順を実行します。 ダイアログに入力し、展開 を選択します。

    展開のダイアログ。

  3. Visual Studio の テスト メニューで、テスト エクスプローラー を開きます。

  4. 選択したテストの実行 を選択して、テスト ケースの 2 つのテスト メソッドをクラウドで実行します。 現在、テスト エクスプローラーのデバッグメニューはサポートしていません。

テスト エクスプローラーは、各テストの完了後にその結果を表示します。 さいわい、すべてのテストが成功しました。 成功しなかった場合は、テスト エクスプローラーを使用して、問題のあるテスト コードに移動できます。

テストの分離

テストが高い価値を持つためには、信頼できるものでなければなりません。 テストは、他のテストなどの他の要因に関係なく、常に成功または失敗します。 信頼性の低いテストの典型的な原因の 1 つとして、ダウンストリーム テストに影響を与えるデータベースに残されたデータなどのリーク状態があります。 信頼できないテストのもう 1 つの要因は、特定の順序で呼び出されるテストに依存していることです。 このタイプの問題を回避するには、SysTestTransaction 属性を使用できます。

TestTransactionMode Description
AutoRollback 既定。 最適な分離が提供されます。

すべてのトランザクションは、SQL セーブ ポイントを使用してロールバックされ、すべてのデータベース ステートメントは、ユーザー接続を含む、メインの接続にルーティングされます。 保持されるデータはありません。
LegacyRollback すべての挿入ステートメントは、クリーンアップ時に追跡および削除されます。

すべての挿入ステートメントは、行ごとにダウングレードされます。 典型的なユース ケースの 1 つは、ユーザー接続、または同時実行シナリオをテストする場合です。 この分離レベルは、セットアップ データのクリーンアップをするため、推奨は各テスト メソッドを ttsBegin と ttsAbort でラップすることです。
LegacyRollbackWithUpdateTracking すべての更新、削除、挿入ステートメントは、クリーンアップ中に追跡され、元に戻されます。

すべての挿入、更新、削除ステートメントが行ごとに追跡され、ダウングレードされます。 このモードは、最も遅い分離レベルです。
None このモードはデバッグのみに使用してください。 このモードでは分離を提供できせん。

この設定は、テストで作成されたデータを通常のユーザー インターフェイスを使用してナビゲートできるため、一時的にテストをデバッグする場合に役立ちます。

例:

    [SysTestTransaction(TestTransactionMode::LegacyRollback)]
    class MyTestSample extends SysTestCase

テスト コードと FormAdaptors を管理するテスト モジュールの作成

テスト コードをまとめて管理しやすくするためにテスト固有のモジュールを作成しています。

  1. Visual Studio を開き、Dynamics 365>モデル管理>モデルの作成 に移動します。

  2. モデル名を入力し、レイヤーを選択し、次にモードの詳細を入力します。 テスト モジュールの名前に テスト という語を含めることをお勧めします。 既定のビルド定義は、テスト という単語を含むすべてのテスト モジュールを検出するように設定されています。

  3. このモデルはアプリケーション プラットフォーム/基盤からのフォームを保持しているため、次の図で選択 (チェック) されたモデルへの参照を追加します。

    モデルのダイアログを作成します。

参照

X++ コードの作成、展開、デバッグ