単体テストの書き方
一つの単体テストで検証する内容は一つに
入力が同じだからといって違う振る舞いを同じテストで確認するのはおかしい テストがNGになったときに結局「どっちの関数でエラー出た?」という謎の作業が入る。
// xUnitでサンプルを記述
using System;
using Xunit;
namespace XUnitTestProject1
{
public class UnitTest1
{
[Theory]
[InlineData(5, 2, 10, 2.5)]
public void SampleMathTest(int a, int b, int multiplyResult, int divideResult)
{
Assert.Equal(SampleMath.Multiply(a, b), multiplyResult);
Assert.Equal(SampleMath.Divide(a, b), divideResult);
}
}
static class SampleMath
{
public static int Multiply(int a, int b)
{
return a * b;
}
public static int Divide(int a, int b)
{
return a / b;
}
}
}
めんどくさがらず二つに分けよう。
public class UnitTest1
{
[Theory]
[InlineData(5, 2, 10)]
public void MultiplyTest(int a, int b, int multiplyResult)
{
Assert.Equal(SampleMath.Multiply(a, b), multiplyResult);
}
[Theory]
[InlineData(5, 2, 2.5)]
public void DivideTest(int a, int b, int divideResult)
{
Assert.Equal(SampleMath.Divide(a, b), divideResult);
}
}
それじゃあどんな時に複数呼ぶのか推察してみる。
- 複雑な計算の途中計算結果を確認したい場合
- 戻り値がクラスでクラスの一部のプロパティのみを比較して評価したい場合
等が考えられる。
とにかく、あくまで単体テスト検証したい一つのふるまいに対して実装する
「このテストは何を検証したいんだろうか」と立ち返ってテストメソッド名をちゃんと考えることが重要。(VerifyAandB
みたいなテストメソッドになるのならそれは単体テストではない。)と思う。