Edited at

NUnitのCategoryを用いて、特定のテストコードをCIに実行させない

More than 1 year has passed since last update.

 NUnitのテストコードをJenkinsなどのCIで動かすとき、ローカルでは成功するのに、CIサーバーでは失敗し、訳あって成功できないことがあります。

 UIを伴うテストコード、DBを直接更新するテストコードなど……。

 動くような環境を作りたいのは山々だが、余裕がない。

 こんなとき、CIでの実行を無視したい場合の対応方法としてCategoryアトリビュートを使って、ひとまずCIで実行させない方法を紹介します。


参考サイト

https://github.com/nunit/docs/wiki/Console-Command-Line


試行環境


  • TeamCity

  • NUnit 3.6.0

手元の環境がTeamCityなのでTeamCityで説明しますが、Jenkinsでも同様のことができると思います。


Categoryアトリビュートの宣言

 あらかじめ、CIで除外対象にするカテゴリー名を決めておきます。

 今回は「BuidServerIgnore」として宣言しますが、「JenkinsIgnore」でも、お好きなように。

 除外したいテストコードにCategoryアトリビュートで宣言します。

    /// <summary>

/// <see cref="BaseGameInfo.SaveDataBase"/>をテストします。
/// </summary>
/// <remarks>
/// TeamCityだと失敗するので、Category属性を付与
/// </remarks>
[Category("BuildServerIgnore")]
[Test]
public void SaveDatabase()
{
// 何かしらの DB処理
}


CI(TeamCity)で除外するように設定

NUnitの起動引数に「--where "cat != BuildServerIgnore"」といったように宣言します。

これで「BuildServerIgnore」とCategoryが宣言されたテストコードは除外されます。

スクリーンショット 2018-10-09 22.58.44.png


おわりに

 実際には、オンコードではなく、定数化しておいてCategory宣言が良いかと思います。

    public class TestSetup

{
public const string BuildServerIgnoreCategory = "BuildServerIgnore";
}

   [Category(TestSetup.BuildServerIgnoreCategory)]

[Test]
public void SaveDatabase()
{
// 省略
}