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

}

このテストを行う適切な方法を見つけようとしています。非常に便利な方法なので、パラメータ化されたテストを使用したいと思います。

ご覧のとおり、すべてのテスト関数で関数 ( fun1and fun2) を呼び出します。ただし、テストごとに 1 回だけ呼び出す必要があります (たとえば、各パラメーター化されたテストの実行前)。

すべてのパラメータ化されたテストを実行する前に、他の関数を実行する必要があることを JUnitParams に伝える方法はありますか?

@Beforeご覧のとおり、使用していないため、注釈を使用できませtest1fun2。別の関数で実行する必要があると思います。

4

2 に答える 2

1

解決策 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:

テスト ケースの分割はベスト プラクティスではありません。あなたのテストは維持するのが難しいです。フローははるかに複雑です。テストの開始が相互に依存するリスクもあります。テストでの複製は、単純に優れている場合があります。

PS: テスト メソッドのパラメーターとして文字列を使用している場合は、このファイルの 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) { }
于 2016-02-29T11:16:56.303 に答える
0

私はこの問題を解決するために 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);
    }

}
于 2016-03-01T10:25:22.483 に答える