102
  • Windows でビルドしたアセンブリがあります
  • Linux の mono で xUnit テストを実行したいと考えています。

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

特定のテストが Linux で実行できないかどうかはにしません。特定のテストは、DTC とそこでサポートする必要のない管理されていないガムに関係しています。

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

質問は、いくつかの可能な解決策を推測するに要約できます

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

元のコードを大幅に変更することを避けることができれば、それは素晴らしいことです。なぜなら、コードを変更するのは実際には私のものではなく、多くのクロスプラットフォームのハックを適用してもうまくいかないからです。

4

6 に答える 6

192

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

[Fact (Skip = "specific reason")]
于 2016-06-21T07:36:18.837 に答える
56

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

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

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

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

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

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

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

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

オプション1と同様のソリューションを次に示しますが、個別の構成は必要ありません。

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 runnerは、[Fact]andでマークされている場合、メソッドを2回実行し[IgnoreOnMonoFact]ます。(CodeRushはそれを行いません。この場合、xUnitは正しいと思います)。これは、すべてのテストメソッドがに[Fact]置き換えられている必要があることを意味します[IgnoreOnMonoFact]

注2

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

于 2010-12-12T13:44:45.370 に答える
49

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

Nuget Package SkippableFact を追加ます。これにより、[SkippableFact]代わりに使用したり、テスト内で[Fact]使用Skip.<xyz>して、実行時にテストを動的にスキップしたりできます。

例:

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

    // Test Windows only functionality.
}
于 2016-03-08T15:31:56.593 に答える
2

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

于 2010-12-14T09:27:59.683 に答える
-1

これは 1.8 で解決されました。Traits でフィルタリングできます。この問題ログを参照してください。

更新: Traits はコンソール ランナーで動作しますが、MSBuild では動作しません。このサポートの機能要求を追加しました。

于 2012-02-23T23:37:56.233 に答える