Phát triển hướng kiểm thử

Nhập môn Kiểm thử trong Java

Maria Milusheva

Senior Software Engineer

Test-Driven Development

Đến giờ ta chỉ viết kiểm thử sau khi có mã sản phẩm.

  • Test-Driven Development (TDD) là kỹ thuật thiết kế dùng kiểm thử để dẫn dắt thiết kế
  • TDD được thực hiện bằng cách viết kiểm thử trước khi viết mã sản phẩm

  • Vì sao dùng TDD?

Nhập môn Kiểm thử trong Java

Lợi ích của TDD

  • Phát triển với TDD giúp đáp ứng yêu cầu dự án tốt hơn
  • Xác minh tức thì - mã viết ra đã có kiểm thử
  • Lập trình dựa trên kiểm thử tạo ra mã sạch, cấu trúc tốt hơn
Nhập môn Kiểm thử trong Java

Các quy tắc của TDD

1. Phải viết một kiểm thử thất bại trước khi viết mã sản phẩm

2. Phải viết kiểm thử ngắn nhất có thể

3. Không viết nhiều mã sản phẩm hơn mức đủ để kiểm thử qua

Áp dụng tuần tự = một chu kỳ TDD

Phát triển diễn ra qua các chu kỳ TDD lặp lại

1 https://blog.cleancoder.com/uncle-bob/2014/12/17/TheCyclesOfTDD.html
Nhập môn Kiểm thử trong Java

Kiểm thử palindrome

  • Giả sử ta cần viết phương thức kiểm tra một số nguyên có phải palindrome không

  • Ví dụ palindrome: 12321, 0, 3333

Nhập môn Kiểm thử trong Java

Viết kiểm thử thất bại trước khi viết mã

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

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

Bài kiểm thử như một ghi chú cho tương lai, nhắc ta về yêu cầu dự án.

Nhập môn Kiểm thử trong Java

Viết ít mã nhất để bài kiểm thử qua

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

Kiểm thử đã qua. Chuyển sang chu kỳ TDD tiếp theo.

Nhập môn Kiểm thử trong Java

Viết một kiểm thử khác

Kiểm thử mới - yêu cầu mới cho tính năng:

@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.
}
Nhập môn Kiểm thử trong Java

Triển khai phương thức

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;
}
Nhập môn Kiểm thử trong Java

Sửa lỗi với TDD

TDD rất hiệu quả để sửa lỗi!

Phương thức vừa viết trả về true cho number = -121. Điều này sai!

Ta viết unit test để minh họa lỗi:

@Test
public void isPalindrome_NegativeNumber_ReturnsFalse() {
    int number = -121; // Không phải palindrome vì -121 khác 121-.

    assertFalse(isPalindrome(number));
}
Nhập môn Kiểm thử trong Java

Sửa lỗi với 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;
}
Nhập môn Kiểm thử trong Java

Ayo berlatih!

Nhập môn Kiểm thử trong Java

Preparing Video For Download...