Làm thế nào để viết một bài kiểm tra đơn vị?


135

Tôi có một lớp Java. Làm thế nào tôi có thể đơn vị kiểm tra nó?


Trong trường hợp của tôi, tôi có lớp thực hiện một tổng nhị phân. Phải mất hai byte[]mảng, tính tổng chúng và trả về một mảng nhị phân mới.


7
Bạn có thể sử dụng một công cụ như jUnit và viết các trường hợp thử nghiệm (phương thức thử nghiệm) cho lớp java của bạn. Sau đó gọi các bài kiểm tra jUnit như một phần của quá trình xây dựng (ant / maven). Sử dụng jUnit không khó chút nào, phần khó khăn sẽ xuất hiện với nhiều kịch bản thử nghiệm mà bạn có thể nghĩ ra để bạn bắt lỗi sớm và thường xuyên.
CoolBeans

Câu trả lời:


132
  1. Xác định đầu ra mong muốn và mong muốn cho một trường hợp bình thường, với đầu vào chính xác.

  2. Bây giờ, hãy thực hiện kiểm tra bằng cách khai báo một lớp, đặt tên cho nó là bất cứ thứ gì (Thông thường là một cái gì đó như TestAddingModule) và thêm phương thức testAdd vào nó (ví dụ như cách bên dưới):

    • Viết một phương thức và ở trên nó thêm chú thích @Test.
    • Trong phương thức, chạy tổng nhị phân của bạn và assertEquals(expectedVal,calculatedVal).
    • Kiểm tra phương thức của bạn bằng cách chạy nó (trong Eclipse, nhấp chuột phải, chọn Run as → JUnit test).

      //for normal addition 
      @Test
      public void testAdd1Plus1() 
      {
          int x  = 1 ; int y = 1;
          assertEquals(2, myClass.add(x,y));
      }
      
  3. Thêm các trường hợp khác như mong muốn.

    • Kiểm tra rằng tổng nhị phân của bạn không ném ngoại lệ không mong muốn nếu có tràn số nguyên.
    • Kiểm tra xem phương thức của bạn xử lý các đầu vào Null một cách duyên dáng (ví dụ bên dưới).

      //if you are using 0 as default for null, make sure your class works in that case.
      @Test
      public void testAdd1Plus1() 
      {
          int y = 1;
          assertEquals(0, myClass.add(null,y));
      }
      

1. là ký hiệu @Test cần thiết? 2. tại sao không kiểm tra đầu vào null với assertNotNull? 3. kết quả của các bài kiểm tra đơn vị được chụp ở đâu? làm thế nào là kết quả chỉ ra cho người dùng?
dùng137717

10
Có, @Testký hiệu là bắt buộc. Điều này được thực hiện để báo hiệu cho người chạy thử nghiệm đơn vị rằng phương thức này đại diện cho thử nghiệm đơn vị và nên được thực hiện. Các phương thức không được chú thích @Testsẽ không được người chạy thử thực hiện.
Ali Shah Ahmed

cho bài kiểm tra thứ hai - không nên thêm một nullđể ychỉ cung cấp cho bạn y?
Điều chỉnh

Cảm ơn! Tôi muốn biết tại sao không cần phải thêm staticvào công cụ sửa đổi phương thức thử nghiệm.
Liang Zhang

103

Tôi cung cấp bài đăng này cho cả IntelliJEclipse .

Nhật thực:

Để thực hiện kiểm tra đơn vị cho dự án của bạn, vui lòng làm theo các bước sau (Tôi đang sử dụng Eclipse để viết thử nghiệm này):

1- Nhấp vào Mới -> Dự án Java.

Tạo dự án

2- Viết tên dự án của bạn và bấm vào kết thúc.

Tạo dự án

3- Nhấp chuột phải vào dự án của bạn. Sau đó, nhấp vào Mới -> Lớp.

Tạo lớp

4- Viết tên lớp của bạn và bấm vào kết thúc.

Tạo lớp

Sau đó, hoàn thành lớp học như thế này:

public class Math {
    int a, b;
    Math(int a, int b) {
        this.a = a;
        this.b = b;
    }
    public int add() {
        return a + b;
    }
}

5- Nhấp vào Tệp -> Mới -> Trường hợp kiểm tra JUnit.

Tạo bài kiểm tra JUnite

6- Kiểm tra setUp () và nhấp vào kết thúc. SetUp () sẽ là nơi bạn khởi tạo bài kiểm tra của mình.

Kiểm tra SetUp ()

7- Nhấp vào OK.

Thêm JUnit

8- Ở đây, tôi chỉ cần thêm 7 và 10. Vì vậy, tôi mong đợi câu trả lời là 17. Hoàn thành lớp kiểm tra của bạn như thế này:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class MathTest {
    Math math;
    @Before
    public void setUp() throws Exception {
        math = new Math(7, 10);
    }
    @Test
    public void testAdd() {
        Assert.assertEquals(17, math.add());
    }
}

9- Viết nhấp vào lớp kiểm tra của bạn trong gói thám hiểm và nhấp vào Chạy dưới dạng -> JUnit Test.

