データベースクエリのように機能するメソッドの単純な単体テストをいくつか書いています。これは、制限 (最大 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 までの魔法の整数をどこにでも挿入するよりも、テストがはるかに読みやすくなります。
可読性と保守性の両方のために、この状況に対処する最善の方法は何ですか (たとえば、必要に応じて将来値を変更するなど)?