我想编写一个以多种方式执行安装程序的测试,但期望它们生成相同的输出。基本上就像
@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()
这可能吗?
答案 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);
}
}