gpt4 book ai didi

java - 如何测试顺序无关紧要的生成字符串?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:10 27 4
gpt4 key购买 nike

如何在结束顺序相当灵活的情况下对生成的字符串进行单元化。可以说我正在尝试测试一些代码,这些代码打印出来自键值对的生成的 SQL。然而,许多片段的确切顺序并不重要。

例如

SELECT
*
FROM
Cats
WHERE
fur = 'fluffy'
OR
colour = 'white'

在功能上等同于

SELECT
*
FROM
Cats
WHERE
colour = 'white'
OR
fur = 'fluffy'

条件子句的生成顺序无关紧要,重要的是它们遵循 where 子句。此外,很难预测,因为在遍历 HashMapentrySet() 时,对的排序是不可预测的。对键进行排序可以解决这个问题,但会因没有(或负的)业务值(value)而引入运行时惩罚。

如何在不过度指定顺序的情况下对此类字符串的生成进行单元测试?

我想过使用正则表达式但是*我想不出如何写一个这样的:

正则表达式是我在想的,但我可以想到一个正则表达式,它说类似“SELECT * FROM Cats WHERE”,后跟 {"fur = 'fluffy', color = 'white'} 之一,然后是 "OR"后跟 {"fur = 'fluffy',colour = 'white'} 之一 ... 而不是上次使用的那个。

注意:我实际上并没有用 SQL 来做这件事,它只是为了更容易地解决问题。

最佳答案

我看到几个不同的选项:

如果您可以忍受适度的运行时损失, LinkedHashMap 会保持插入顺序。

如果你想在不改变你的实现的情况下完全解决这个问题,在你的例子中我不明白为什么你应该做比检查每个片段出现在代码中更复杂的事情,并且它们出现在 WHERE 之后。伪代码:

Map<String, String> parametersAndValues = { "fur": "fluffy", "colour", "white" };
String generatedSql = generateSql(parametersToValues);
int whereIndex = generatedSql.indexOf("WHERE");
for (String key, value : parametersAndValues) {
String fragment = String.format("%s = '%s'", key, value);
assertThat(generatedSql, containsString(fragment));
assertThat(whereIndex, is(lessThan(generatedSql.indexOf(fragment))));
}

但我们可以做得比这更简单。由于您实际上不必使用大量参数对其进行测试 - 对于大多数实现而言,只有三个重要数量,“无、一个或许多” - 对其进行测试实际上是可行的所有可能的值:

String variation1 = "SELECT ... WHERE fur = 'fluffy' OR colour = 'white'";
String variation2 = "SELECT ... WHERE colour = 'white' OR fur = 'fluffy'";
assertThat(generatedSql, is(anyOf(variation1, variation2)));

编辑:避免手写所有可能的变体(如果您有超过两三个项目,这会变得相当乏味,因为有 n! 种方法来组合 < em>n 项),你可以查看 the algorithm for generating all possible permutations of a sequence 并执行如下操作:

List<List<String>> permutations = allPermutationsOf("fur = 'fluffy'", 
"colour = 'white'", "scars = 'numerous'", "disposition = 'malignant'");
List<String> allSqlVariations = new ArrayList<>(permutations.size());
for (List<String> permutation : permutations) {
allSqlVariations.add("SELECT ... WHERE " + join(permutation, " OR "));
}
assertThat(generatedSql, is(anyOf(allSqlVariations)));

关于java - 如何测试顺序无关紧要的生成字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14142116/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com