MSTest v3 から v4 への移行

安定バージョンの MSTest v4 が利用可能になりました。 この移行ガイドでは、MSTest v4 の変更点と、このバージョンへの移行方法について説明します。

Note

一般に、MSTest v4 は MSTest v3 とバイナリ互換性がありません。 v3 に対してコンパイルされたライブラリは、v4 に対して再コンパイルする必要があります。

ソースコードの破壊的変更

これらは重大な変更であり、テスト プロジェクトのコンパイルに失敗する可能性があります。

TestMethodAttribute の破壊的変更

TestMethodAttribute.Execute を TestMethodAttribute.ExecuteAsync に変更する

独自の TestMethodAttributeを実装する場合は、 Execute オーバーライドを ExecuteAsyncに変更する必要があります。 この変更は、API の同期ブロッキングの性質によって引き起こされる、長年にわたるデッドロックのバグを修正するために行われました。

たとえば、以前に次のものが含まれている場合は、次のようになります。

public sealed class MyTestMethodAttribute : TestMethodAttribute
{
    public override TestResult[] Execute(ITestMethod testMethod)
    {
        // ...
        return result;
    }
}

これを次のように変更する必要があります。

public sealed class MyTestMethodAttribute : TestMethodAttribute
{
    public override Task<TestResult[]> ExecuteAsync(ITestMethod testMethod)
    {
        // ...
        return Task.FromResult(result);
    }
}

TestMethodAttribute で呼び出し元情報属性が使用されるようになりました

