テスト駆動開発

Javaによるテスト入門

Maria Milusheva

Senior Software Engineer

テスト駆動開発

これまでは本番コードの後にテストを書いてきました。

  • テスト駆動開発(TDD)は、テストで設計を導く手法です
  • TDDは本番コードより先にテストを書きます

  • TDDを行う理由

Javaによるテスト入門

TDDの利点

  • TDDで開発すると要件適合性が上がる
  • 即時検証:書いたコードには常にテストがある
  • テスト起点の実装は、よりクリーンで整理されたコードになる
Javaによるテスト入門

TDDの法則

1. 本番コードを書く前に、失敗するテストを書く

2. 可能な限り短いテストを書く

3. テストを通すのに十分な最小限の本番コードだけを書く

これらを順に適用=TDDの1サイクル

開発はTDDの反復で進む

1 https://blog.cleancoder.com/uncle-bob/2014/12/17/TheCyclesOfTDD.html
Javaによるテスト入門

回文のテスト

  • 整数が回文か判定するメソッドを作るとします

  • 回文の例: 12321、0、3333

Javaによるテスト入門

コードを書く前に失敗するテストを書く

@Test
public void isPalindrome_nonPalindromicInt_returnsFalse() {
    int number = 1234;

    assertFalse(isPalindrome(number)); // isPalindrome() is not yet written
}

テストは将来の自分へのメモで、要件を思い出させます。

Javaによるテスト入門

テスト合格に必要最小限のコードを書く

public boolean isPalindrome(int num) {
    return false; // Write minimal code that fulfills the requirements of the test.
}

テストが通りました。次のTDDサイクルへ進みます。

Javaによるテスト入門

別のテストを書く

新しいテスト=新しい要件:

@Test
public void isPalindrome_PalindromicInt_ReturnsTrue() {
    int number = 1234321; // Now write a more complex test case.

    assertTrue(isPalindrome(number)); // At this point isPalindrome() will fail.
}
Javaによるテスト入門

メソッドを実装する

public boolean isPalindrome(int num) {
    int inverted = 0;
    while (num != 0) {
        // At every iteration take the last digit of the number using % 10
        // and add it to inverted * 10.
        inverted = inverted * 10 + num % 10;
        // Now that we have processed the last digit, discard it using / 10.
        num = num / 10;
    }
    return inverted;
}
Javaによるテスト入門

TDDでバグ修正

TDDはバグ修正にも有効です。

今の実装は number = -121 に対して true を返します。これは誤りです。

バグを示す単体テストを書きます。

@Test
public void isPalindrome_NegativeNumber_ReturnsFalse() {
    int number = -121; // Not a palindrome as -121 is not the same as 121-.

    assertFalse(isPalindrome(number));
}
Javaによるテスト入門

TDDでバグ修正

public boolean isPalindrome(int num) {
    if (num < 0) { 
        return false; // We add a clause to return false for negative values.
    }
    int inverted = 0;
    while (num != 0) {
        inverted = inverted * 10 + num % 10;
        num = num / 10;
    }
    return inverted;
}
Javaによるテスト入門

Let's practice!

Javaによるテスト入門

Preparing Video For Download...