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()
{
// 省略
}