2011-06-22 40 views
6

Tôi muốn viết một bài kiểm tra thực hiện Thiết lập theo nhiều cách nhưng mong đợi chúng tạo ra cùng một đầu ra. Về cơ bản thíchJunit nhiều thiết lập và thử nghiệm duy nhất

@Before 
public void setUp1(){ 
    obj.addDataThisWay(data); 
} 

@Before 
public void setUp2(){ 
    obj.addDataThatWay(data); 
} 

@Test 
public void testResult(){ 
    assertEquals(obj.getResult(),1); 
} 

tôi muốn nó trở thành bài kiểm tra để chạy hai lần, một cho setUp1()->testResult(), một trong những khác cho setUp2()->testResult() Là có thể?

+0

Trong testng bạn có thể sử dụng các chú thích @DataProvider và đã thiết lập được thực hiện theo cách đó, đi qua trong hai trường hợp khác nhau của obj . Nhưng tôi không biết tương đương với junit là gì. – sblundy

Trả lời

6

Không phải với kiến ​​thức của tôi. Bạn phải biến điều này thành hai bài kiểm tra riêng biệt (và trích xuất các xác nhận theo phương thức chung, riêng tư, không phải @Test nếu bạn muốn), hoặc bạn có thể sử dụng parameterized tests.

+0

Tôi đã kết thúc với các bài kiểm tra được tối ưu hóa. Cảm ơn bạn –

4
public void testWithSetup1() { 
    callSetup1Here(); 
    ..... 
} 

public void testWithSetup2() { 
    callSetup2Here(); 
    ..... 
} 

Tôi không nghĩ có cách nào khác để làm những gì bạn đang yêu cầu.

2

Tôi chỉ đoán bây giờ, nhưng bạn không thể sử dụng thừa kế? tạo một lớp trừu tượng với phương thức testResult() và các lớp cụ thể của bạn với mỗi phương thức setUp()?

+0

Rất thông minh! Tôi chỉ làm một bài kiểm tra đơn giản và có vẻ như điều này thực sự hiệu quả. – MatrixFrog

1

Với TestNG, bạn sẽ sử dụng nhóm cho việc này:

@BeforeMethod(groups = "g1") 
public void setUp1(){ 
    obj.addDataThisWay(data); 
} 

@BeforeMethod(groups = "g2") 
public void setUp2(){ 
    obj.addDataThatWay(data); 
} 

@Test(groups = { "g1", "g2" }) 
public void testResult(){ 
    assertEquals(obj.getResult(),1); 
} 

Nếu bạn hỏi TestNG để chạy các nhóm "g1", nó sẽ chạy Setup1() -> testResult. Nếu bạn chạy nhóm "g2", nó sẽ chạy setUp2() -> testResult.

Ngoài ra, như các commenter nói ở trên, bạn có thể sử dụng các nhà cung cấp dữ liệu để truyền các thông số khác nhau để thử nghiệm phương pháp của bạn:

//This method will provide data to any test method that declares that its Data Provider 
//is named "test1" 
@DataProvider(name = "test1") 
public Object[][] createData1() { 
return new Object[][] { 
    { "Cedric", new Integer(36) }, 
    { "Anne", new Integer(37)}, 
}; 
} 

//This test method declares that its data should be supplied by the Data Provider 
//named "test1" 
@Test(dataProvider = "test1") 
public void verifyData1(String n1, Integer n2) { 
System.out.println(n1 + " " + n2); 
} 
0

JUnit Parameterized có thể làm các trick.

Sửa đổi mã trong câu hỏi ban đầu sử dụng tham số nên trông giống như sau:

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.Parameterized; 
import org.junit.runners.Parameterized.Parameters; 

import java.util.Arrays; 
import java.util.Collection; 

@RunWith(Parameterized.class) 
public class MyTest { 

    private Object obj; 

    public MyTest(boolean addDataThisWay) { 
     if (addDataThisWay) 
      obj.addDataThisWay(data); 
     else 
      obj.addDataThatWay(data); 
    } 

    @Parameters 
    public static Collection<Object[]> differentTestSettings() { 
     return Arrays.asList(new Object[][]{ 
      {true}, 
      {false} 
     }); 
    }  

    @Before 
    public void setUp(){ 
     // any additional setup required 
    } 

    @Test 
    public void testResult(){ 
     assertEquals(obj.getResult(),1); 
    } 
} 
Các vấn đề liên quan