0

这是一个单元测试类:

MyUnitTestSetup myUnitTestSetup ;

public void setUp(String myParam){
  myUnitTestSetup = new MyUnitTestSetup(myParam);
}

@Test
public void test1(){
  setUp("value1");
  //do some stuff with myParam = "value1";
}

@Test
public void test2(){
  setUp("value2");
  //do some stuff with myParam = "value2";
}

我想用“value1”执行test1,用“value2”执行test2。参数化单元测试不方便,因为它们会为“value1”和“value2”执行 test1,为“value1”和“value2”执行 test2,这不是我想要的。

我虽然关于:

  • 每次进行测试时调用 setup 方法。
  • 使用@Rule 注释:

    static String myParam;
    MyUnitTestSetup myUnitTestSetup ;
    
    @Before
    public void setUp(){
      myUnitTestSetup = new MyUnitTestSetup(myParam);
    }
    
    @Rule
    public TestRule rule = new TestRule() {     
        @Override
        public Statement apply(final Statement base, final Description desc) {
            return new Statement() {
                @Override
                public void evaluate() throws Throwable {
                    if(desc.getMethodName().equals("test1"))
                        myParam = "value1";
                    ...
                }
            };
        }
    }
    
    @Test
    public void test1(){
      //do some stuff with myParam = "value1";
    }
    
    @Test
    public void test2(){
      //do some stuff with myParam = "value2";
    }
    

但我想知道是否有更清洁和更智能的方式来做到这一点。我会想到类似的东西:

MyUnitTestSetup myUnitTestSetup ;

@Before
public void setUp(String myParam){
  myUnitTestSetup = new MyUnitTestSetup(myParam);
}

@Test(myParam="value1")
public void test1(){
  //do some stuff with myParam = "value1";
}

@Test(myParam="value2")
public void test2(){
  //do some stuff with myParam = "value2";
}

任何想法 ?

4

3 回答 3

3

我在这里错过了什么吗?为什么不将其设置为测试调用中的第一件事或调用设置内容的方法。

@Test
public void test1(){
  myParam = "value1"; //set the value?
  ...
}

@Test
public void test2(){
  setupMyParam("value2"); // or this?
  ...
}
于 2012-08-16T19:01:06.120 回答
0

不确定使用TestNG是否适合您,但如果可以,TestNG 允许您 1)直接将参数传递给测试方法,以及 2)为每个类定义任意数量的数据提供者。例如:

@DataProvider
public Object[][] dp1() {
    return new Object[][] {
        new Object[] { "value1"};
    }
}

@Test(dataProvider = "dp1")
public void test1(String value) {
    // will receive "value1"
}

@DataProvider
public Object[][] dp2() {
    return new Object[][] {
        new Object[] { "value2"};
    }
}

@Test(dataProvider = "dp2")
public void test2(String value) {
    // will receive "value2"
}
于 2012-08-17T20:07:38.607 回答
0

看看JUnitParams库。有了它,您可以:

@Test
@Parameters({ new MyUnitTestSetup("value1") })
public void test1(MyUnitTestSetup myUnitTestSetup1) {
  // do some stuff with myUnitTestSetup1
}

@Test
@Parameters({ new MyUnitTestSetup("value2") })
public void test2(MyUnitTestSetup myUnitTestSetup2) {
  // do some stuff with myUnitTestSetup2
}
于 2014-07-08T22:42:22.080 回答