Để dễ dàng cho các bạn theo dõi và tìm hiểu về cách viết Unit Test trong Java. Bài này mình sẽ tổng hợp lại toàn bộ các bài viết về cách viết Unit Test với JUnit + Mockito + PowerMockito.
Nội dung
- 1 Tìm hiểu về kiểm thử (Tesing) trong phát triển phần mềm
- 2 Unit Testing trong phát triển phần mềm hiện đại
- 3 Giới thiệu JUnit
- 4 Một số Annotation cơ bản của JUnit
- 5 Một số API của JUnit – Assert, Assume, Test Runner
- 6 Làm thế nào để thực thi một nhóm các class test trong JUnit?
- 7 JUnit – Parameterized Test
- 8 Đơn giản hóa Unit Test với JUnit Rule
- 9 JUnit – Hamcrest Matchers
- 10 JUnit – Custom Hamcrest Matchers
- 11 Làm thế nào để chạy lại một failed Test trong JUnit?
- 12 Làm thế nào để lắng nghe các sự kiện mỗi khi một test được thực thi trong JUnit?
- 13 JUnit – HTML Report với Surefire maven plugin
- 14 Giới thiệu Mockito
- 15 Mockito – Annotations
- 16 Mockito – Control mock’s behavior
- 17 Mockito – Verifying Behavior
- 18 Giới thiệu Powermock
- 19 PowerMockito – Suppressing Unwanted Behavior
- 20 Làm sao test một Abstract Class trong Java?
- 21 Test Web service
Tìm hiểu về kiểm thử (Tesing) trong phát triển phần mềm
Trong bài viết này sẽ giới thiệu cho các bạn biết về kiểm thử phần mềm (testing) trong phát triển phần mềm.
- Kiểm thử (testing) là gì?
- Ai sẽ là người test?
- Thời điểm bắt đầu test
- Khi nào thì dừng việc test
- Phân loại Tesing
- So sánh Manual Testing và Automation Testing
Unit Testing trong phát triển phần mềm hiện đại
Bài này sẽ giới thiệu chi tiết hơn về cách viết Unit Testing và mô hình phát triển phần mềm hiện đại TDD (Test-Driven Development). Ngoài ra, chúng ta cũng sẽ biết được cách xây dựng UT với mô hình đối tượng ảo (Mock Object).
Giới thiệu JUnit
Sau khi đã nắm được các khái niệm về Unit test, TDD, chúng ta sẽ cùng tìm hiểu về cách viết Unit Test trong Java với JUnit Framework. Cách cài đặt và sử dụng JUnit test với Eclipse. Làm sao kiểm tra độ bao phủ của Unit Test với plugin EclEmma.
Một số Annotation cơ bản của JUnit
Tìm hiểu cách sử dụng một số Annotation cơ bản của JUnit như @Before, @After, @BeforeClass, @AfterClass, @Test, @Test(expected=XxxException.class), @Ignore, @FixMethodOrder. Hiểu về lifecycle của một Test Class trong JUnit. Cách viết test một exception, timeout.
Một số API của JUnit – Assert, Assume, Test Runner
Trong bài này, chúng ta sẽ cùng tìm hiểu một số API của JUnit như Assert, Test Runner (JUnitCore), Test Suite, Assume.
- JUnit Assert Class : JUnit cung cấp các phương thức static để kiểm tra các điều kiện nhất định thông qua lớp Assert. Các phương thức này thường bắt đầu với assertXxx(). Nó cho phép chúng ta xác định thông báo lỗi (error message), kết quả mong đợi (expected) và kết quả thực tế (actual). Các phương thức Assert so sánh giá trị thực tế được trả về bởi một phương thức test với giá trị mong đợi, nó ném một AssertionException nếu so sánh thất bại.
- JUnit Assume Class: Annotation @Ingore cho phép chúng ta sử dụng để đánh dấu phương thức này để được bỏ qua (ignore/ disable), không cần thực thi test. Một cách khác để làm việc này là sử dụng Assume.assumeXxx() để định nghĩa điều kiện Test.
- Assume.assumeFalse() : đánh dấu test là không hợp lệ, nếu điều kiện của nó đánh giá là đúng.
- Assume.assumeTrue() : đánh giá test là không hợp lệ nếu điều kiện của nó đánh giá là sai.
- JUnit Test Runner : bình thường, các IDE như NetBeans, Eclipse đều có sẵn trình chạy (runner) cho JUnit để hiển thị kết quả các test case. Chúng ta có thể gọi một API được hỗ trợ từ JUnit để thực thi các class test một cách thủ công thông qua JUnitCore.
Làm thế nào để thực thi một nhóm các class test trong JUnit?
Thông thường một class test sẽ sử dụng để test cho một chức năng, một unit. Nếu chúng ta có một vài test class, và mong muốn có thể kết hợp chúng thành một nhóm/ bộ kiểm tra. Chúng ta có thể làm được điều này bằng cách sử dụng Test Suite hoặc Categories Test.
JUnit – Parameterized Test
Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách tạo và thực hiện các test case với tham số hóa trong Junit (parameterized test).
Đơn giản hóa Unit Test với JUnit Rule
Rule (quy tắc) trong JUnit 4 là một thành phần cho phép chúng ta viết code để thực hiện một số công việc trước và sau khi phương thức test thực thi. Trong bài này, chúng ta sẽ cùng tìm hiểu một số Rule có sẵn trong JUnit 4 (TemporaryFolder Rule, TemporaryFolder Rule, …) và cách tự viết một custom rule.
JUnit – Hamcrest Matchers
Trong bài này, chúng ta sẽ cùng tìm hiểu Matcher là gì, cách cài đặt và sử dụng thư viện Hamcrest Matchers để verify các Collections, Number, XML, bean, number, text, object, …
JUnit – Custom Hamcrest Matchers
Tiếp tục với thư viện Hamcrest Matchers, trong bài này chúng ta sẽ cùng tìm hiểu cách tự viết một Matcher cho riêng mình.
Làm thế nào để chạy lại một failed Test trong JUnit?
Đôi khi chúng ta gặp một số vấn đề ngoài ý muốn khi thực thi Unit test như lỗi kết nối internet, kết nối database, thiếu tài nguyên, … dẫn đến test case của chúng ta bị fail. Trong những trường hợp đó, chúng ta mong muốn có thể thực thi lại các test case một cách tự động. Nhưng bằng cách nào chúng ta có thể làm được điều này với JUnit? Chúng sẽ được giải đáp trong bài viết này.
Làm thế nào để lắng nghe các sự kiện mỗi khi một test được thực thi trong JUnit?
Trong bài này chúng ta sẽ cùng tìm hiểu về JUnit Listener và cách để lắng nghe các sự kiện mỗi khi một test được thực thi trong JUnit.
JUnit – HTML Report với Surefire maven plugin
Sau khi viết test và thực thi, chúng ta cũng cần xuất kết quả ra một file nào đó để dễ dàng theo dõi và báo cáo với xếp, với khách hàng. Chúng ta có thể thực hiện một cách tự động thông qua Surefire maven plugin, đây là một plugin của maven cho phép xuất báo cáo (report) kết quả test ra tập tin HTML.
Giới thiệu Mockito
Trong nhiều trường hợp, phương thức cần test của chúng ta gọi đến nhiều phương thức, service khác mà các phương thức này chưa được cài đặt (implement) hoặc tốn nhiều chi phí để thực thi test nhiều lần. Để đảm bảo unit test không phụ thuộc vào nhau, mỗi unit test độc lập được thực thi đúng, chúng ta phải giả định rằng các phương thức được gọi đến đang xử lý đúng. Mockito giúp ta giả lập kết quả của các phương thức liên quan để tập trung viết test cho phương thức hiện tại.
Trong bài viết này, chúng ta sẽ nắm được:
- Mokito là gì?
- Phân loại Mock/ Test Double
- Cài đặt Mockito
- Sử dụng Mockito với JUnit Test
Mockito – Annotations
Trong bài viết này chúng ta sẽ cùng tìm hiểu một số Annotation của Mockito như @Mock, @Spy, @Captor, @InjectMocks để viết test cho các behavior.
- @Mock : Annotation @Mock được sử dụng để khởi tạo một mock object và inject giá trị này cho field này. Chúng ta không tạo ra các đối tượng thực sự, thay vào đó yêu cầu Mockito tạo ra một đối tượng giả cho class này, các phương thức của class này không được thực thi thực sự, do đó trạng thái của đối tượng không bị thay đổi.
- @Spy : Annotation @Spy được sử dụng để wrap một object thật, có thể gọi xử lý thật sự ở object này, tuy nhiên chúng ta có thể spy một số phương thức trên đối tượng thật như với @Mock.
- @InjectMocks :
- Trong một số trường hợp, chúng ta cần tạo một object test mà object này chứa các dependency khác. Vì vậy, chúng ta cần phải tạo các Mock/ Spy object cho các dependency và inject chúng vào đối tượng test. Để làm được điều này, chúng ta có thể sử dụng Annotation
- @InjectMocks. @InjectMocks được sử dụng ở mức field, để đánh dấu các field này cần inject các dependency. Mokito cố gắng inject các giá trị cho các field này thông qua constructor, setter hoặc property injection. Nó sẽ không throw bất kỳ lỗi nào nếu không tìm được injection phù hợp.
Mockito – Control mock’s behavior
Toàn bộ ý tưởng của việc tạo một mock object là có thể kiểm soát behavior của nó. Nếu một phương thức của mock được gọi, nó sẽ xử lý theo cách mà chúng ta có thể điều khiển được. Trong bài viết này, chúng ta sẽ cùng tìm hiểu các cách để điều khiển behavior của một đối tượng giả (mock object).
Một số kiến thức các bạn sẽ nhận được trong bài viết này:
- Stubbing Methods sử dụng cấu trúc: when().thenXxx().
- Stubbing Methods sử dụng cấu trúc: doXxx().when().
- Argument matchers.
Mockito – Verifying Behavior
Khi viết Unit Test, chúng ta cần thực hiện một số Assert để xác nhận expected result và actual result là như nhau. Đối với các mock object, chúng ta cũng cần verify một vài behavior đã được gọi hay chưa. Trong Mockito, chúng ta có thể thực hiện verify các mock object thông qua phương thức Mockito.verfify().
Sau bài viết này các bạn sẽ biết được cách:
- Verify số lần phương thức được gọi.
- Verify các tham số (argument) của phương thức.
- Verify thứ tự phương thức được gọi.
- Verify thời gian thực thi (timeout).
Giới thiệu Powermock
PowerMock là một Java mock framework được sử dụng để giải quyết các vấn đề mà thường được coi là khó khăn hoặc thậm chí không thể viết Unit Test, chẳng hạn như static method, static class, final class, private method, contructor.
Trong bài viết này, chúng ta sẽ tìm hiểu về cách cài đặt và sử dụng PowerMockito để test một số trường hợp thường gây khó khăn trên.
PowerMockito – Suppressing Unwanted Behavior
Trong bài viết này chúng ta sẽ cùng tìm hiểu cách sử dụng PowerMockito để viết test cho một số trường hợp đặc biệt như các static initializer, constructor, method, … gọi đến các 3rd party hay nó chưa được implement.
- Suppress own constructor – Tạo instance một class mà không gọi constructor của chính nó
- Suppress super class constructor – Tạo instance của một class nhưng không gọi constructor của super class
- Suppress method – Ngăn thực thi một phương thức
- Suppress fields – Ngăn khởi tạo giá trị mặc định cho một field
- Suppress static initializer – Ngăn khởi tạo giá trị cho static method, static block
Làm sao test một Abstract Class trong Java?
Trong Java, các abstract class được sử dụng để định nghĩa các behavior có thể có của một class, với một danh sách các phương thức trừu tượng (abstract method) sẽ được implement bởi sub-class. Về cơ bản, nó cũng có thể bao gồm một vài phương thức đã được implement logic, do đó nó cũng cần được cover bởi Unit Test. Tuy nhiên, một abstract class không thể được khởi tạo instance một cách trực tiếp thông qua từ khóa new. Do đó, nó cũng cần một số cách đặt biệt để viết test, chúng ta sẽ cùng tìm hiểu trong bài viết này.
Một số trường hợp thường gặp:
- Trường hợp test một abstract method độc lập.
- Trường hợp test một abstract method được gọi bởi một method khác.
Test Web service
Làm thế nào để Test Jersey Rest API với JUnit?
Bất kỳ ứng dụng nào cũng vậy, sau khi code xong thì chúng ta cần phải test để đảm bảo chương trình của chúng ta hoạt động đúng. Chúng ta có thể sử dụng các tool để test SOAP WS sử dụng SOAP UI tool hay test REST WS sử dụng SOAP UI, Postman. Sử dụng tool bên ngoài để test API cũng là một giải pháp tốt. Đối với developer, chúng ta có thể viết code Unit Test để test API một cách tự động và dễ dàng.
Trong bài này tôi sẽ hướng dẫn các bạn cách viết Unit Test để test Jersey REST API sử dụng Jersey Test. Sau bài này các bạn sẽ nắm được:
- Test REST API cần test những gì?
- Cách viết test REST API sử dụng Jersey Test.
Test REST Web Service đơn giản hơn với REST Assured
Ở bài viết trên, tôi đã giới thiệu với các bạn cách test REST API trong Jersey project. Giả sử bây giờ chúng ta cần sử dụng API của bên thứ 3 (không phải source code trong jersey project của chúng ta), khi đó ta không thể sử dụng Jersey Test. Khi đó, chúng ta cần một thư viện khác có thể giúp chúng ta gửi một request thật để verfiy kết quả trả về.
Trong bài này tôi sẽ giới thiệu với các bạn một thư viện rất mạnh mẽ để test web service, đó chính là REST Assured. Nó cho phép chúng ta gửi một HTTP request thật và verify trên kết quả trả về một cách dễ dàng.
Giới thiệu Castle Mock – Mock REST APIs và SOAP web-services
Trong quá trình phát triển hệ thống hoặc quá trình testing, một trong những vấn đề khó khăn là khi hệ thống của bạn cần tích hợp với một bên thứ ba (3rd party). Do sử dụng API của bên thứ ba nên chúng ta có thể gặp một số vấn đề sau:
- Bên thứ ba không có hoặc không cung cấp hệ thống test cho chúng ta.
- Bên thứ 3 đang phát triển API song song với chúng ta hoặc chưa hoàn thành API cho chúng ta sử dụng.
- Không thể gọi API thật để test: gặp vấn đề về chi phí và bảo mật.
- Gọi service của bên thứ ba để viết Unit Test rất chậm và đôi khi service của họ die dẫn đến Unit Test của chúng ta failed không mong muốn.
Để giải quyết vấn đề này, mình cần thu thập API document của họ, và dựng nên con mock service, trả về đúng những trường hợp cần sử dụng trong requirement API document và để team tích hợp.
Trong bài viết này mình sẽ giới thiệu về 1 Mock service rất dễ sử dụng là Castle Mock.
Sau bài này các bạn sẽ nắm được:
- Castle Mock là gì?
- Một số tính năng nỗi bật của Castle Mock.
- Cách cài đặt Castle Mock.
- Cách sử dụng Castle Mock để tạo mock serivces cho REST và SOAP project.