NUnit のパラメーター化されたテスト方法を理論に変更したいとしましょう。理論に関する限り、主張が通用するすべての仮定/前提条件を定義する必要があります。NUnit のドキュメントによると:
[理論をパラメーター化されたテストと比較する場合] 一方、理論は、特定の仮定を満たすすべての引数について、その主張のすべてが合格するという一般的な声明を出します。
しかし、私が理解しているように、これは呼び出された PUT のコードは基本的に仮定に変換する必要があることを意味します。完全に。
では、理論を持っている意味は何ですか?私たちのアルゴリズムは2回書かれるからです。1 つ目はテスト可能なコードとして、2 つ目は理論上の仮定として。したがって、アルゴリズムにバグを導入した場合、コードとテストの両方に同じバグが含まれる可能性があります。それでは、ポイントは何ですか?
理解を深めるための例
数字のみをサポートするチェックサム メソッドがあり、理論を使用してテストしたいとします。理論を書きましょう:
static Regex rx = new Regex(@"^\d+$", RegexOptions.Compiled);
[Theory]
public void ChecksumTheory(string value)
{
Assume.That(!string.IsNotNullOrWhiteSpace(value));
Assume.That(value.Length > 1); // one single number + checksum = same number twice
Assume.That(rx.IsMatch(value));
var cc = new ChecksumValidator();
bool result = cc.ValidateValue(value);
Assert.IsTrue(result); // not really as algorithm assumptions are missing
}
これは非常に優れた理論ですが、テストされたコード アルゴリズムを実際に実装し、それを一連の仮定として表現しなければ、明示的なアルゴリズムの仮定がなければ、検証の結果がどうなるかを知ることができないため、そのアサーションは合格しません。
追加情報
入力状態に関する仮定、つまり特定の値が正しく設定されていること、またはそれらの組み合わせが適切であることを確認することのみを提供する必要がある場合、理論はかなり自明で簡潔に見えます。
[Theory]
public void Person_ValidateState(Person input)
{
Assume.That(input.Age < 110);
Assume.That(input.Birth < input.Death || input.Death == null);
...
}
質問
- すべてのアサートが合格するのに十分な仮定を提供する必要があるのに、なぜ単体テスト理論を書くのでしょうか?
- すべてのアルゴリズムの仮定を提供することによって車輪を再発明したくない場合、正しい仮定をどのように提供すればよいでしょうか?
- そうでない場合、自分の理論を NUnit 理論の良い例にするにはどのように書き直せばよいでしょうか?
- とにかく、テスト理論の(作成者による)意図された使用は何ですか?