JUnit 5 TestFactory迭代器

时间:2018-05-18 16:31:17

标签: java performance kotlin junit5

郎:科特林 JDK:1.8.0_162 JUnit 5:5.2.0

尝试测试大型数据集,并将以下伪代码作为我们的框架。是否有支持的方式来流式传输测试数据?测试数据为4GB,因此无法将其作为数组返回。

data class BigData(val id: Int, val bytes: ByteArray)

@TestFactory
fun TestIt() = getTestData()
    .map { (id, bytes) ->
        DynamicTest.dynamicTest("DataId: $id") {
            var valid = DoSomethingWithLargeData(bytes)
            Assertions.assertEquals(true, valid)
        }
    }

fun getTestData() = buildSequence {
    val inputStream = File(largeData).inputStream()

    inputStream.bufferedReader().useLines { lines ->
        lines.forEach {
            val parts = it.split(',')
            val id = parts[0].toInt()
            val bytes = decoder.decode(parts[1])
            yield(BigData(id, bytes))
        }
    }
}

我使用上面的代码

得到以下错误

“引起:org.junit.platform.commons.util.PreconditionViolationException:无法将kotlin.sequences.TransformingSequence的实例转换为Stream:kotlin.sequences.TransformingSequence@36a11785”

2 个答案:

答案 0 :(得分:3)

Of course after I post the question, I figure it out.

@TestFactory
fun TestIt() : Iterator<DynamicTest> {
    return getTestData
    .map { (id, bytes) ->
        DynamicTest.dynamicTest("DataId: $id") {
            var valid = DoSomethingWithLargeData(bytes)
            Assertions.assertEquals(true, valid)
        }
    }.iterator()
}

The error kinda really does tell you what's wrong which lead me to trying to provide what it was asking for.

"TestIt() must return a Stream, Collection, Iterable, or Iterator of org.junit.jupiter.api.DynamicNode"

Also, their documentation is good at showing examples of working dynamic tests

https://junit.org/junit5/docs/current/user-guide/#writing-tests-dynamic-tests

我希望这有助于其他人。

答案 1 :(得分:0)

当您希望测试同时运行多个测试用例时,这将是另一个带有列表的示例。 我发现语法有点不同:

@TestFactory
fun multiplyDoubleTest() = listOf(
    listOf(0.0, 0.0, 0.0),
    listOf(0.0, 5.0, 0.0),
    listOf(1.0, 1.0, 1.0),
    listOf(1.0, 6.0, 6.0),
    listOf(-2.0, 3.0, -6.0),
    listOf(2.0, 0.5, 1.0),
    listOf(2.0, 6.0, 12.0)
).map { (a, b, expectedResult) ->
    DynamicTest.dynamicTest("Test:  $a x $b =  $expectedResult") {
        assertEquals(expectedResult, multiply(a, b))
    }
}

我们使用乘法方法执行 a * b,每个测试用例为 (a, b, expectedResult),然后您在 DynamicTest 中执行 assertEquals

测试名称也可以是动态的,带有 dynamicTest("Test: $a x $b = $expectedResult")。 另外如果你需要准备测试用例,你可以这样使用@TestFactory

@TestFactory
fun multiplyWithInstructionBeforeTest(): List<DynamicTest> {
    val zero = 0.0
    return listOf(
        listOf(zero, 0.0, zero),
        listOf(zero, 1.0, zero)
    ).map { (a, b, expectedResult) ->
        DynamicTest.dynamicTest("Test:  $a x $b =  $expectedResult") {
            assertEquals(expectedResult, multiply(a, b))
        }
    }
}

您可以在测试工厂中添加一些“Before Tasks”,然后返回 List<DynamicTest> 以使其与其他测试一起运行。