Junit @Rule hoạt động như thế nào?


195

Tôi muốn viết các trường hợp thử nghiệm cho một số lượng lớn mã, tôi muốn biết chi tiết về @Ruletính năng chú thích JUnit , để tôi có thể sử dụng nó để viết các trường hợp thử nghiệm. Vui lòng cung cấp một số câu trả lời hoặc liên kết tốt, cung cấp mô tả chi tiết về chức năng của nó thông qua một ví dụ đơn giản.



Tôi thấy bài viết này giải thích @Rulekhá rõ, đặc biệt là xem phần cuối "Chuỗi sự kiện chi tiết"
Peter Perháč

Tôi nghĩ nó giống với khái niệm tiêm, phải không?
Chao

Cám ơn vì đã chia sẽ liên kết đó. Một điều không rõ ràng. Khi nào Tuyên bố DEFAULT.evalu () được gọi? Nó được gọi trước khi đánh giá () của tất cả các quy tắc hoặc sau tất cả các quy tắc? Tôi đoán sau khi tất cả chúng.
MasterJoe2

@ người kiểm tra2 bạn có thể chọn hoàn toàn bỏ qua Tuyên bố mặc định. Bạn có thể chọn ủy thác cho nó hoặc đơn giản là bạn có thể thay thế nó hoàn toàn bằng một số Tuyên bố khác của riêng bạn. Nó không được gọi , bạn có thể gọi nó hay không. Đó là ở điểm 10: "Phương thức Assessment () của câu lệnh chụp màn hình gọi phương thức Assessment () của câu lệnh mặc định."
Peter Perháč

Câu trả lời:


155

Các quy tắc được sử dụng để thêm chức năng bổ sung áp dụng cho tất cả các thử nghiệm trong một lớp thử nghiệm, nhưng theo cách chung hơn.

Chẳng hạn, ExternalResource thực thi mã trước và sau một phương thức thử nghiệm mà không phải sử dụng @Before@After. Sử dụng một ExternalResourcethay vì @Before@Aftercung cấp cơ hội để tái sử dụng mã tốt hơn; cùng một quy tắc có thể được sử dụng từ hai lớp thử nghiệm khác nhau.

Thiết kế dựa trên: Thiết bị đánh chặn trong JUnit

Để biết thêm thông tin, xem JUnit wiki: Rules .


1
Sửa lỗi: "Chẳng hạn, ExternalResource thực thi mã trước và sau một lớp kiểm tra ." Có điều gì đó về việc sử dụng áp dụng () để có được InternalResource chạy giữa các lần kiểm tra.
derekm

62

Junit Rules hoạt động theo nguyên tắc AOP (lập trình hướng theo khía cạnh). Nó chặn phương thức kiểm tra, do đó cung cấp cơ hội để thực hiện một số nội dung trước hoặc sau khi thực hiện một phương pháp kiểm tra cụ thể.

Lấy ví dụ về đoạn mã dưới đây:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

Mỗi khi phương thức kiểm tra trên được thực thi, một thư mục tạm thời sẽ được tạo và nó sẽ bị xóa sau khi thực hiện phương thức. Đây là một ví dụ về quy tắc vượt trội do Junit cung cấp.

Hành vi tương tự cũng có thể đạt được bằng cách tạo ra các quy tắc riêng của chúng tôi. Junit cung cấp giao diện TestRule, có thể được thực hiện để tạo Quy tắc Junit của riêng chúng tôi.

Đây là một liên kết hữu ích để tham khảo:


4
Vì vậy, nó sẽ bị xóa mà không cần viết bất kỳ mã để xóa / xóa đối tượng?
Dror

hãy xem nguồn của github.com/junit-team/junit4/blob/master/src/main/java/org/ mẹo , thư mục được tạo trong phương thức gọi lại before () và bị xóa trong phương thức gọi lại after (). ..
Pierluigi Vernetto

1
Đối với những người có thể không hiểu tại sao Công cụ tạm thời bị xóa thì đó là vì Công cụ tạm thời do Junit cung cấp để phục vụ như một thư mục tạm thời sẽ tự động bị xóa - tức là bước xé nát là một phần của chính lớp Tạm thời.
Mindaugas Bernatavičius

17

tl; dr về cách thức hoạt động của nó: JUnit kết thúc phương thức thử nghiệm của bạn trong một đối tượng Statement để statement.Execute () chạy thử nghiệm của bạn. Sau đó, thay vì gọi statement.Execute () trực tiếp để chạy thử nghiệm của bạn, JUnit chuyển Tuyên bố đến TestRule với chú thích @Rule. Hàm "áp dụng" của TestRule trả về một Tuyên bố mới được đưa ra Tuyên bố cùng với thử nghiệm của bạn. Phương thức Execute () của Statement mới có thể gọi phương thức thực thi của Statement (hoặc không, hoặc gọi nó là nhiều lần) và làm bất cứ điều gì nó muốn trước và sau. Bây giờ JUnit có một Tuyên bố mới không chỉ chạy thử nghiệm và một lần nữa nó có thể chuyển điều đó sang bất kỳ quy tắc nào trước khi gọi Execute.


2
Báo cáo có phương pháp đánh giá không thực thi.
Hemanth

0

Các quy tắc được sử dụng để tăng cường hành vi của từng phương pháp thử nghiệm một cách chung chung. Quy tắc Junit chặn phương thức kiểm tra và cho phép chúng tôi làm một cái gì đó trước khi phương thức kiểm tra bắt đầu thực thi và sau khi phương thức kiểm tra đã được thực thi.

Ví dụ: Sử dụng quy tắc @Timeout, chúng tôi có thể đặt thời gian chờ cho tất cả các bài kiểm tra.

public class TestApp {
    @Rule
    public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);

    ......
    ......

 }

Quy tắc @T tạm thời được sử dụng để tạo các thư mục, tập tin tạm thời. Mỗi khi phương thức kiểm tra được thực thi, một thư mục tạm thời được tạo và nó sẽ bị xóa sau khi thực hiện phương thức.

public class TempFolderTest {

 @Rule
 public TemporaryFolder tempFolder= new TemporaryFolder();

 @Test
 public void testTempFolder() throws IOException {
  File folder = tempFolder.newFolder("demos");
  File file = tempFolder.newFile("Hello.txt");

  assertEquals(folder.getName(), "demos");
  assertEquals(file.getName(), "Hello.txt");

 }


}

Bạn có thể xem các ví dụ về một số quy tắc được xây dựng được cung cấp bởi Junit tại liên kết này .

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.