2015-09-25 12 views
13

Tôi sử dụng @Parameterized trong nhiều trường hợp để chạy thử nghiệm trên một số hoán vị. Điều này hoạt động rất tốt và giữ cho mã kiểm thử trở nên đơn giản và rõ ràng.Khi sử dụng JUnits @Parameterized, tôi có thể có một số thử nghiệm vẫn chỉ chạy một lần

Tuy nhiên đôi khi tôi muốn có một số phương pháp thử nghiệm vẫn chỉ chạy một lần khi chúng không sử dụng các tham số, có cách nào đó với JUnit đánh dấu phương pháp thử là "singleton" hay "chạy -Một lần"?

Lưu ý: Đây không quan tâm chạy thử nghiệm duy nhất trong Eclipse, tôi biết làm thế nào để làm điều đó :)

+3

Có vẻ như những thử nghiệm đó không nên nằm trong cùng một bộ với các thử nghiệm được tham số hóa. – Makoto

+2

vâng, đó là giải pháp duy nhất xuất hiện trong tâm trí của tôi, nhưng tôi thực sự muốn thử nghiệm "có liên quan" trong một bộ, ví dụ: tất cả các bài kiểm tra cho một lớp trong một bài kiểm tra ... – centic

Trả lời

8

Bạn có thể kết hợp bất kỳ số lượng các lớp học thử nghiệm để chạy cùng sử dụng một bộ. Bằng cách này tất cả các bài kiểm tra được chạy khi bạn kiểm tra lớp của bạn và bạn có thể kết hợp các trình chạy thử khác nhau.

  1. Tạo một bộ kiểm tra kết hợp với lớp bạn đang thử nghiệm
  2. Thêm một tham chiếu đến lớp kiểm tra tham số
  3. Thêm lớp khác (es) có chứa các xét nghiệm phi tham số.

    import org.junit.runners.Suite; 
    import org.junit.runner.RunWith; 
    
    @RunWith(Suite.class) 
    @Suite.SuiteClasses({ParameterizedTestClass.class, UnitTests.class, MoreUnitTests.class}) 
    public class SutTestSuite{ 
        //Empty... 
    } 
    
+1

Vâng, đó là điều tôi sẽ kết thúc, tôi hy vọng sẽ có một cái gì đó giống như chú thích cho các phương pháp thử nghiệm đơn lẻ ... – centic

1

có một số plugin junit mà cung cấp cho bạn một số tính năng hơn/điện về kiểm tra tham số. kiểm tra zohhak, junit-parames và junit-dataprovider. chúng cho phép bạn kết hợp các thử nghiệm junit parametrized và đơn giản

+0

Cảm ơn các đề xuất, những giao diện này hấp dẫn! – centic

24

Bạn có thể cấu trúc thử nghiệm của mình với Enclosed runner.

@RunWith(Enclosed.class) 
public class TestClass { 

    @RunWith(Parameterized.class) 
    public static class TheParameterizedPart { 

     @Parameters 
     public static Object[][] data() { 
      ... 
     } 

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

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

    public static class NotParameterizedPart { 
     @Test 
     public void someTest() { 
      ... 
     } 
    } 
} 
0

Trước khi tôi biết cách tiếp cận "@WunWith (Enclosed.class)", với các lớp bên trong mở rộng lớp ngoài. Tôi tiếp tục sử dụng cấu trúc này bởi vì tôi thích rằng các bài kiểm tra ở cùng một nơi và chia sẻ một số thuộc tính và phương pháp và mọi thứ dường như rõ ràng hơn với tôi. Sau đó, bằng cách sử dụng Eclipse, trong cấu hình chạy của tôi, tôi chọn tùy chọn đó "Chạy tất cả các kiểm tra trong dự án, gói hoặc thư mục nguồn đã chọn" và tất cả các kiểm tra này sẽ được thực hiện chỉ với một cú nhấp chuột.

public class TestBooksDAO { 

    private static BooksDAO dao; 

    @Parameter(0) 
    public String title; 
    @Parameter(1) 
    public String author; 

    @Before 
    public void init() { 
     dao = BooksDAO.getInstancia(); 
    } 

    /** Tests that run only once. */ 
    public static class SingleTests extends TestBooksDAO { 

     @Test(timeout=10000) 
     public void testGetAll() { 
      List<Book> books = dao.getBooks(); 
      assertNotNull(books); 
      assertTrue(books.size()>0); 
     } 

     @Test(timeout=10000) 
     public void testGetNone() { 
      List<Book> books = dao.getBooks(null); 
      assertNull(books); 
     } 
    } 

    /** Tests that run for each set of parameters. */ 
    @RunWith(Parameterized.class) 
    public static class ParameterizedTests1 extends TestBooksDAO { 

     @Parameters(name = "{index}: author=\"{2}\"; title=\"{0}\";") 
     public static Collection<Object[]> values() { 
      return Arrays.asList(new Object[][] { 
       {"title1", ""}, 
       {"title2", ""}, 
       {"title3", ""}, 
       {"title4", "author1"}, 
       {"title5", "author2"}, 
      }); 
     } 

     @Test(timeout=10000) 
     public void testGetOneBook() { 
      Book book = dao.getBook(author, title); 
      assertNotNull(book); 
     } 
    } 

    /** Other parameters for different tests. */ 
    @RunWith(Parameterized.class) 
    public static class ParameterizedTests2 extends TestBooksDAO { 

     @Parameters(name = "{index}: author=\"{2}\";") 
     public static Collection<Object[]> values() { 
      return Arrays.asList(new Object[][] { 
       {"", "author1"}, 
       {"", "author2"}, 
       {"", "author3"}, 
      }); 
     } 

     @Test(timeout=10000) 
     public void testGetBookList() { 
      List<Book> books = dao.getBookByAuthor(author); 
      assertNotNull(books); 
      assertTrue(books.size()>0); 
     } 
    } 
} 
Các vấn đề liên quan