Cách viết unit test java

     

JUnit là một trong framework đơn giản dễ dàng dùng cho việc tạo những unit testing trường đoản cú động, cùng chạy những test hoàn toàn có thể lặp đi lặp lại. Nó chỉ là một trong những phần của họ phong cách thiết kế xUnit cho bài toán tạo những unit testing. JUnit là một chuẩn chỉnh trên thực tiễn cho unit testing vào Java. JUnit về xuất phát được viết vì 2 tác giả Erich Gamma cùng Kent Beck.

Bạn đang xem: Cách viết unit test java

Vào giữa những năm 90 của cố kỉnh kỷ 20 , Kent Beck đã cách tân và phát triển một bộ test xUnit thứ nhất cho Smalltalk .

Beck và Gamma cải tiến và phát triển JUnit trên một chuyến bay từ Zurich đến Washington, DC.Từ kia Junit trở thành công xuất sắc cụ chuẩn chỉnh cho Test-Driven Development trong Java.Ngày nay , jUnit được tích hợp sẵn trong các Java IDEs (Eclipse, BlueJ, Jbuilder, DrJava).

JUnit có thể được cài đặt xuống từ bỏ địa chỉ http://www.junit.org.

2.Những điểm sáng đáng lưu ý của JUnit

• xác thực (assert) việc kiểm tra hiệu quả được mong mỏi đợi

• những Test Suite đến phép họ dễ dàng tổ chức triển khai và chạy những test

• cung ứng giao diện hình ảnh và hình ảnh dòng lệnh:Các demo case của JUnit là các lớp của Java, các lớp này gồm 1 hay nhiều các phương thức unit testing, và gần như test đó lại được đội thành các Test Suite.Mỗi phương thức test trong JUnit phải được thực hiện nhanh chóng. Vận tốc là điều tối đặc biệt quan trọng vì càng nhiều test được viết cùng tích hợp vào bên trong quá trình phát hành phần mềm, rất cần được tốn nhiều thời gian hơn cho việc chạy toàn bộ Test Suite. Những lập trình viên không thích bị xa vắng trong một khoãng thời gian dài trong khi những test chạy, vì thế các kiểm tra mà chạy càng thọ thì sẽ có rất nhiều khả năng là các lập trình viên sẽ làm lơ bước cũng không hề kém phần quan trọng này.Các demo trong JUnit có thể là những test được đồng ý hay thất bại, các test này được thiết kế với để lúc chạy mà không cần phải có sự can thiệp của nhỏ người. Từ bỏ những kiến thiết như thế, chúng ta có thể thêm những bộ thử nghiệm vào quá trình tích hợp cùng xây dựng phần mềm một cách liên tiếp và làm cho các thử nghiệm chạy một bí quyết tự động

3.Kiến trúc tổng quan

*

JUnit test framework cung cấp cho bọn họ các gói lớp bao gồm sẵn cho phép chúng ta viết những phương thức demo một bí quyết dễ dàng.TestRunner đã chạy các test cùng trả về kết quả là những Test Results.Các lớp của lịch trình test chúng ta sẽ được kế thừa những lớp trừu tượng TestCase.Khi viết các Test Case bọn họ cần biết cùng hiểu lớp Assert class.Một số định nghĩa trong quy mô tổng quát:Test case : kiểm tra case định nghĩa môi trường thiên nhiên mà nó có thể sử dụng nhằm chạy nhiều test khác nhauTestSuite : testsuite là chạy một tập những test case cùng nó cũng có thể bao gồm nhiều test suite khác, chạy thử suite đó là tổ hợp các test.

4.Tại sao phải khởi tạo 1 kiểm tra suit?

5.Cách viết một thử nghiệm case.

Bạn ý muốn viết các unit chạy thử với JUnit. Việc trước tiên bạn phải tạo một lớp nhỏ thừa kế trường đoản cú lớp junit.framework.TestCase. Mỗi unit kiểm tra được đại diện thay mặt bởi một phương thức testXXX() bên trong lớp nhỏ của lớp TestCase.Ta gồm một lớp Person như sau:

public class Person private String firstName; private String lastName; public Person(String firstName, String lastName) if (firstName == null && lastName == null) throw new IllegalArgumentException("Both names cannot be null"); this.firstName = firstName; this.lastName = lastName; public String getFullName() String first = (this.firstName != null) ? this.firstName : "?"; String last = (this.lastName != null) ? this.lastName : "?"; return first + last; public String getFirstName() return this.firstName; public String getLastName() return this.lastName; kế tiếp ta đang viết một chạy thử case dễ dàng và đơn giản để test một số phương thức của lớp trên

