web-dev-qa-db-ja.com

現在のプラットフォームに基づいて、xUnitの特定のテストをスキップする方法

  • Windowsで作成したアセンブリがあります
  • LinuxのモノでxUnitテストを実行したい。

ただし、これらのテストのうち400件は(順番に)実行できますが、特定のテストではxUnitランナーがハングアップするか、完全にダウンすることがわかりました。

私はしませんケア特定のテストがLinuxで実行できない場合、特定のテストはDTCと、サポートする必要のない管理されていないガンフに関連しています。

しかし、私が欲しいのは、それらのテストに無視を適用し、テストが無視されたという事実をビルド出力で適切にフラグ付けすることです。

質問は、いくつかの可能な解決策になると思います。

  • コンソールランナーを介してxUnitで特定のテストを実行するにはどうすればよいですか? (私はこの目的のためのドキュメンテーションを見つけていません、たぶん私は十分によく見ていないだけです)
  • 逆に言って「これはアセンブリです、これらの特定のテストは無視してください」と言うことは可能ですか?
  • これらのテストに属性があることは、これらのテストがプラットフォーム固有であることを正式に文書化するためのより良い方法が提案されています-これは可能ですか?

元のコードをあまり変更しないようにすることができれば、コードは実際に変更するためのものではなく、クロスプラットフォームのハックをたくさん適用しても、おそらくあまりうまくいきません。

42
Rob Ashton

スキップテスト(つまり、可能であればconfig/commandファイル)を外部化することは避けます。これは、テストを簡単に実行して信頼できるものにすることには多少反対します。コードでテストを無視することは、他の人が関与し始めるときに最も安全なアプローチです。

私はいくつかのオプションを見ることができました。ここに、既存のコードの変更を含む2つがあります。

オプション1-最も煩わしいコンパイル時のプラットフォーム検出

VS Solutionで、プリコンパイラフラグMONOWINを定義する別の構成を定義します(Monoで使用するためにWindowsでコンパイルされたコード用であることを明示的に示すフラグであるため)。

次に、Mono用にコンパイルされたときにテストを無視する属性を定義します。

_public class IgnoreOnMonoFactAttribute : FactAttribute {
#if MONOWIN
    public IgnoreOnMonoFactAttribute() {
        Skip = "Ignored on Mono";
    }
#endif
}
_

この方法には、元のソリューションをモックする必要があり、サポートする必要がある別の確認を追加するため、この方法の利点を見つけるのは実際には困難です。

オプション2-やや煩わしい-ラン​​タイムプラットフォームの検出

個別の構成が必要ないことを除いて、option1と同様のソリューションを次に示します。

_public class IgnoreOnMonoFactAttribute : FactAttribute {

    public IgnoreOnMonoFactAttribute() {
        if(IsRunningOnMono()) {
            Skip = "Ignored on Mono";
        }
    }
    /// <summary>
    /// Determine if runtime is Mono.
    /// Taken from http://stackoverflow.com/questions/721161
    /// </summary>
    /// <returns>True if being executed in Mono, false otherwise.</returns>
    public static bool IsRunningOnMono() {
        return Type.GetType("Mono.Runtime") != null;
    }
}
_

注1

xUnitランナーは、_[Fact]_および_[IgnoreOnMonoFact]_でマークされている場合、メソッドを2回実行します。 (CodeRushはそれを行いません。この場合、xUnitが正しいと思います)。つまり、テストメソッドでは_[Fact]_を_[IgnoreOnMonoFact]_に置き換える必要があります。

注2

CodeRushテストランナーは_[IgnoreOnMonoFact]_テストを実行しましたが、[Fact(Skip="reason")]テストを無視しました。私は、CodeRushがxUnitを反映していて、実際にxUnitライブラリを使用して実行していないことが原因だと思います。これはxUnitランナーで正常に動作します。

35
Igor Zevaka

XUnit v2.0が利用可能になりました。スキップ可能なテストは、直接サポートされています。使用する:

[Fact (Skip = "specific reason")]

54
richardwhatever

現在、新しいオプションがあります。

Nugetパッケージ SkippableFact を追加します。これにより、[SkippableFact]の代わりに[Fact]を使用でき、テスト内でSkip.<xyz>を使用して、ランタイム中にテストを動的にスキップできます。

例:

[SkippableFact]
public void SomeTestForWindowsOnly()
{
    Skip.IfNot(Environment.IsWindows);

    // Test Windows only functionality.
}
26

これは1.8で解決されました-トレイトでフィルタリングできます。これを見てください issue log

更新:トレイトはコンソールランナーで機能しますが、MSBuildでは機能しません。このサポートの機能リクエストを追加しました。

2
hoserdude

これはトレイトの理想的な使用方法ですが、残念ながら、コマンドラインもxmlプロジェクトファイルもトレイトに基づくフィルタリングをサポートしていません。これについては、codeplexサイトに問題を追加する価値があります。

2
citizenmatt