gpt4 book ai didi

java - 正则表达式:匹配 JUnit assertEquals?

转载 作者:行者123 更新时间:2023-12-01 13:48:01 27 4
gpt4 key购买 nike

我正在将相当多的测试从 JUnit 迁移到 Spock:

// before
assertEquals("John Doe", userDTO.getFirstName());

// after
userDTO.getFirstName() == "John Doe"

为了让事情变得更快,我想通过正则表达式(监督和逐个文件)将(大部分)JUnit 的断言表达式替换为 Spock 的断言表达式。 assertFalseassertTrueassertNotNull 很简单,但 assertEqual 则不然,因为它有 2 个参数。

我当前的尝试是:assertEquals\(([^;]+),([^;]+)\);。但这效果不太好,因为它不知道 , 是否分隔assertEquals 参数。 如何解决这个问题?

<小时/>

我的测试用例是:

assertEquals(az, bz);
assertEquals(az(), bz);
assertEquals(az, bz());
assertEquals(az(), bz));
assertEquals(az, bz(cz, dz));
assertEquals(bz(cz, dz), az);

PS:嵌套方法调用超出了此处的范围。

在线:https://www.debuggex.com/r/aESv3YmNWsakNgI6/1

最佳答案

一般来说,将任意嵌套结构与正则表达式匹配不是您应该做的事情。但是,如果我们将您的需求限制在此处列出的测试用例(删除第四个,这是一个错误),那么我们可以做一些事情。您还可以为各种其他有限情况构建正则表达式,而不会让事情变得太困难。

我将使用 python 进行说明,但同样的事情可能也适用于您的 IDE。

>>> import re
>>> import pprint
>>> t = ["assertEquals(az, bz);", \
... "assertEquals(az(), bz);", \
... "assertEquals(az, bz());", \
... "assertEquals(az, bz(dz));", \
... "assertEquals(bz(dz), az);", \
... "assertEquals(az, bz(cz, dz));", \
... "assertEquals(bz(cz, dz), az);"]
>>> var = r'([a-z]+(\(([a-z]+(\s*,\s*[a-z]+)*)?\))?)'
>>> res = [ \
... re.sub( \
... r'assertEquals\(\s*' + var + '\s*,\s*' + var + '\s*\)', \
... r'\1 == \5', str \
... ) \
... for str in t]
>>> pprint.pprint(res)
['az == bz;',
'az() == bz;',
'az == bz();',
'az == bz(dz);',
'bz(dz) == az;',
'az == bz(cz, dz);',
'bz(cz, dz) == az;']

重要的部分是var:

(                            # group the entire var before the comma
[a-z]+ # acceptable variable name
( # followed by an optional group
\( # containing a pair of matching parens
( # which contain, optionally
[a-z]+ # an acceptable variable name
( # followed by any number (0 or more)
\s*,\s*[a-z]+ # of commas followed by acceptable variable names
)*
)?
\)
)?
)

要使其适用于您的实际代码,您必须将 [a-z] 更改为更合理的内容,例如 [a-zA-Z0-9_]

关于java - 正则表达式:匹配 JUnit assertEquals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20199742/

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