TestMethodAttribute コンストラクターは、呼び出し元情報属性を提供するパラメーターを持つよう変更されました。

  • TestMethodAttributeから継承する場合は、基底クラスに情報を伝達するこのようなコンストラクターも指定する必要があります。

    public class MyTestMethodAttribute : TestMethodAttribute
    {
        public MyTestMethodAttribute([CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = -1)
        : base(callerFilePath, callerLineNumber)
        {
        }
    }
    
  • [TestMethodAttribute("Custom display name")]などの属性アプリケーションがある場合は、[TestMethodAttribute(DisplayName = "Custom display name")]に切り替えます。

Tip

コード修正を含むアナライザーは、この移行に役立つ予定です。 IDE で 1 回クリックすると、ソリューション内のすべてのインスタンスが修正されます。

ClassCleanupBehavior 列挙型が削除されました

これで、ClassCleanup メソッドはテスト クラスの末尾でのみ実行されます。 アセンブリの最後に実行するクラス クリーンアップのサポートは削除されます。 アセンブリクリーンアップロジックの終了を実行する必要がある場合は、AssemblyCleanupではなくClassCleanupで実行します。 クラス クリーンアップの既定の動作は、以前は "EndOfAssembly" でした。この動作は、ユーザーがバグと見なしていました。

以前に次のコードがある場合:

[ClassCleanup(ClassCleanupBehavior.EndOfClass)]
public static void ClassCleanup(TestContext testContext)
{
}

これを次のように変更する必要があります。

[ClassCleanup]
public static void ClassCleanup(TestContext testContext)
{
}

TestContext.Properties が IDictionary<string、object になりました>

以前は、 TestContext.Properties は IDictionaryでした。 入力を改善するために、現在はIDictionary<string, object>です。

TestContext.Properties.Containsの呼び出しがある場合は、TestContext.Properties.ContainsKeyに更新します。

TestTimeout 列挙型が削除されました

この列挙型には、値がInfiniteされた 1 つのメンバー (int.MaxValue) のみが含まれます。 [Timeout(TestTimeout.Infinite)]を使用していた場合は、[Timeout(int.MaxValue)]に更新します。

TestContext.ManagedType が削除されました

プロパティ TestContext.ManagedType が削除されます。 TestContext.FullyQualifiedTestClassName を代わりに使用します。

公開を意図していない型は、内部に限定されるか、削除されます

  • Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.ObjectModel.ITestMethod は内部に作成されます。
    • このインターフェイスは、変更されなかった TestFramework アセンブリの ITestMethod とは異なっています。
    • Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.ObjectModel.ITestMethod はユーザーに対して有効な使用法を持っていないので、内部的に行われました。
  • 既に古い型の一部は内部的に作成されています。 これには次のものが含まれます
    • MSTestDiscoverer
    • MSTestExecutor
    • AssemblyResolver
    • LogMessageListener
    • TestExecutionManager
    • TestMethodInfo
    • TestResultExtensions
    • UnitTestOutcomeExtensions
    • GenericParameterHelper
    • プラットフォーム サービス アセンブリの型

Assert API シグネチャの変更

  • messageパラメーターとobject[] パラメーターの両方を受け入れる Assert API は、messageのみを受け入れるようになりました。 代わりに文字列補間を使用してください。 これは、アサーション API の呼び出し元引数式をサポートするために必要な変更でした。
  • Assert.AreEqual IEquatable<T>の API は削除されます。 この API のユーザーは非常に少なく、API は誤解を招きます。 API は最初は MSTest v3 に存在せず、3.2.2 で導入されたため、ほとんどのユーザーはこの削除の影響を受けません。
    • この API は、F# ユーザーにも問題を引き起こします。 たとえば、 fsharp/fslang-suggestions/issues/905 を参照してください。
    • 影響を受けた場合は、ジェネリック型の推論に関するコンパイル エラーが発生します。 必要な操作は、型引数を明示的に objectとして指定することにあります。
  • 非推奨の Assert.ThrowsException API は削除されます。 MSTest 3.10 のアナライザーとコードフィックスは、新しい API への移行に役立ちます。
  • Assert.IsInstanceOfType<T>(x, out var t)の使用状況がvar t = Assert.IsInstanceOfType<T>(x)に変わるようになりました。
    • out パラメーターを持たない既存のオーバーロードは、void ではなく T 型のインスタンスを返すように変更されました。 これは F# の破壊的変更にすぎません。

ExpectedExceptionAttribute API が削除されました

非推奨の ExpectedExceptionAttribute API は削除されます。 MSTest 3.2 のアナライザー (MSTEST0006) とコード修正は、 Assert.Throwsへの移行に役立ちます。

たとえば、次のコードがあるとします。

[ExpectedException(typeof(SomeExceptionType))]
[TestMethod]
public void TestMethod()
{
    MyCall();
}

ユーザー (またはアナライザーとコードフィックス) は、次のように変更する必要があります。

[TestMethod]
public void TestMethod()
{
    Assert.ThrowsExactly<SomeExceptionType>(() => MyCall());
}

サポートされていないターゲット フレームワークを削除しました

.NET Core 3.1 から .NET 7 へのターゲット フレームワークのサポートは削除されます。 サポートされている .NET の最小バージョンは .NET 8 です。 この変更は .NET Framework には影響しません。 .NET Framework 4.6.2 は、引き続きサポートされる最小の .NET Framework ターゲットです。

展開戦略が個々のデータ ソースから TestMethodAttribute に移行されました

展開戦略は、既知の制限を回避するために MSTest 3.7 で導入された最近の機能です。 プロパティは、 DataRowAttribute や DynamicDataAttributeなどの個々のデータ ソースに追加されました。 このプロパティは、 TestMethodAttributeに移動されました。

ConditionBaseAttribute.ShouldRun API の変更

ConditionBaseAttribute.ShouldRun プロパティの名前が IsConditionMet に変更されました。 これにより、 ConditionMode を実装で使用しないことを明確にしています。

複数のアナライザーがデフォルトで警告に設定される

次のアナライザーの既定の重大度が情報から警告に変更されました。

動作の破壊的変更

これらは、実行時の動作に影響を与える可能性のある破壊的変更です。

DisableAppDomain が MTP で実行されているときに既定値が true に設定されるようになりました

v4 では、MTP を使用して実行する場合、提供されるカスタム分離はほとんどの場合役に立たず、パフォーマンスに重要な影響を与える (分離の下で実行する場合は最大 30% 遅くなります) ので、AppDomain は既定で無効になります (指定されていない場合)。

ただし、この機能は引き続き使用できます。 必要なシナリオがある場合は、runsettings に DisableAppDomain 設定を追加します。

Important

AppDomain 分離が有効になっている場合、MSTest は、すべてのテストの完了後に AppDomain をアンロードし、フォアグラウンド スレッドを含む AppDomain に関連付けられているすべてのスレッドを中止します。 その結果、MSTest v3 でフォアグラウンド スレッドが永久に実行されていた場合、テストの実行は正常に完了します。 MSTest v4 でも同じシナリオがハングします。これは、フォアグラウンド スレッドがまだ実行されているときにプロセスを終了しないようにする必要があるため、理想的な動作です。

TestContext は、誤って使用されたときに例外をスローする

TestContext型は AssemblyInitialize、ClassInitialize、およびテストに渡されますが、各段階で使用可能な情報は異なります。 現在は、AssemblyInitialize または ClassInitialize の一部としてテスト実行に関する情報のプロパティにアクセスすると、例外がスローされます。

  • TestContext.FullyQualifiedTestClassName アセンブリ初期化ではアクセスできません。
  • TestContext.TestName は、アセンブリ初期化またはクラス初期化ではアクセスできません。

TestCase.Id が変化しています

多くのユーザーが提出した長い未処理のバグに対処するために、 TestCase.Id の生成が変更されました。 これは、時間の経過に伴うテストエラーの追跡など、Azure DevOps の機能に影響します。

TreatDiscoveryWarningsAsErrors が既定で true に設定されるようになりました

v4 では、より厳密な既定値が使用されます。 そのため、 TreatDiscoveryWarningsAsErrors の既定値が trueされるようになりました。 これは、ほとんどのユーザーにとって透過的な変更であり、他のユーザーが隠れたバグを明らかにするのに役立ちます。

MSTest.Sdk で MTP の使用時Microsoft.NET.Test.Sdk 参照が追加されなくなりました

既定では、MSTest.Sdk は MTP を使用します。 UseVSTest MSBuild プロパティが true に設定されている場合は、代わりに VSTest が使用されます。 MSTest 3.x では、SDK により MTP を使用する場合でも Microsoft.NET.Test.Sdk への参照が追加されました。これにより、VSTest のサポートが提供されます。 このパッケージ参照は、MTP で実行するときに不要であり、MSTest v4 で削除されています。

VSTest を引き続きサポートする場合 (たとえば、vstest.console を使用して実行する場合)、NuGet パッケージへのパッケージ参照 Microsoft.NET.Test.Sdk プロジェクトに手動で追加する必要があります。