尝试测试大型数据集,并将以下伪代码作为我们的框架。是否有支持的方式来流式传输测试数据?测试数据为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”
答案 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>
以使其与其他测试一起运行。