現在のプラットフォームに基づいてXunitで特定のテストをスキップするにはどうすればよいですか
-
09-10-2019 - |
質問
- Windowsに構築したアセンブリがあります
- LinuxのMonoでXunitテストを実行したいと思います。
ただし、これらのテストのうち400個が(順番に)実行できる一方で、特定のテストではXunitランナーを掛けるか、完全に倒すことがわかりました。
私はしません お手入れ 特定のテストがLinuxで実行できない場合、特定のテストは、そこでサポートする必要のないDTCおよび管理されていないガンフに関係しています。
しかし、私が望んでいるのは、それらのテストに無視を適用し、テストがビルド出力で適切にフラグが付けられたことを無視されたという事実を持っていることです。
質問は、多くの可能な解決策を推測することができます
- コンソールランナーを介してXunitで特定のテストを実行するにはどうすればよいですか? (この目的のドキュメントが見つかりませんでした、多分私は十分に一生懸命見ていないだけかもしれません)
- 逆に行って「ここにアセンブリがある、これらの特定のテストを無視してください」と言うことは可能ですか?
- これらのテストに属性を持っていることは、これらのテストがプラットフォーム固有であることを正式に文書化するためのより良い方法であることが示唆されています - これは可能ですか?
元のコードの変更を避けることができれば、それは壮大になります。コードが実際に変更するのに私のものではなく、多くのクロスプラットフォームハックを適用することはあまりうまくいかないでしょう。
解決
スキップテストの外部化を避けます(つまり、可能であれば構成/コマンドファイル)。これは、テストを実行しやすく信頼できるようにすることに幾分反対です。他の人が関与し始めるとき、コードでテストを無視することは最も安全なアプローチです。
いくつかのオプションを見ることができました。既存のコードの変更を伴う2つのオプションがあります。
オプション1-最も邪魔な、コンパイル時間プラットフォーム検出
VSソリューションでは、プリコンパイラフラグを定義する別の構成を定義します MONOWIN
(それが明示的にフラグであるように、それはモノで使用するためにWindowsにコンパイルされたコード用であると言っています)。
次に、モノのコンパイルされたときにテストを無視する属性を定義します。
public class IgnoreOnMonoFactAttribute : FactAttribute {
#if MONOWIN
public IgnoreOnMonoFactAttribute() {
Skip = "Ignored on Mono";
}
#endif
}
この方法は、元のソリューションとのock笑を伴い、サポートする必要がある別の自白を追加するため、この方法に利点を見つけるのは実際には困難です。
オプション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ランナーは、マークされている場合、メソッドを2回実行します [Fact]
と [IgnoreOnMonoFact]
. 。 (Coderushはそれをしません。この場合、Xunitが正しいと思います)。これは、テスト方法が必要であることを意味します [Fact]
交換された [IgnoreOnMonoFact]
注2
Coderushテストランナーはまだ実行されました [IgnoreOnMonoFact]
テストですが、それは無視しました [Fact(Skip="reason")]
テスト。 Xunitを反映したCoderushによるものであり、Xunitライブラリの助けを借りて実際に実行していないことが原因だと思います。これはXunitランナーで正常に動作します。
他のヒント
Xunit V2.0が利用可能になりました。スキップ可能なテストは、それによって直接サポートされています。使用する:
[Fact (Skip = "specific reason")]
現在、新しいオプションがあります。
Nugetパッケージを追加します SkippableFact, 、使用できます [SkippableFact]
それ以外の [Fact]
そして、あなたは使用することができます Skip.<xyz>
ランタイム中にテストを動的にスキップするテスト内。
例:
[SkippableFact]
public void SomeTestForWindowsOnly()
{
Skip.IfNot(Environment.IsWindows);
// Test Windows only functionality.
}
これは特性の理想的な使用ですが、残念ながら、コマンドラインもXMLプロジェクトファイルも、特性に基づいたフィルタリングをサポートしていません。これについては、CodePlexサイトに問題を追加する価値があります。
これは1.8で解決されました - 特性をフィルタリングできます。これを参照してください 問題のログ.
更新:MSBuildではなくコンソールランナーで動作しますが、このサポートの機能リクエストを追加しました。