2009-07-01 32 views
9

Tôi muốn thực hiện một số thao tác ghi nhật ký trong khi thực hiện kiểm tra JUnit. Trong JUnit 3.x nó là luôn luôn dễ dàng để có được tên của trường hợp thử nghiệm hiện đang chạy, bất kể có bao trường hợp thử nghiệm đã được khởi tạo:Cách lấy tên trường hợp thử nghiệm trong JUnit 4 khi chạy?

public void testFoo() throws Exception() { 
    String testName = this.getName(); 
    // [...] do some stuff 
} 

trong JUnit 4 điều dường như không dễ dàng như vậy. Có ai biết một giải pháp cho điều này? Có tùy chọn nào để phản ánh vào phiên bản Runner hiện tại không?

+3

vẻ tương tự như: http://stackoverflow.com/questions/473401/get-name-of-currently-executing-test-in-junit-4 –

Trả lời

5

OK. Tôi đã tìm thấy cách tiếp cận khác [nơi nào đó trên Internet] (http://www.nabble.com/What-happened-to-getName()--td23456371.html):.

@RunWith(Interceptors.class) 
    public class NameTest { 
      @Interceptor public TestName name = new TestName(); 

      @Test public void funnyName() { 
        assertEquals("funnyName", name.getMethodName()); 
      } 
    } 
+0

Điều đó có vẻ chính xác theo hướng tôi đang tìm kiếm. Tôi sẽ thử vào ngày mai. – mkoeller

+0

Thật không may, giải pháp này chỉ được phát hành trong phiên bản cuối cùng sắp tới của JUnit 4.7. Trong khi đó tôi buộc phải gắn bó với một phiên bản trước đó được bao gồm trong kiến ​​trúc khung của khách hàng. Tuy nhiên, đây là câu trả lời hay nhất cho câu hỏi. – mkoeller

+0

Lớp Interceptors này ở đâu? Tôi không nhìn thấy nó trong 4.11 Javadoc –

0

Có gì sai với:

@Test 
public void foo() throws Exception() { 
    String testName = this.getName(); 
    // [...] do some stuff 
} 

?

+0

Trong JUnit 4 lớp học thử nghiệm không còn kéo dài một lớp khung chung. Vì vậy, không có phương thức thừa kế nào nữa. – mkoeller

+0

OK. Tôi vẫn không nhận được 'this.getName() về cái gì. Nó khác với this.getClass(). GetName() như thế nào? (Tôi đã tìm thấy một câu trả lời khác cho bạn) –

+1

Trong JUnit 3, TestCase.getName() trả về tên của phương pháp thử nghiệm. Khi bạn chạy một trường hợp thử nghiệm JUnit3, nhiều phiên bản của lớp thử nghiệm của bạn được tạo ra, mỗi trường hợp có một tên khác nhau. Xem http://junit.sourceforge.net/doc/cookstour/cookstour.htm – NamshubWriter

10

Trong JUnit 4.7, bạn cũng có thể lấy tên của phương pháp thest hiện thực có thể được tốt đẹp khi đăng nhập

Taken. từ JUnit 4.7 Release Notes (đọc chúng here at github):

public class NameRuleTest { 
    @Rule public TestName name = new TestName(); 

    @Test public void testA() { 
     assertEquals("testA", name.getMethodName()); 
    } 

    @Test public void testB() { 
     assertEquals("testB", name.getMethodName()); 
    } 
} 
4
public class FooTest { 
    @Rule 
    final public TestRule traceTestWatcher = new TestWatcher() { 
     @Override 
     protected void starting(Description d) { 
      System.out.println(d); 
     } 
    }; 

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

    @Test 
    public void testBaz() { 
     ... 
    } 
} 
0

tôi biết điều này là cũ, nhưng đây là một phương pháp hữu ích (không junit) mà tôi đặt ở đầu tất cả các bài kiểm tra của tôi.

public static void printTestName(){ 
    final StackTraceElement[] ste = new Throwable().getStackTrace(); 
    int buffer = 35 - ste[1].getMethodName().length(); 
    System.out.println("*******************************************************"); 
    System.out.println("*   TEST: " + ste[1].getMethodName() + getBuffer(buffer) + "*"); 
    System.out.println("*******************************************************"); 
} 

private static String getBuffer(int offset){ 
    StringBuilder buffer = new StringBuilder(""); 
    for(int i = 1; i < offset; i++){ 
     buffer.append(" "); 
    } 
    return buffer.toString(); 
} 
Các vấn đề liên quan