猿问

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成功完成后运行(否则在无效输入上运行这个测试是不明智的)。


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


天涯尽头无女友
浏览 326回答 2
2回答

森栏

是什么让你认为它在“语义上”属于 BeforeClass?!从语义上讲,测试属于您的被测类的任何方法的预期行为......属于测试方法。不进入准备休息的方法。一个有意义的init 方法需要接收每个测试用例设置数据。因此,如果有的话,您将拥有一个在 @Before 方法中初始化的字段MyDataTransformer underTest。使用稍后允许进行适当测试的参数。测试 init 方法的行为是否符合预期并抛出异常属于一个独特的、很好命名的 @Test 方法。除此之外,您可以强制 Junit 以某种顺序执行测试用例(例如按字典顺序排序)。这不是很好的做法,但有时可以很好地解决此类排序问题。

阿波罗的战车

一个名为 init 的函数之间没有联系,它应该在单元测试中只运行一次。它也可以在每个函数之前运行。让一个测试依赖于另一个是不好的做法,你必须分开它们的测试上下文,否则这会导致噩梦,如果第二个测试依赖于另一个,它可能会失败,因为第一个测试改变了之间共享的状态他们。因此,您正在放慢自己寻找回归根本原因的速度,即使您决定按字母顺序排列您的测试,如果您有很多人在同一个项目上工作并且有人以不同的方式命名他的测试……您会发现这也很糟糕。嵌套类的目的是按域对测试进行分组,从而提高测试的质量和可维护性。我在您的设计中看到的只是一个领域。题外话:抛出一般异常类是不好的做法,为了可维护性,创建一个专门的。我也看到你的代码有异味,为什么你在一个catch里面返回,通常,你必须记录异常或抛出它,并且返回必须在外面,另外,为了让你以后不那么头疼,改为返回一个空数组为空。
随时随地看视频慕课网APP

相关分类

Java
我要回答