JavaRush /Blog Java /Random-VI /JUnit cho JavaRush hoặc một chút về thử nghiệm tại nhà.
Sdu
Mức độ

JUnit cho JavaRush hoặc một chút về thử nghiệm tại nhà.

Xuất bản trong nhóm
Bạn cảm thấy mệt mỏi khi phải nhập dữ liệu kiểm tra vào bảng điều khiển hàng chục lần để kiểm tra nhiệm vụ của mình? Chào mừng bạn đến với con mèo, tôi sẽ cho bạn biết bạn có thể làm gì với nó. Mục tiêu cuối cùng của tài liệu này sẽ là tự động hóa việc khởi chạy nhiệm vụ đang được giải quyết với nhiều tham số khác nhau và kiểm tra kết quả mà không cần thay đổi mã nguồn của nó. Như bạn có thể đã hiểu từ tiêu đề, trợ lý chính của chúng tôi trong vấn đề khá đơn giản này sẽ là JUnit . Nếu bạn chưa nghe nói về thử nghiệm đơn vịthử nghiệm đơn vị , tôi khuyên bạn nên nghỉ ngơi một chút và làm quen với những khái niệm này, may mắn thay có đủ thông tin trên Internet. Không, bạn không muốn? Được rồi, tôi nghĩ điều này sẽ không trở thành vấn đề lớn để hiểu chuyện gì đang xảy ra. Rốt cuộc, bạn có biết bài kiểm tra và bài kiểm tra nói chung là gì không? Bạn làm điều này mỗi khi bạn khởi động nhiệm vụ của mình, nhập dữ liệu ban đầu và so sánh kết quả thu được với những gì bạn mong đợi thấy.
Xin chào, JUnit thế giới !
JUnit là gì? Trên trang web chính thức của dự án , chúng ta có thể đọc mô tả sau:
JUnit là một framework đơn giản để viết các bài kiểm tra lặp lại. Nó là một phiên bản của kiến ​​trúc xUnit dành cho các khung kiểm thử đơn vị.
Đối với chúng tôi, điều này có nghĩa là khả năng viết các lớp được thiết kế đặc biệt có phương thức sẽ tương tác với chương trình của chúng tôi, so sánh kết quả thu được với kết quả tham chiếu và thông báo cho chúng tôi nếu chúng không khớp. Để hiểu nguyên tắc, hãy xem xét một ví dụ đơn giản. Giả sử chúng ta có một lớp phụ trợ, một trong các phương thức của nó lấy hai biến kiểu int và trả về tổng của chúng: JUnit cho JavaRush hoặc một chút về thử nghiệm tại nhà.  - 1 Đây là chức năng mà chúng ta sẽ thử kiểm tra. May mắn thay, IDEA yêu thích của chúng tôi đã có mọi thứ bạn cần để nhanh chóng tạo các bài kiểm tra, tất cả những gì chúng tôi cần là đặt con trỏ vào dòng khai báo lớp, nhấn "Alt + Enter" và chọn "Tạo bài kiểm tra" trong menu ngữ cảnh: JUnit cho JavaRush hoặc một chút về thử nghiệm tại nhà.  - 2 Sau khi bạn chỉ định vị trí bạn nên tạo một bài kiểm tra, IDEA khuyên bạn nên chọn thư viện kiểm tra (trong tài liệu này tôi sử dụng JUnit4; để các lớp thư viện được kết nối với dự án, bạn cần nhấp vào nút “Fix”), các phương thức cần kiểm tra và bổ sung tùy chọn. JUnit cho JavaRush hoặc một chút về thử nghiệm tại nhà.  - 3 IDE sẽ tạo một mẫu lớp thử nghiệm: ClassName = TestClassName + "Test" MethodName = "test" + TestMethodName JUnit cho JavaRush hoặc một chút về thử nghiệm tại nhà.  - 4 Chúng ta chỉ cần điền vào phần thân phương thức. Cái gọi là “Xác nhận” , các phương thức do JUnit cung cấp , sẽ giúp giải quyết vấn đề này . Nói một cách đơn giản, công việc của họ trông như thế này: kết quả mong đợi và kết quả của việc gọi phương thức đang thử nghiệm được chuyển đến phương thức .assert*, để thuận tiện, bạn có thể thêm thông báo giải thích làm tham số đầu tiên. Nếu các thông số không khớp trong quá trình kiểm tra, bạn sẽ được thông báo về điều này. Bạn có thể khởi chạy một lớp kiểm tra để thực thi giống như một lớp thông thường, tôi thích sử dụng tổ hợp phím Ctrl+Shift+F10 JUnit cho JavaRush hoặc một chút về thử nghiệm tại nhà.  - 5
Hãy xác định nhiệm vụ
Về lý thuyết, mọi thứ đều đơn giản và đẹp mắt, nhưng trong bối cảnh của ví dụ được đề xuất, điều đó không thực sự cần thiết, chúng ta có thể tin tưởng vào máy tính để cộng hai số. Chúng tôi quan tâm nhiều hơn đến việc mọi thứ sẽ diễn ra như thế nào với những vấn đề thực sự được giải quyết bởi các học viên JavaRush, ví dụ: tôi khuyên bạn nên chọn cấp độ yêu thích05.lesson12.bonus03.
/* Bài toán về thuật toán Viết chương trình: 1. nhập số N > 0 từ bàn điều khiển 2. sau đó nhập N số từ bàn điều khiển 3. hiển thị số lớn nhất của N số đã nhập. */
Chúng ta cần viết ba bài kiểm tra, cho số dương, số âm và tập hợp hỗn hợp.
Càng vào sâu trong rừng...
Đây là nơi một số điều bất ngờ đang chờ đợi chúng ta: public class UtilApp { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); //напишите здесь ваш code int n; int maximum; /* Конечно же я не буду размещать решение задачи ;) Код приведенный тут переработан для наглядности, и не в коем случае не означает что он должен присутствовать в "правильном решении" */ System.out.println(maximum); } }
  • Logic chương trình được đặt trong phương thức main()
  • Dữ liệu nguồn không được truyền vào phương thức mà được nhập từ bàn phím.
  • Phương thức main() không trả về kết quả mà xuất kết quả ra bàn điều khiển.