import junit.framework.TestCase; public class TestPerson extends TestCase public TestPerson(String name) super(name); /** * Xac nhan rang name duoc the hien dung dinh dang */ public void testGetFullName() Person p = new Person("Aidan", "Burke"); assertEquals("Aidan Burke", p.getFullName()); /** * Xac nhan rang nulls da duoc xu ly chinh xac */ public void testNullsInName() Person phường = new Person(null, "Burke"); assertEquals("? Burke", p.getFullName()); phường = new Person("Tanner", null); assertEquals("Tanner ?", p.getFullName()); Lưu ý: mỗi unit test là 1 trong những phương thức public và không có tham số, được ban đầu bằng tiếp đầu ngữ test. Nếu như bạn không tuân thủ theo đúng quy tắc đánh tên này thì JUnit sẽ không xác định được những phương thức demo một các tự động.

Để biên dịch TestPerson, bọn họ phải khai báo gói tủ sách junit trong thay đổi đường môi trường classpath:

set classpath=%classpath%;.;junit.jar javac TestPersonĐể chạy một JUnit TestCase, ta bao gồm 2 cách

Chạy với môi trường text, các bạn gõ lệnh:

java junit.textui.TestRunner TestPersonChạy với môi trường đồ họa java junit.swingui.TestRunner TestPersonChúng ta có thể chạy trực tiếp các TestCase mà không muốn kích hoạt một trong những test runner của JUnit. Bọn họ sẽ thêm phương thức main() vào demo case. Ví dụ:

