【问题标题】:JUnit 5 TestFactory IteratorJUnit 5 TestFactory 迭代器
【发布时间】:2018-05-18 16:31:17
【问题描述】:

语言:Kotlin 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 的实例转换为流:kotlin.sequences.TransformingSequence@36a11785”

【问题讨论】:

    标签: java performance kotlin junit5


    【解决方案1】:

    当然,在我发布问题后,我会弄清楚。 ?

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

    这个错误确实告诉你出了什么问题,这导致我试图提供它所要求的内容。

    "TestIt() 必须返回 org.junit.jupiter.api.DynamicNode 的 Stream、Collection、Iterable 或 Iterator"

    此外,他们的文档擅长展示工作动态测试的示例

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

    我希望这对其他人有帮助。

    【讨论】:

    • 可能值得添加一个解释,以使其对其他有类似/相同问题的人更有用
    【解决方案2】:

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

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

    您可以在测试工厂中添加一些“任务前”,然后返回 List&lt;DynamicTest&gt; 以便它与其他测试一起运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2012-10-20
      • 2016-10-24
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多