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


 NUnitのテストコードをJenkinsなどのCIで動かすとき、ローカルでは成功するのに、CIサーバーでは失敗し、訳あって成功できないことがあります。
 UIを伴うテストコード、DBを直接更新するテストコードなど……。
 動くような環境を作りたいのは山々だが、余裕がない。
 こんなとき、CIでの実行を無視したい場合の対応方法としてCategoryアトリビュートを使って、ひとまずCIで実行させない方法を紹介します。

参考サイト

試行環境

  • 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が宣言されたテストコードは除外されます。

おわりに

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

    public class TestSetup
    {
        public const string BuildServerIgnoreCategory = "BuildServerIgnore";
    }
   [Category(TestSetup.BuildServerIgnoreCategory)]
   [Test]
   public void SaveDatabase()
   {
        // 省略
   }