Nếu điểm đầu tiên không có vấn đề gì đặc biệt (chúng ta có thể gọi phương thức main() như bình thường), thì hai điểm tiếp theo buộc chúng ta phải đi sâu hơn vào chủ đề và khiến bộ não phải căng thẳng. Tôi tìm thấy một số giải pháp cho vấn đề:
  1. Chuyển logic để tìm mức tối đa sang một phương pháp riêng.
    • Ưu điểm: Cách tiếp cận đúng về mặt tái cấu trúc
    • Nhược điểm: Chương trình trở nên quá tải với mã, các cấu trúc không cần thiết, ít nhất một mảng hoặc ArrayList được thêm vào (tùy theo sở thích và màu sắc...). Chỉ cơ chế tìm giá trị lớn nhất được kiểm tra; dữ liệu đầu vào và đầu ra không được kiểm tra.
  2. Viết các hàm bao cho System.in/System.out.
    • Ưu điểm: Chúng tôi không sử dụng thư viện của bên thứ ba.
    • Nhược điểm: Con đường không dành cho người mới bắt đầu. Độ phức tạp tương đối của việc triển khai thử nghiệm; số lượng mã trong thử nghiệm có thể lớn hơn trong tác vụ đang được thử nghiệm.
  3. Sử dụng các thư viện bổ sung để kiểm tra.
    • Ưu điểm: Mã sạch trong các bài kiểm tra, viết bài kiểm tra tương đối dễ dàng. Mã nguồn của lớp được kiểm tra không thay đổi.
    • Nhược điểm: Cần kết nối thư viện của bên thứ ba với dự án.
