Test Driven Development trong Java

Chào mừng các bạn đã trở lại với thachleblog. Bài viết đầu tiên trong chủ đề “Java advanced” này mình sẽ nói về kiểm thử (test) trong java. Code sau khi được triển khai (implement), thì tất nhiên cần phải test dù bằng tay (manual test) hay tự động (automated test) để chắc chắn là đã được implement đúng cho các trường hợp. Hôm nay mình sẽ giới thiệu một phương pháp trong lập trình nhằm tối ưu hóa việc sử dụng automated test đó là Test Driven Development. Chúng ta cùng bắt đầu nhé.

Đầu tiên chúng ta cùng xem lại phương pháp lập trình truyền thống có sử dụng automated test. Đối với lập tình truyền thống, giai đoạn viết automated test sẽ được thực hiện sau khi giai đoạn “coding” đã hoàn thành.

test-last

Tiến trình trong lập trình truyền thống

Tiến trình này xem có vẻ “hợp lý”, nhưng hãy cùng phân tích các vấn đề khi thực hiện theo tiến trình này:

  • Developer dễ vô tình “quên” đi độ phức tạp của method khi chỉ tập trung vào implement, và sau khi đã hoàn thành, cùng với độ phức tạp là số lượng lớn các feature cần test, việc viết automated testing trở nên khó khăn và tốn nhiều chi phí
  • Developer sẽ gặp khó khăn trong việc ước lượng thời gian cho việc viết automated test, dẫn đến sẽ có nguy cơ thiếu thời gian cho automated test
  • Cùng với đó là lợi ích của việc sử dụng automated test không được khai thác triệt để, việc chạy automated test cần được thực hiện lặp lại trong suốt quá trình implement để đảm bảo tốt nhất việc implement được thực hiện đúng.

Test Driven Development (TDD) là phương pháp mà chúng ta sẽ viết automated test trước cho mỗi feature trước khi thực hiện implement.

testfirst.png

Tiến trình sử dụng phương pháp TDD

Life circle của TDD:
test driven development trong java

Hình minh họa life circle của phương pháp TDD (nguồn internet)

  • Red: viết automated test cho feature, tất nhiên là sẽ fail, vì feature chưa được implement
  • Green: viết code implement để automated code chạy đúng
  • Refactor: clean up và refactor code nếu cần

Một số thuật ngữ sử dụng trong automated test:

  • Unit test: test từng phần (method) của một tính năng trong ứng dụng, vd: ta cần test cho tính năng đăng nhập của hệ thống, sẽ bao gồm các bước kiểm tra dữ liệu nhập, kết nối cơ sở dữ liệu, lấy data từ cơ sở dữ liệu so sánh với dữ liệu người dùng… thì việc test cho từng phần kiểm tra dữ liệu nhập, kết nối dữ liệu… chính là unit test
  • Aggrate hay Integration test: test toàn bộ tính năng, ví dụ tính năng đăng nhập, ta sẽ test xem với dữ liệu nhập đúng thì việc đăng nhập có thực hiện đúng hay không

Ví dụ TDD dùng Unit test:

package thach.le.test;
import org.junit.Assert;
import org.junit.Test;
import thach.le.login.AccountLogin;
public class LoginTest {
    @Test
    public void testLogin() {
        AccountLogin accountLogin = new AccountLogin();
        Assert.assertEquals(true, accountLogin.isValid("thachle", "test1234@"));
    }
}

Chúng ta sẽ không thể chạy Unit test vì chưa tạo class AccountLogin về method isValid. Eclipse sẽ tự động tạo class AccountLogin và method isValid, chúng ta chỉ việc thêm vào phần implement:

package thach.le.login;
public class AccountLogin {
    public boolean isValid(String userName, String password) {
        if (userName.length() >= 5 && password.length() >= 8)
            return true;
        else
            return false;
    }
}

Chạy lại test, kết quả là success.

unit-test-result
Refactor lại code implement nếu cần.
Trái ngược với phương pháp lập trình truyền thống, TDD sẽ mang lại lợi ích

  • Cân bằng được thời gian “coding” và “writing test” trong suốt quá trình development
  • Có khả năng “đo” được độ phức tạp của method trước khi implement, vì thông qua test, chúng ta đã biết chính xác method đó sẽ làm gì, do đó dễ dàng break thành các method đơn giản trong khi implement
  • Sử dụng tốt lợi ích của automated testing: khi đã viết automated testing, ta có thể chạy lại thường xuyên trong suốt quá trình implement các tính năng mà không tốn nhiều chi phí

Qua phần trình bày vừa rồi, hy vọng các bạn đã hiểu được Test Driven Development và lợi ích khi sử dụng phương pháp này, ở phần sau, mình sẽ trình bày chi tiết các framework sử dụng trong automated test. Rất mong nhận được ý kiến đóng góp của các bạn.

Xin cảm ơn.

Tham khảo thêm
https://app.pluralsight.com/player?course=test-driven-development-java
http://www.guru99.com/test-driven-development.html
Test Driven Development – Brian Nielsen,  Arne Skou

One thought on “Test Driven Development trong Java

  1. The Spring Framework is a lightweight framework for developing Java enterprise applications. It provides high performing, easily testable and reusable code. Spring handles the infrastructure as the underlying framework so that you can focus on your application.Spring is modular in design, thereby making creation, handling and linking of individual components so much easier. Spring implements Model View Container(MVC) design pattern.
    Spring mvc hello world example

Tham gia bình luận