Junit多重设置和单一测试

时间:2011-06-22 15:46:22

标签: java junit

我想编写一个以多种方式执行安装程序的测试,但期望它们生成相同的输出。基本上就像

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

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

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

我希望测试能够运行两次,一次用于setUp1()->testResult(),另一次用于setUp2()->testResult()这可能吗?

5 个答案:

答案 0 :(得分:7)

据我所知。您必须将其转换为两个单独的测试(并根据需要将断言提取为公共,私有,非@Test方法),或者您可以使用parameterized tests

答案 1 :(得分:4)

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

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

我认为没有其他方法可以做你要求的事。

答案 2 :(得分:3)

我现在只是猜测,但你不能使用继承吗?使用testResult()方法创建一个抽象类,并使用每个setUp()方法创建具体类?

答案 3 :(得分:1)

使用TestNG,您可以使用群组:

@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);
}

如果您要求TestNG运行组“g1”,它将运行setUp1() - >测试结果。如果你运行组“g2”,它将运行setUp2() - > TestResult中。

此外,与上述评论者一样,您可以使用数据提供程序将不同的参数传递给您的测试方法:

//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);
}

答案 4 :(得分:0)

JUnit Parameterized可以解决问题。

使用Parameterized修改原始问题中的代码应如下所示:

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);
    }
}