如何为 Kotlin 测试生成真实世界的文本数据?

How to generate real world text data for Kotlin Tests?

提问人:Kalle Richter 提问时间:11/17/2023 更新时间:11/17/2023 访问量:47

问:

我正在使用 Kotest 数据生成器进行测试,这些测试非常灵活,几乎可以做任何事情。然而,字符串生成器技术性很强,很难用它们生成现实世界的文本字符串。

例如,生成带有可打印 ASCII 字符 ( 到 ) 的字符串是相当遥远的真实用例,即使从真实世界的 ASCII 输入也是如此,因为不包含换行符和制表符。在现实世界中,可以在具有各种语言设置的浏览器中创建各种 UTF-8 字符。 ~

Kotest 中有生成器,但它使用的是 RxGen 1.4,它尚不支持基于 Character 类的生成(版本 1.5 正在等待中)。否则我会说这是我的想法,但我对 Unicode 字符类一无所知,我觉得这个问题的现有解决方案比自己弄清楚要好得多。stringPattern[\p{Punct}]|[\p{Graph}]|[\p{Print}]|[\p{Blank}]

我在 Kotlin 1.9 项目中使用 Kotest 5.8.0。

kotlin - 数据-基于属性的测试 kotest

评论


答:

0赞 AndrewL 11/17/2023 #1

如果 Lorem Ipsum 可以作为现实世界的文本为您传递,这很容易使用:

val lorem: Lorem = LoremIpsum(seed)

// generates between 2 and 4 paragraphs:
val text = lorem.getParagraphs(2, 4)
        <dependency>
            <groupId>com.thedeanda</groupId>
            <artifactId>lorem</artifactId>
        </dependency>

来源: https://github.com/mdeanda/lorem

0赞 johanneslink 11/20/2023 #2

另一种选择是使用 jqwik 的字符串生成器。它们可以在 jqwik 属性方法之外使用。

下面是一个示例:

import io.kotest.core.spec.style.FunSpec
import net.jqwik.api.Arbitraries

class KotlinTests : FunSpec({

    test("my first test") {
        Arbitraries.strings().ofLength(10).sampleStream()
            .limit(10)
            .forEach { println(it) }
    }

})

用户指南的这一部分记录了如何使用 jqwik 的生成器(又名任意生成器)。

全面披露:我是 jqwik 的主要提交者