JUnitParams - 在测试之前执行单独的方法


@RunWith(JUnitParamsRunner.class)
public class MySimpleTest {
    private MyRec rec;
    private Matrix matrix;
    @Before
    public void createRecognizerBeforeEveryExecution() {
        rec = new MyRec();
        matrix = MatrixUtils.createMatrixWithValues();
    }
    public static Iterable<Object[]> data() {
        return Arrays.asList(
                new Object[]{"expectedvalue1", "input1"},
                new Object[]{"expectedvalue2", "input2"}
        );
    }
    @Test
    @Parameters(method = "data")
    public void test1(String output, String input) {
        rec.fun1(matrix);
        assertEquals(output, rec.someFunction(input));
    }
    public static Iterable<Object[]> data2() {
        return Arrays.asList(
                new Object[]{"expectedothervalue1", "input1"},
                new Object[]{"expectedothervalue2", "input2"}
        );
    }
    @Test
    @Parameters(method = "data2")
    public void test2(String output, String input) {
        rec.fun1(matrix);
        rec.fun2(matrix);
        assertEquals(output, rec.someFunction(input));
    }
}

我试图找出进行此测试的正确方法。我想使用参数化测试,因为它非常方便。

如您所见,在每个测试函数中,我都调用某个函数(fun1fun2 )。但是我只需要在每个测试中调用它一次(例如,在每个参数化测试执行之前)。

有没有办法告诉 JUnitParams 在执行所有参数化测试之前它应该执行其他函数?

我不能使用@Before注释,因为正如您在test1中看到的,我没有使用fun2.它认为它应该由单独的函数执行。

解决方案 1:

由于 fun[1|2] 不依赖于内部测试状态,因此请尝试相应地将它们的调用放在 data 和 data2 方法中。

public static Iterable<Object[]> data() {
        rec.fun1(matrix);
        return Arrays.asList(
                new Object[]{"expectedvalue1", "input1"},
                new Object[]{"expectedvalue2", "input2"}
        );
    }
public static Iterable<Object[]> data2() {
        rec.fun1(matrix);
        rec.fun2(matrix);
        return Arrays.asList(
                new Object[]{"expectedvalue1", "input1"},
                new Object[]{"expectedvalue2", "input2"}
        );
    }

解决方案 2:

拆分测试用例不是最佳做法。您的测试更难维护。流程要复杂得多。您的测试开始也存在相互依赖的风险。测试中的重复有时更好。

附注:如果使用字符串作为测试方法参数,则最好像此文件的第 25 行一样传递它们:https://github.com/Pragmatists/JUnitParams/blob/master/src/test/java/junitparams/usage/SamplesOfUsageTest.java 而不是特殊方法。

@Test
@Parameters({"AAA,1", "BBB,2"})
public void paramsInAnnotation(String p1, Integer p2) { }

我决定使用 TestNG 来解决这个问题(代码只是为了显示我的思路):

import org.testng.Assert;
import org.testng.annotations.*;
import java.lang.reflect.Method;
public class TempTest {
    private Integer number;
    @BeforeMethod
    public void init(Method m) {
        number = 5;
        switch(m.getName()) {
            case "test2":
                fun(10);
                fun2(5);
                break;
            case "test1":
                fun(10);
                break;
        }
    }
    public void fun(int value) {
        number += value;
    }
    public void fun2(int value) {
        number -= value;
    }
    @Test
    public void test1() {
        Assert.assertEquals(new Integer(15), number);
    }
    @Test
    public void test2() {
        Assert.assertEquals(new Integer(10), number);
    }
    @Test
    public void test3() {
        Assert.assertEquals(new Integer(5), number);
    }
}

相关内容

  • 没有找到相关文章

最新更新