2012-11-27 38 views
9

Tôi muốn các Bài kiểm tra JUnit4 của mình được thực hiện theo chú thích tùy chỉnh mà tôi đã tạo bằng Java. Mục đích của chú thích tùy chỉnh này là dành cho JUnit4 để lưu ý rằng thử nghiệm chỉ nên chạy nếu nền tảng của máy khớp với nền tảng được chỉ định trong chú thích.JUnit4 bỏ qua (các) bài kiểm tra theo chú thích java tùy chỉnh

Nói rằng tôi có chú thích như sau:

public @interface Annotations { 
    String OS(); 
    ... 
} 

Và Các xét nghiệm sau:

public class myTests{ 

    @BeforeClass 
    public setUp() { ... } 

    @Annotations(OS="mac") 
    @Test 
    public myTest1() { ... } 

    @Annotations(OS="windows") 
    @Test 
    public myTest2() { ... } 

    @Annotation(OS="unix") 
    @Test 
    public myTest3() { ... } 

} 

Nếu tôi là để thực hiện những thử nghiệm trong một máy Mac, sau đó chỉ myTest1() nên được thực thi và phần còn lại phải được bỏ qua. Tuy nhiên, tôi hiện đang bị mắc kẹt về cách tôi nên thực hiện điều này. Làm cách nào để cho phép JUnit đọc chú thích tùy chỉnh của tôi và kiểm tra xem thử nghiệm có nên chạy hay không.

+2

bạn có thể không sử dụng [Học Nghệ Thuật] (https://github.com/KentBeck/junit/wiki/Categories)? – assylias

Trả lời

11

Bạn có thể sử dụng danh mục hoặc bạn có thể triển khai trình chạy JUnit tùy chỉnh của riêng bạn. Việc mở rộng Á hậu JUnit mặc định là khá đơn giản và cho phép bạn xác định danh sách các thử nghiệm sẽ được chạy theo bất kỳ cách nào bạn muốn. Điều này bao gồm chỉ tìm kiếm những phương pháp thử nghiệm có chú thích cụ thể. Tôi bao gồm các mẫu mã dưới đây, bạn có thể sử dụng chúng như một cơ sở cho việc thực hiện của riêng bạn:

chú giải:

@Retention(RetentionPolicy.RUNTIME) 
public @interface MyCustomAnnotation { 
    String OS(); 
} 

Tuỳ chỉnh Runner Class:

public class MyCustomTestRunner extends BlockJUnit4ClassRunner { 

    public MyCustomTestRunner(final Class<?> klass) throws InitializationError { 
     super(klass); 
    } 

    @Override 
    protected List<FrameworkMethod> computeTestMethods() { 
     // First, get the base list of tests 
     final List<FrameworkMethod> allMethods = getTestClass() 
      .getAnnotatedMethods(Test.class); 
     if (allMethods == null || allMethods.size() == 0) 
     return allMethods; 

     // Filter the list down 
     final List<FrameworkMethod> filteredMethods = new ArrayList<FrameworkMethod>(
      allMethods.size()); 
     for (final FrameworkMethod method : allMethods) { 
     final MyCustomAnnotation customAnnotation = method 
       .getAnnotation(MyCustomAnnotation.class); 
     if (customAnnotation != null) { 
      // Add to accepted test methods, if matching criteria met 
      // For example `if(currentOs.equals(customAnnotation.OS()))` 
      filteredMethods.add(method); 
     } else { 
      // If test method doesnt have the custom annotation, either add it to 
      // the accepted methods, or not, depending on what the 'default' behavior 
      // should be 
      filteredMethods.add(method); 
     } 
     } 

     return filteredMethods; 
    } 
} 

mẫu thử nghiệm Lớp học:

@RunWith(MyCustomTestRunner.class) 
public class MyCustomTest { 
    public MyCustomTest() { 
     super(); 
    } 

    @Test 
    @MyCustomAnnotation(OS = "Mac") 
    public void testCustomViaAnnotation() { 
     return; 
    } 
} 
+0

Tôi sẽ đăng một câu trả lời với người chạy tùy chỉnh, nhưng nhìn như bạn đã đề cập đến nó, nếu tôi mở rộng câu trả lời của bạn thay vào đó? – Perception

+0

@Perception: Hãy làm như vậy, tôi muốn có cái nhìn sâu sắc hơn về điều này. – user1754960

+0

@ AlexR: Không chắc chắn ý của bạn là gì theo 'danh mục', bạn có thể vui lòng cung cấp thêm một số chi tiết về điều này không. Xin lỗi, vẫn là một newbie với JUnit và Java. Cảm ơn bạn đã nâng cao! – user1754960

4

Cách tốt nhất tôi nhận thấy chính xác hành vi này và có chúng như là kiểm tra nhận thức trong báo cáo là sử dụng nhân vật của bạn (như trong câu trả lời của AlexR) nhưng ghi đè phương thức runChild. nhưng được xử lý như một sự bỏ qua và không bị loại trừ hoàn toàn.

Các chú thích được sử dụng

@Retention(RetentionPolicy.RUNTIME) 
public @interface TargetOS { 
    String family(); 

    String name() default ""; 

    String arch() default ""; 

    String version() default ""; 
} 

Á hậu JUnit

public class OSSensitiveRunner extends BlockJUnit4ClassRunner { 
    public OSSensitiveRunner(Class<?> klass) throws InitializationError { 
     super(klass); 
    } 

    @Override 
    protected void runChild(final FrameworkMethod method, RunNotifier notifier) { 
     Description description = describeChild(method); 
     if (method.getAnnotation(Ignore.class) != null) { 
      notifier.fireTestIgnored(description); 
     } else if (method.getAnnotation(TargetOS.class) != null) { 
      final TargetOS tos = method.getAnnotation(TargetOS.class); 
      String name = tos.name().equals("") ? null : tos.name(); 
      String arch = tos.arch().equals("") ? null : tos.arch(); 
      String version = tos.version().equals("") ? null : tos.version(); 
      if (OS.isOs(tos.family(), name, arch, version)) { 
       runLeaf(methodBlock(method), description, notifier); 
      } else { 
       notifier.fireTestIgnored(description); 
      } 
     } else { 
      runLeaf(methodBlock(method), description, notifier); 
     } 
    } 
} 

Cách sử dụng trong một thử nghiệm

@RunWith(OSSensitiveRunner.class) 
public class SeleniumDownloadHelperTest { 
... 

Và hạn chế một phương pháp cụ thể

@Test 
@TargetOS(family = "windows") 
public void testGetFileFromUrlInternetExplorer() throws Exception { 
    ... 
} 
1

Tùy chọn tốt nhất mà tôi đã tìm thấy cho đến nay là qua JUnit Rule. Có một số link to GitHub với sẵn sàng để sử dụng tệp

0

Đây chính xác là những loại JUnit (xem này short introduction) được tạo cho.

Sau khi bạn đánh dấu tất cả các bài kiểm tra với danh mục thích hợp (sử dụng @Category), bạn có thể tạo các bộ chạy tất cả các bài kiểm tra nhưng các bài kiểm tra sai hoặc tất cả các bài kiểm tra có đúng danh mục.(sử dụng @IncludeCategory và @ExcludeCategory, bạn có thể kết hợp chúng để thu hẹp lựa chọn của bạn)

Danh mục có thể được sử dụng ở cấp Suite, Lớp thử nghiệm và thậm chí là Phương pháp thử nghiệm.

Dưới đây là thêm thông tin liên quan đến JUnit Categories

Các vấn đề liên quan