JUnit 4:嵌套测试

伊尔钦格

我有一个要测试的数据转换类。给出了接口 ITransformer。这个类看起来像这样:

public class MyDataTransformer implements ITranformer {

    public MyDataTransformer() {}

    @Override
    public void init(String[] args) throws Exception {
        if (args.length == 0)
            throw (new Exception("bad input"));

        // do initialization
    }

    @Override
    public byte[] transform(byte[] input) {
        try {
            return transform_internal(input);
        } catch (Exception e) {
            return null;
        }
    }

    private static byte[] transform_internal(byte[] input) throws Exception {
        // do something
    }
}

这是我目前拥有的测试类:

public class TransformerTest {

    private MyDataTransformer transformer;

    @BeforeClass
    public void setUp() {
        String[] args = new String[4];
        // set args

        try {
            transformer = new MyDataTransformer();
            transformer.init(args);
        } catch (Exception e) {
            fail(e.getMessage());
        }
    }

    @Test
    public void testTransform() {
        byte[] input = read_input(); // omitted here for brevity

        byte[] output = transformer.transform(input);
        // this only tests if "valid" data was returned, but does not look into it
        assertNotNull("Transformation failed", output);

        // these 2 test some properties of the result data and should be separate tests
        assertTrue("transformation step 1 failed", test_transformation_1(output);
        assertTrue("transformation step 2 failed", test_transformation_2(output);
    } 
}

在测试方面,我有两件事很纠结。

首先,我如何正确测试该init方法一次?从语义上讲,init 属于该@BeforeClass块,但该块不是一个适当的测试。

其次,我如何分离test_transformation_1出自己的测试,但要确保仅在testTransform成功完成后才运行此测试(否则在无效输入上运行此测试是不明智的)。

对我来说,感觉嵌套测试可以解决这两个问题,因此是问题的标题。然而,这个例子可能会增长,我可能会添加不需要嵌套的独立测试,我希望它尽可能简单。

鬼猫

是什么让你认为“语义上”它属于 BeforeClass ?!从语义上讲,测试属于被测类的任何方法的预期行为......属于测试方法。不进入准备休息的方法。

一个有意义的init 方法需要接收每个测试用例设置数据。所以,如果有的话,你会有一个字段MyDataTransformer underTest 在@Before 方法中被初始化。带有稍后允许正确测试的参数。

测试 init 方法是否按预期运行并抛出异常属于一个独特的、名字很好的 @Test 方法。

除此之外,您可以强制 Junit 执行给定某种顺序的测试用例(例如按字典顺序排序)。这不是很好的做法,但有时是解决此类排序问题的好方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章