1

データベースクエリのように機能するメソッドの単純な単体テストをいくつか書いています。これは、制限 (最大 n 個の結果) とページ (n 個の結果の p 番目のセット) を使用してカスタマイズできる結果のリストを返します。 . 次のようないくつかのケースをテストしたいと思います。

  • すべての結果を返す
  • 限定された結果セットの最初のページを返す
  • 限られた結果セットの任意のページを返す
  • 結果の合計数を超える制限された結果セットの最後のページを返します
  • 結果の総数を超えるページを返す

返される結果 (実質的には名前) をモックする必要があるため、カウンターを使用してそれらを生成し、「名前 #1」、「名前 #2」などのリストを必要な数だけ作成します。各テストは (大まかに) 次のようになります。

public void testGetMockCandidatesLimited() throws Exception {
    int numResults = 4;
    setupMock(numResults);
    results = queryFunction(...);

    // Check that the expected number of results was returned
    assertEquals(numResults, results.size());
    // Check that the results are correct and in order
    for (int i = 0; i < numResults; i++) {
        assertEquals(result.get(i).getName(), "Name #" + (i + 1));
    }
}

私の質問は、このように期待される答えを「生成」しても大丈夫ですか? これは些細な例ですが、次のステップは、それぞれ 2 つの結果の 2 ページ目を取得するテストを作成するためのテストを作成することでした。

    final int TEST_LIMIT = 2, TEST_PAGE = 1;
    // Check that the expected number of results was returned
    assertEquals(numResults, results.size());
    // Check that the results are correct and in order
    for (int i = TEST_LIMIT * TEST_PAGE; i < TEST_LIMIT * TEST_PAGE + TEST_LIMIT; i++) {
        assertEquals(result.get(i).getName(), "Name #" + (i + 1));
    }

今、私が期待する値を取り、結果が「名前 #3」と「名前 #4」であることを確認するという意味で、このテストは「正しい」ものです。ただし、私の queryFunction がどの結果を同じように返すかを計算することもあります(limit * page + limit一種のことです)。

テスト対象のユニットと同じ方法でテストが期待される回答を生成する場合、そのアプローチにバグがあるかどうかを検出できないため、これは懸念事項です。ただし、定数を使用して入力値に名前を付けると、1 から 4 までの魔法の整数をどこにでも挿入するよりも、テストがはるかに読みやすくなります。

可読性と保守性の両方のために、この状況に対処する最善の方法は何ですか (たとえば、必要に応じて将来値を変更するなど)?

4

1 に答える 1

1

この質問をすることで、次のように期待値を前もって定数として定義することが解決策であると確信したと思います。

final int LIMIT = 2, PAGE = 1, MIN_RESULT = 3, MAX_RESULT = 4;

...そして、それらの値をアサーションで使用します。これにより、名前付きキー値の可読性がすべて保持され、期待される出力を生成する誘惑が抑えられます。Name #MINこの場合、ループを使用してとの間に予想される各名前を生成しますName #MAXが、境界自体は明示的に静的になります。

これはうまくいくのでしょうか、それともこの反復性に対処するためのより良い方法はありますか?

于 2013-03-07T01:54:24.333 に答える