Chạy thử nghiệm JUnit

10- Đây là kết quả của bài kiểm tra.

Kết quả của bài kiểm tra

IntelliJ: Lưu ý rằng tôi đã sử dụng cộng đồng IntelliJ IDEA 2020.1 cho các ảnh chụp màn hình. Ngoài ra, bạn cần thiết lập jre của bạn trước các bước này. Tôi đang sử dụng JDK 11.0.4.

1- Nhấp chuột phải vào thư mục chính của dự án của bạn-> mới ->. Bạn nên gọi đây là 'thử nghiệm'. nhập mô tả hình ảnh ở đây 2- Nhấp chuột phải vào thư mục kiểm tra và tạo gói phù hợp. Tôi đề nghị tạo các tên đóng gói giống như lớp ban đầu. Sau đó, bạn nhấp chuột phải vào thư mục kiểm tra -> đánh dấu thư mục là -> kiểm tra nguồn gốc. nhập mô tả hình ảnh ở đây 3- Trong gói bên phải trong thư mục thử nghiệm, bạn cần tạo một lớp Java (tôi đề nghị sử dụng Test.java). nhập mô tả hình ảnh ở đây 4- Trong lớp đã tạo, nhập '@Test'. Sau đó, trong số các tùy chọn mà IntelliJ cung cấp cho bạn, hãy chọn Thêm 'JUnitx' vào đường dẫn lớp. 5- Viết phương pháp kiểm tra của bạn trong lớp kiểm tra của bạn. Chữ ký phương thức giống như:nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

@Test
public void test<name of original method>(){
...
}

Bạn có thể thực hiện các xác nhận của mình như dưới đây:

Assertions.assertTrue(f.flipEquiv(node1_1, node2_1));

Đây là những hàng nhập khẩu mà tôi đã thêm:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

nhập mô tả hình ảnh ở đây

Đây là bài kiểm tra mà tôi đã viết: nhập mô tả hình ảnh ở đây

Bạn có thể kiểm tra các phương pháp của bạn như dưới đây:

Assertions.assertEquals(<Expected>,<actual>);
Assertions.assertTrue(<actual>);
...

Để chạy thử nghiệm đơn vị của bạn, nhấp chuột phải vào thử nghiệm và nhấp vào Chạy. nhập mô tả hình ảnh ở đây

Nếu bài kiểm tra của bạn vượt qua, kết quả sẽ như dưới đây: nhập mô tả hình ảnh ở đây

Tôi hy vọng nó sẽ giúp. Bạn có thể thấy cấu trúc của dự án trong GitHub https://github.com/m-vahidalizadeh/probols_solve_project .


12
Yêu câu trả lời của bạn, đó là "cách thực hiện" tốt nhất!
alisa

4
Tôi vui vì câu trả lời của tôi rất hữu ích. Cảm ơn bình luận của bạn.
Mohammad

1
Đây là những gì hướng dẫn nên như thế nào; sạch sẽ, súc tích, đầy đủ ví dụ. Rất tốt.
Jack Of Blades

1
Cảm ơn bạn rất nhiều Jack. Tôi vui vì bạn thấy nó hữu ích.
Mohammad

18

Đây là một câu hỏi rất chung chung và có rất nhiều cách nó có thể được trả lời.

Nếu bạn muốn sử dụng JUnit để tạo các bài kiểm tra, bạn cần tạo lớp testcase của mình, sau đó tạo các phương thức kiểm tra riêng để kiểm tra chức năng cụ thể của lớp / mô-đun của bạn trong các bài kiểm tra (các lớp testcase đơn thường được liên kết với một lớp "sản xuất" duy nhất đang được thử nghiệm) và bên trong các phương thức này thực hiện các hoạt động khác nhau và so sánh kết quả với những gì sẽ chính xác. Điều đặc biệt quan trọng là phải cố gắng và bao gồm càng nhiều trường hợp góc càng tốt.

Trong ví dụ cụ thể của bạn, ví dụ bạn có thể kiểm tra các mục sau:

  1. Một bổ sung đơn giản giữa hai số dương. Thêm chúng, sau đó xác minh kết quả là những gì bạn mong đợi.
  2. Một phép cộng giữa số dương và số âm (trả về kết quả có dấu của đối số thứ nhất).
  3. Một phép cộng giữa số dương và số âm (trả về kết quả có dấu của đối số thứ hai).
  4. Một phép cộng giữa hai số âm.
  5. Một bổ sung dẫn đến tràn.

Để xác minh kết quả, bạn có thể sử dụng các phương thức assertXXX khác nhau từ lớp org.junit.Assert (để thuận tiện, bạn có thể thực hiện 'nhập tĩnh org.junit.Assert. *'). Các phương pháp này kiểm tra một điều kiện cụ thể và không kiểm tra nếu nó không xác thực (với một thông báo cụ thể, tùy chọn).

Ví dụ lớp testcase trong trường hợp của bạn (không có nội dung phương thức được xác định):

import static org.junit.Assert.*;

public class AdditionTests {
    @Test
    public void testSimpleAddition() { ... }


    @Test
    public void testPositiveNegativeAddition() { ... }