Thành thật mà nói, tôi thích phương án thứ ba nhất, vì vậy hãy thử thực hiện nó.
Quy tắc hệ thống
Một tìm kiếm ngắn đã đưa tôi đến trang http://stefanbirkner.github.io/system-rules/ và ngay lập tức tôi thấy rõ rằng đây chính là thứ tôi cần.
Tập hợp các quy tắc JUnit để kiểm tra mã sử dụng java.lang.System.
Vì vậy, hãy tải xuống thư viện . Tải xuống thư viện Commons IO cần thiết để các quy tắc hệ thống hoạt động . Chúng tôi kết nối cả hai thư viện với dự án của mình (Tệp -> Cấu trúc dự án -> Thư viện -> + -> Java) và bắt đầu điêu khắc: Sau khi khởi chạy, nhiệm vụ của chúng tôi yêu cầu bạn nhập số N+1 từ bảng điều khiển, trong đó số đầu tiên cho bạn biết bao nhiêu con số sẽ theo anh. Trong Quy tắc hệ thống, lớp TextFromStandardInputStream được sử dụng cho các mục đích này. Ban đầu, chúng ta cần thêm một trường loại này vào lớp thử nghiệm của mình và đánh dấu nó bằng chú thích @Rule: @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); Sau đó, trực tiếp trong phương thức thử nghiệm, chúng ta chỉ ra dữ liệu cần thiết: systemInMock.provideText("4\n2\n6\n1\n3\n"); Như bạn có thể thấy, các số được truyền ở dạng văn bản và được phân tách bằng chuỗi dấu gạch nối "\n". Dựa trên điều này, hóa ra N sẽ bằng 4 và chúng ta sẽ tìm giá trị lớn nhất từ ​​các số {2, 6, 1, 3}. Tiếp theo, chúng ta cần tạo một thể hiện của lớp đang được thử nghiệm và gọi phương thức main(). Chương trình của chúng tôi đọc dữ liệu từ systemInMock, xử lý và in kết quả, đồng thời tất cả những gì chúng tôi phải làm là đọc và so sánh với tiêu chuẩn. Để thực hiện điều này, các quy tắc hệ thống cung cấp cho chúng ta lớp StandardOutputStreamLog. Chúng tôi thêm một trường thuộc loại được chỉ định: @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); Bạn có thể đọc dữ liệu được in bằng phương thức .getLog(), trong khi bạn cần tính đến sự hiện diện của các ký tự dòng mới, các tùy chọn cuối cùng có thể như sau: assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); // or assertEquals("{2, 6, 1, 3}, max = 6", "6\r\n", log.getLog()); Giữa các lần kiểm tra, để tránh phân lớp dữ liệu, bạn cần xóa nhật ký log.clear(); Toàn văn bài kiểm tra của tôi: import org.junit.Rule; import org.junit.Test; import org.junit.contrib.java.lang.system.StandardOutputStreamLog; import org.junit.contrib.java.lang.system.TextFromStandardInputStream; import static org.junit.Assert.*; import static org.junit.contrib.java.lang.system.TextFromStandardInputStream.emptyStandardInputStream; public class UtilAppTest { @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); @Test public void testAddition() throws Exception { systemInMock.provideText("4\n2\n6\n1\n3\n"); UtilApp utilApp = new UtilApp(); utilApp.main(new String[]{}); assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); systemInMock.provideText("5\n-100\n-6\n-15\n-183\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{-100, -6, -15, -183, -1}, max = -1", "-1", log.getLog().trim()); systemInMock.provideText("3\n2\n0\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{2, 0, -1}, max = 2", "2", log.getLog().trim()); } } Chúng tôi khởi chạy và tận hưởng. -=!!! QUAN TRỌNG!!!=- Tài liệu này CHỈ được cung cấp cho mục đích thông tin; Tôi không đảm bảo việc thử nghiệm thành công tác vụ trên máy chủ nếu có một lớp không liên quan trong gói có tác vụ. Trước khi gửi tác vụ để xác minh đến máy chủ, hãy xóa mọi thứ không liên quan: các tệp không cần thiết, các lớp không cần thiết, mã nhận xét. Việc hoàn thành thành công các bài kiểm tra bạn đã tạo không đảm bảo hoàn thành thành công các bài kiểm tra trên máy chủ. Tôi cố tình không nhai kỹ tài liệu lý thuyết: lý thuyết kiểm tra đơn vị, chú thích JUnit, khẳng định, v.v., tất cả tài liệu đều nằm trong các liên kết được cung cấp trong văn bản. Có lẽ bạn có cách thử nghiệm nhiệm vụ của riêng mình, tôi sẽ vui lòng thảo luận về chúng với bạn trong phần bình luận.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION