1. ホーム
  2. unit-testing

[解決済み] アレンジ-アサート-アクト-アサート "でよいのでしょうか?

2023-01-11 19:25:23

質問

古典的なテストパターンである アレンジ-アクション-アサート に関して、私は頻繁にActの前にカウンターアサーションを追加していることに気づきました。 この方法で、私は通過するアサーションが本当にアクションの結果として通過していることを知ることができます。

私はこれをred-green-refactorのredに例えて考えています。テストの過程で赤いバーを見たときだけ、緑のバーは私が違いを生み出すコードを書いたことを意味することが分かります。 もし私が合格するテストを書いたとしたら のいずれかになります。 同様に、Arrange-Assert-Act-Assert に関して、私の最初のアサーションが失敗した場合、どの Act も最後の Assert を通過していることがわかります。

あなたのテストはこのパターンに従っていますか? その理由またはそうでない理由を教えてください。

更新 明確化:最初の主張は、最終的な主張と本質的に逆である。 アレンジが動作したというアサーションではなく、アクトがまだ動作していないというアサーションです。

どのように解決するのですか?

以下はその例です。

public void testEncompass() throws Exception {
    Range range = new Range(0, 5);
    assertFalse(range.includes(7));
    range.encompass(7);
    assertTrue(range.includes(7));
}

と書いたのは、もしかしたら Range.includes() を単純にtrueを返すように書いたのかもしれません。 私はそうしませんでしたが、そうするかもしれないと想像することはできます。 あるいは、他の多くの方法で間違った書き方をしたのかもしれません。 私は、TDDで実際に正しいことができたと期待しています。 includes() が機能することを期待したいところですが、もしかしたらそうでないかもしれません。 ですから、最初のアサーションは、2番目のアサーションが本当に意味があるのかどうかを確認するためのサニティチェックなのです。

それ自体で読むと assertTrue(range.includes(7)); は次のように言っています: "変更された範囲に 7" が含まれることを表明しています。 最初のアサーションの文脈で読むと、それは次のように言っています: "次のようにアサーションします。 encompass() を呼び出すこと を呼び出すと7が含まれることを表明しています。 そして、encompassは私たちがテストしているユニットなので、私はそれが何らかの(小さな)価値があると思います。

私は自分自身の答えを受け入れています。他の多くの人が私の質問をセットアップのテストについてだと誤解しています。 私は、これはわずかに異なると思います。