    @Test
    public void testNegativePositiveAddition() { ... }


    @Test
    public void testNegativeAddition() { ... }


    @Test
    public void testOverflow() { ... }
}

Nếu bạn không quen viết bài kiểm tra đơn vị mà thay vào đó hãy kiểm tra mã của mình bằng cách viết bài kiểm tra đặc biệt mà sau đó bạn xác thực "trực quan" (ví dụ: bạn viết một phương thức chính đơn giản chấp nhận các đối số được nhập bằng bàn phím và sau đó in ra kết quả - và sau đó bạn tiếp tục nhập các giá trị và tự xác thực nếu kết quả là chính xác), sau đó bạn có thể bắt đầu bằng cách viết các thử nghiệm như vậy ở định dạng trên và xác thực kết quả bằng phương pháp assertXXX chính xác thay vì thực hiện thủ công. Bằng cách này, bạn có thể chạy lại bài kiểm tra dễ dàng hơn sau đó nếu bạn phải làm bài kiểm tra thủ công.



6

Các câu trả lời khác đã chỉ cho bạn cách sử dụng JUnit để thiết lập các lớp kiểm tra. JUnit không phải là khung thử nghiệm Java duy nhất. Tập trung vào các chi tiết kỹ thuật của việc sử dụng một khung tuy nhiên làm mất đi các khái niệm quan trọng nhất sẽ hướng dẫn hành động của bạn, vì vậy tôi sẽ nói về những điều đó.

  • Kiểm tra (tất cả các loại của tất cả các loại) so sánh hành vi thực tế của một cái gì đó (Hệ thống đang thử nghiệm, SUT) với hành vi dự kiến của nó .

  • Kiểm tra tự động có thể được thực hiện bằng một chương trình máy tính. Bởi vì sự so sánh đó đang được thực hiện bởi một chương trình máy tính không linh hoạt và không thông minh, nên hành vi dự kiến ​​phải được biết chính xác và rõ ràng.

  • Những gì một chương trình hoặc một phần của một chương trình (một lớp hoặc phương thức) dự kiến ​​sẽ làm là đặc điểm kỹ thuật của nó . Do đó, phần mềm kiểm tra yêu cầu bạn phải có thông số kỹ thuật cho SUT. Đây có thể là một mô tả rõ ràng hoặc một đặc điểm kỹ thuật ngầm trong đầu của bạn về những gì được mong đợi.

  • Do đó, kiểm thử đơn vị tự động đòi hỏi một đặc tả chính xác và rõ ràng của lớp hoặc phương thức bạn đang kiểm tra.

  • Nhưng bạn cần đặc tả đó khi bạn bắt đầu viết mã đó. Vì vậy, một phần của những gì kiểm tra thực sự bắt đầu trước khi bạn viết ngay cả một dòng của SUT. Kỹ thuật thử nghiệm của Phát triển hướng thử nghiệm (TDD) đưa ý tưởng đó đến mức cực đoan và bạn đã tạo mã thử nghiệm đơn vị trước khi bạn viết mã cần thử nghiệm.

  • Các khung kiểm tra đơn vị kiểm tra SUT của bạn bằng các xác nhận . Khẳng định là một biểu thức logic (một biểu thức có booleanloại kết quả; một vị ngữ ) phải là truenếu SUT hoạt động chính xác. Do đó, đặc điểm kỹ thuật phải được thể hiện (hoặc thể hiện lại) như các xác nhận.

  • Một kỹ thuật hữu ích để thể hiện một đặc tả như các xác nhận là lập trình bằng hợp đồng . Các thông số kỹ thuật là về mặt hậu điều kiện . Một postcondition là một khẳng định về trạng thái hiển thị công khai của SUT sau khi trả về từ một phương thức hoặc một hàm tạo. Một số phương thức có hậu điều kiện là bất biến , là các vị từ đúng trước và sau khi thực hiện phương thức. Một lớp cũng có thể được gọi là có bất biến, đó là các điều kiện hậu của mọi hàm tạo và phương thức của lớp, và do đó phải luôn luôn đúng. Postconditions (Và bất biến) chỉ được thể hiện dưới dạng trạng thái hiển thị công khai: publicprotectedcác trường, các giá trị được trả về bởi trả vềpublicprotectedcác phương thức (chẳng hạn như getters) và trạng thái hiển thị công khai của các đối tượng được truyền (bằng tham chiếu) cho các phương thức.


Nhiều người mới bắt đầu đăng câu hỏi ở đây hỏi làm thế nào họ có thể kiểm tra một số mã, trình bày mã nhưng không nêu rõ đặc tả cho mã đó. Như cuộc thảo luận này cho thấy, không ai có thể đưa ra một câu trả lời hay cho câu hỏi như vậy, bởi vì ở những người trả lời tiềm năng tốt nhất phải đoán đặc tả và có thể làm sai. Người hỏi của câu hỏi rõ ràng không hiểu tầm quan trọng của một đặc điểm kỹ thuật, và do đó, một người mới cần hiểu các nguyên tắc cơ bản mà tôi đã mô tả ở đây trước khi thử viết một số mã kiểm tra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.