public class TestGame extends TestCase … public static void main(String 6.Các cách tiến hành Assert()

Các phương thức assertXXX() được dùng để làm kiểm tra các điều kiện khác nhau.junit.framework.TestCase, lớp phụ vương cho tất cả các kiểm tra case, thừa kế từ bỏ lớp junit.framework.Assert. Lớp này định nghĩa tương đối nhiều các phương thức assertXXX(). Các thủ tục test hoạt động bằng cách gọi những phương thức này.

Sau đó là mô tả các phương thức assertXXX() không giống nhau có vào lớp junit.framework.Assert.

assertEquals(): So sánh 2 giá trị để kiểm tra bởi nhau. Test sẽ được đồng ý nếu những giá trị bởi nhau.assertFalse(): Đánh giá chỉ biểu thức luận lý. Thử nghiệm sẽ được chấp nhận nếu biểu thức sai.assertNotNull(): So sánh tham chiếu của một đối tượng người tiêu dùng với null. Thử nghiệm sẽ được chấp nhận nếu tham chiếu đối tượng người dùng khác null.assertNotSame(): So sánh địa chỉ vùng ghi nhớ của 2 tham chiếu đối tượng bằng cách sử dụng toán tử ==. Chạy thử sẽ được chấp nhận nếu cả hai đều tham chiếu cho các đối tượng người dùng khác nhauassertNull(): So sánh tham chiếu của một đối tượng người tiêu dùng với giá trị null. Kiểm tra sẽ được đồng ý nếu tham chiếu là null.assertSame(): So sánh địa chỉ cửa hàng vùng ghi nhớ của 2 tham chiếu đối tượng bằng phương pháp sử dụng toán tử ==. Demo sẽ được đồng ý nếu cả 2 đều tham chiếu đến cùng một đối tượng.assertTrue(): Đánh giá bán một biểu thức luận lý. Kiểm tra sẽ được gật đầu nếu biểu thức đúng fail(): Phương thức này tạo nên test hiện nay hành thất bại, cách thức này hay được sử dụng khi xử lý những biệt lệ.

Mặc dù bạn có thể chỉ cần áp dụng phương thức assertTrue() cho sát như số đông các test, mặc dù thì việc sử dụng một trong những phương thức assertXXX() cụ thể vẫn làm cho những test của người tiêu dùng dễ hiểu hơn và cung cấp các thông điệp thất bại cụ thể hơn.

Tất cả những phương thức của bảng trên đa số nhận vào một String không phải làm tham số đầu tiên. Khi được xác định, tham số này hỗ trợ một thông điệp biểu thị test thất bại.

Xem thêm: Cách Viết Đơn Xin Lắp Điện 3 Pha Cho Gia Đình, Cách Viết Đơn Xin Lắp Điện 3 Pha

Ví dụ:

assertEquals(employeeA, employeeB); assertEquals(“Employees should be equal after the clone() operation.”, employeeA, employeeB).Phiên bạn dạng thứ 2 được thương yêu hơn bởi nó tế bào tả nguyên nhân test thất bại, điều này sẽ giúp cho bài toán sửa lỗi được dễ dãi hơn.

Thế nào là một unit kiểm tra tốt?

Mỗi unit test chỉ nên kiểm tra phần rõ ràng của một chức năng nào đó. Chúng ta không nên phối hợp nhiều thử nghiệm không tương quan với nhau lại vào trong một phương thức testXXX().

Ta gồm một lớp Game như sau:

public class game private maps ships = new HashMap(); public Game() throws BadGameException public void shutdown() // dummy method public synchronized Ship createFighter(String fighterId) Ship s = (Ship) this.ships.get(fighterId); if (s == null) s = new Ship(fighterId); this.ships.put(fighterId, s); return s; public boolean isPlaying() return false; public class BadGameException extends Exception public BadGameException(String s) super(s); sau đó ta viết một đoạn thử nghiệm sau đây:

public void testGame() throws BadGameException trò chơi game = new Game(); Ship fighter = game.createFighter(“001”); assertEquals("Fighter did not have the correct identifier", "001", this.fighter.getId()); Ship fighter2 = this.game.createFighter("001"); assertSame("createFighter with same id should return same object", fighter, fighter2); assertTrue("A new trò chơi should not be started yet", !this.game.isPlaying()); Đây là một kiến thiết không xuất sắc vì từng phương thức assertXXX() đang chất vấn phần không liên quan của chức năng. Trường hợp phương thức assertEquals() thất bại, phần sót lại của test sẽ không được thi hành. Khi xảy ra điều này thì bọn họ sẽ không biết những test khác tất cả đúng chức năng hay không?

Tiếp theo chúng ta sẽ sửa kiểm tra trên lại nhằm kiểm tra những khía cạnh khác biệt của trò đùa một phương pháp độc lập.

public void testCreateFighter() System.out.println("Begin testCreateFigher()"); assertEquals("Fighter did not have the correct identifier", "001", this.fighter.getId()); System.out.println("End testCreateFighter()"); public void testSameFighters() System.out.println("Begin testSameFighters()"); Ship fighter2 = this.game.createFighter("001"); assertSame("createFighter with same id should return same object", this.fighter, fighter2); System.out.println("End testSameFighters()"); public void testGameInitialState() System.out.println("Begin testGameInitialState()"); assertTrue("A new game should not be started yet", !this.game.isPlaying()); System.out.println("End testGameInitialState()"); Với giải pháp tiếp cận này, lúc một test thất bại sẽ không còn làm cho các mệnh đề assertXXX() còn lại bị vứt qua.

Có thể các bạn sẽ đặt ra câu hỏi có khi nào một cách tiến hành test chứa được nhiều hơn một các phương thứcassertXXX() hay không? Câu vấn đáp là có. Nếu khách hàng cần đánh giá một dãy những điều khiếu nại và các test theo sau sẽ luôn thất bại nếu bao gồm một test trước tiên thất bại, khi đó chúng ta cũng có thể kết hợp những phương thức assert vào vào một test.

7.Set Up với Tear Down

Hai phương thức setUp() và tearDown() là một phần của lớp junit.framework.TestCase Bằng biện pháp sử dụng những phương thức setUp và tearDown. Khi sử dụng 2 phương thức setUp() và tearDown() sẽ giúp chúng ta tránh được việc trùng mã khi nhiều test cùng chia sẻ nhau tại đoạn khởi sinh sản và dọn dẹp các biến.

JUnit tuân thủ theo một dãy có thứ tự các sự kiện khi chạy các test. Đầu tiên, nó tạo ra một thể hiện mới của chạy thử case ứng với mỗi thủ tục test. Tự đó, nếu như bạn có 5 cách làm test thì JUnit sẽ tạo nên 5 bộc lộ của thử nghiệm case. Vì tại sao đó, các biến biểu đạt không thể được sử dụng để chia sẻ trạng thái giữa những phương thức test. Sau khoản thời gian tạo ngừng tất cả các đối tượng test case, JUnit tuân theo công việc sau cho mỗi phương thức test:

Gọi cách làm setUp() của chạy thử caseGọi cách tiến hành testGọi thủ tục tearDown() của kiểm tra case

Quá trình này được lặp lại so với mỗi phương thức test trong thử nghiệm case.

Sau đây chúng ta sẽ coi xét ví dụ:

public class Ship private String id; public Ship(String id) this.id = id; public String getId() return this.id; public class TestGame extends TestCase private game game; private Ship fighter; public void setUp() throws BadGameException this.game = new Game(); this.fighter = this.game.createFighter("001"); public void tearDown() this.game.shutdown(); public void testCreateFighter() System.out.println("Begin testCreateFigher()"); assertEquals("Fighter did not have the correct identifier""001", this.fighter.getId()); System.out.println("End testCreateFighter()"); public void testSameFighters() System.out.println("Begin testSameFighters()"); Ship fighter2 = this.game.createFighter("001"); assertSame("createFighter with same id should return same object",this.fighter, fighter2); System.out.println("End testSameFighters()"); public void testGameInitialState() System.out.println("Begin testGameInitialState()"); assertTrue("A new game should not be started yet",!this.game.isPlaying()); System.out.println("End testGameInitialState()"); Thông thường bạn cũng có thể bỏ qua phương thức tearDown() vì mỗi unit test riêng không phải là những quá trình chạy tốn nhiều thời gian, cùng các đối tượng người dùng được thu dọn khi JVM thoát. tearDown() có thể được thực hiện khi test của người tiêu dùng thực hiện nay những làm việc như mở liên kết đến đại lý dữ liệu thường được sử dụng các loại tài nguyên không giống của hệ thống và bạn cần phải dọn dẹp ngay lập tức lập tức. Nếu như khách hàng chạy một bộ bao gồm 1 số lượng lớn các unit test, thì khi bạn trỏ tham chiếu của các đối tượng đến null bên phía trong thân phương thức tearDown() sẽ hỗ trợ cho bộ dọn rác đem lại bộ lưu trữ khi những test khác chạy.

Đôi khi bạn có nhu cầu chạy vài đoạn mã khởi chế tác chỉ một lần, kế tiếp chạy những phương thức test, và chúng ta chỉ ao ước chạy những đoạn mã dọn dẹp chỉ với sau khi tất cả test kết thúc. Ở phần trên, JUnit gọi phương thứcsetUp() trước mỗi kiểm tra và gọi tearDown() sau lúc mỗi test kết thúc, chính vì như vậy để làm cho được điều như trên, chúng ta sẽ thực hiện lớp junit.extension.TestSetup để đạt được yêu ước trên.

Ví dụ sau đã minh họa việc sử dụng lớp trên:

import junit.extensions.TestSetup; import junit.framework.*; public class TestPerson extends TestCase { public TestPerson(String name) super(name); public void testGetFullName() Person phường = new Person("Aidan", "Burke"); assertEquals("Aidan Burke", p.getFullName()); public void testNullsInName() Person phường = new Person(null, "Burke"); assertEquals("? Burke", p.getFullName()); p = new Person("Tanner", null); assertEquals("Tanner ?", p.getFullName()); public static kiểm tra suite() { TestSetup cài đặt = new TestSetup(new TestSuite(TestPerson.class)) protected void setUp() throws Exception //Thực hiện các đoạn mã khởi sản xuất một lần ở đây protected void tearDown() throws Exception //Thực hiện những đoạn mã lau chùi ở trên đây return setup; TestSetup là một tờ thừa kế từ lớp junit.extension.TestDecorator, Lớp TestDecorator là lớp đại lý cho bài toán định nghĩa các test vươn lên là thể. Nguyên nhân chính nhằm mở rộng TestDecorator là để sở hữu được năng lực thực thi đoạn mã trước và sau khi một test chạy. Các phương thức setUp() và tearDown() của lớp TestSetupđược hotline trước và sau khi bất kỳ Test nào được truyền vào constructor,

Trong lấy một ví dụ trên chúng ta đã truyền một tham số tất cả kiểu TestSuite vào constructor của lớp TestSetup

TestSetup thiết lập = new TestSetup(new TestSuite(TestPerson.class)) Điều này có nghĩa là 2 cách tiến hành setUp() được hotline chỉ một lượt trước cục bộ bộ test và tearDown() được call chỉ một lần sau khi các thử nghiệm trong cỗ test kết thúc.

Chú ý: những phương thức setUp() và tearDown() bên trong lớp TestPerson vẫn được thực thi trước cùng sau mỗi cách tiến hành test bên phía trong lớp TestPerson.

8.Tổng kết.

Trên trên đây là bài viết về tổng quan sử dụng JUnit để cung ứng Testing vào Java, hy vọng bài viết hữu ích cho quá trình của các bạn.Thanks!