12/08/2018, 14:33

Unit Test cho Android trên Android Studio

1. Unit Test là gì ? Mới đây Framgia cũng có một bài khá thú vị về Unit Test. Mọi người có thể tham khảo để hiểu rõ hỡn về UT tại đây. Ngoài ra thì mình để ý thấy Framgia đã có rất nhiều bài về Unit Test mà các các bạn có thể tham khảo như : Những điều cơ bản về JUnit link. Vai trò của Unit ...

1. Unit Test là gì ?

Mới đây Framgia cũng có một bài khá thú vị về Unit Test. Mọi người có thể tham khảo để hiểu rõ hỡn về UT tại đây. Ngoài ra thì mình để ý thấy Framgia đã có rất nhiều bài về Unit Test mà các các bạn có thể tham khảo như : Những điều cơ bản về JUnit link. Vai trò của Unit Test link. Unit Test cho IOS link. Unit Test trong Laravel link.

Unit Test (UT) là một kỹ thuật quan trọng góp phần nâng cao chất lượng phần mềm (PM), nhưng có nhiều quan điểm trái ngược nhau về việc đưa UT vào quy trình phát triển PM. Bài viết này giới thiệu một cái nhìn tổng quan về UT và mô hình phát triển phần mềm hiện đại TDD (Test-Driven Development).

Kỹ thuật này kiểm nghiệm các hoạt động của mọi chi tiết mã (code) với một quy trình tách biệt với quy trình phát triển PM, giúp phát hiện sai sót kịp thời. UT còn có thể giúp phát hiện các vấn đề tiềm ẩn và các lỗi thời gian thực ngay cả trước khi chuyên viên kiểm định chất lượng (QA - Quality Assurance) tìm ra, thậm chí có thể sửa lỗi ngay từ ý tưởng thiết kế.

UT là các đoạn mã có cấu trúc giống như các đối tượng được xây dựng để kiểm tra từng bộ phận trong hệ thống. Mỗi UT sẽ gửi đi một thông điệp và kiểm tra câu trả lời nhận được đúng hay không, bao gồm:

• Các kết quả trả về mong muốn

• Các lỗi ngoại lệ mong muốn

Các đoạn mã UT hoạt động liên tục hoặc định kỳ để thăm dò và phát hiện các lỗi kỹ thuật trong suốt quá trình phát triển, do đó UT còn được gọi là kỹ thuật kiểm nghiệm tự động.

UT có các đặc điểm sau:

• Đóng vai trò như những người sử dụng đầu tiên của hệ thống.

• Chỉ có giá trị khi chúng có thể phát hiện các vấn đề tiềm ẩn hoặc lỗi kỹ thuật.

UT thường có 3 trạng thái chính như : Pass, Fails và Ignore.

UT có thể :

• Kiểm tra mọi đơn vị nhỏ nhất là các thuộc tính, sự kiện, thủ tục và hàm.

• Kiểm tra các trạng thái và ràng buộc của đối tượng ở các mức sâu hơn mà thông thường chúng ta không thể truy cập được.

• Kiểm tra các quy trình (process) và mở rộng hơn là các khung làm việc(workflow - tập hợp của nhiều quy trình).

2. Unit Test trong Android.

Riêng với Android thì chúng ta có nhiều sự lựa chọn hơn về các framwork để testing unit.

  • JUnit JUnit là một framework đơn giản dùng cho việc tạo các unit testing tự động, và chạy các test có thể lặp đi lặp lại. JUnit là một framework đơn giản thường được dùng để viết Unit Test trên môi trường Java . JUnit giúp người lập trình viên phải lặp lại nhiều lần việc kiểm thử nhàm chán, mất thời gian bằng cách tách biệt mã kiểm thử ra khỏi mã chương trình, đồng thời tự động hóa việc tổ chức và thi hành các bộ số liệu kiểm thử .

  • Robolectric (mock các class của android)

  • Mockito (mock class của mình, thường là mock logic trong presenter)

  • Dagger - ko phải test framework, nhưng là phần hỗ trợ để có thể dùng mock object hiệu quả hơn. VD Car thì có Engine, dùng dagger có thể cho 1 bản mock của class Engine vào class Car để test đc class Car.

Ở bài này mình xin phép hướng dẫn các bạn cài đặt và sử dụng Robolectric. Robolectric là một framework cho phép bạn viết unit test và chạy chúng trên môi trường JVM mà không cần chạy ứng dụng Android một cách trực tiếp trên thiết bị.

URL trang chủ: http://robolectric.org

Robolectric được viết dựa trên framework JUnit 4.

3. Cài đặt và cách sửa một số lỗi thường gặp khi cài đặt với framwork Robolectric.

Đầu tiên bạn thêm dòng sau vào build.gradle :

testCompile "org.robolectric: robolectric: 3.2.2" 

Bạn phải thêm 2 câu lệnh sau vào trước mỗi file test case

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class UnitTest {
  // TODO something
}

Bạn phải nhớ đến 2 thứ sau : @Before và @Test. Lưu ý phương thức gắn annotation là @Before, tức là nó sẽ được chạy trước khi chạy các phương thức có gắn annotations là @Test. Phương thức này thường được dùng để khai báo, định nghĩa các dữ liệu cần thiết trước khi tiến hành kiểm thử.

Các phương thức được viết để chạy unit test sẽ được gắn annotation là @Test

Ví dụ :

@Before
public void setUp() {
// TODO something
}

@Test
public void testNotNull() {
// TODO something
}

4. Một vài ví dụ đơn giản .

Mình xin viết một ví dụ đơn giản để các bạn hiểu rõ hơn việc cài đặt .

Ứng dụng nhập 2 số và tính các phép cộng trừ nhân chia sau đó hiển thị kết quả ở phía dưới. Tôi tạo tên lớp và code như sau :

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class DemoTest {
    private MainActivity mActivity;

    @Before
    public void setUp() throws Exception {
        mActivity = Robolectric.buildActivity(MainActivity.class).create().get();
    }

    @Test
    public void testViewStart() throws Exception {
        assertThat(mActivity.mButtonSum.getText().toString(), equalTo("Cộng"));
        assertThat(mActivity.mTextViewResult.getText().toString(), equalTo("Kết quả"));
    }

    @Test
    public void testClicking() throws Exception {
        // Test thử chức năng 1 + 1 = 2;
        mActivity.mButtonSum.performClick();
        assertThat(mActivity.mTextViewResult.getText().toString(), equalTo("2"));
    }
}

Sau đó tôi nhấp phải chuột và chọn Run DemoTest và ngồi đợi kết quả . Đây là màn hình lúc đang test Đây là kết quả. Tôi đã dó 2 funtion test pass Sau đó tôi thử test 1+ 1 = 3 thì nhận được 1 pass 1 failed

Với một funtion failed bạn có thể thấy được Expected và Actual.

Lưu ý : Nếu bạn gặp lỗi sau :

java.lang.UnsupportedOperationException: Robolectric does not support API level 25.

Thì bạn đổi API thấp xuống, project của tôi để API 23 là ổn. Ngoài ra để tranh một số lỗi khác bạn nên complie vài dòng sau

    testCompile 'junit:junit:4.12'
    testCompile 'junit:junit:4.12'
    testCompile 'org.easytesting:fest:1.0.16'
    testCompile "org.robolectric:robolectric:3.1.4"
    testCompile 'org.khronos:opengl-api:gl1.1-android-2.1_r1'

Cảm ơn và chúc các bạn ăn tết Đinh Dậu vui vẻ !

0