更改参数化测试的名称
在 JUnit4 中使用参数化测试时,有没有办法设置我自己的自定义测试用例名称?
我想将默认值 - [Test class].runTest[n]
- 更改为有意义的值。
Is there a way to set my own custom test case names when using parameterized tests in JUnit4?
I'd like to change the default — [Test class].runTest[n]
— to something meaningful.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(15)
此功能已纳入 JUnit 4.11。< /strong>
要使用更改参数化测试的名称,您可以说:
namestring
是一个字符串,可以具有以下特殊占位符:{index} - 这组的索引论据。默认
名称字符串
为{index}
。{0}
- 此测试调用中的第一个参数值。{1}
- 第二个参数值测试的最终名称将是测试方法的名称,后跟
namestring
放在括号中,如下所示。例如(改编自
Parameterized
注释的单元测试):将给出诸如
testFib[1: fib(1)=1]
和testFib[4 :fib(4)=3]
。 (名称的testFib
部分是@Test
的方法名称)。This feature has made it into JUnit 4.11.
To use change the name of parameterized tests, you say:
namestring
is a string, which can have the following special placeholders:{index}
- the index of this set of arguments. The defaultnamestring
is{index}
.{0}
- the first parameter value from this invocation of the test.{1}
- the second parameter valueThe final name of the test will be the name of the test method, followed by the
namestring
in brackets, as shown below.For example (adapted from the unit test for the
Parameterized
annotation):will give names like
testFib[1: fib(1)=1]
andtestFib[4: fib(4)=3]
. (ThetestFib
part of the name is the method name of the@Test
).看看 JUnit 4.5,它的运行程序显然不支持这一点,因为该逻辑被隐藏在参数化类内的私有类中。您无法使用 JUnit 参数化运行器,而是创建自己的运行器来理解名称的概念(这导致了如何设置名称的问题......)。
从 JUnit 的角度来看,如果不只是传递增量(或除了传递增量之外),而是传递逗号分隔的参数,那就太好了。 TestNG 就是这样做的。如果该功能对您很重要,您可以在 www.junit.org 上引用的 yahoo 邮件列表上发表评论。
Looking at JUnit 4.5, its runner clearly doesn't support that, as that logic is buried inside a private class inside the Parameterized class. You could not use the JUnit Parameterized runner, and create your own instead which would understand the concept of names (which leads to the question of how you might set a name ...).
From a JUnit perspective, it would be nice if instead of (or in addition to) just passing an increment, they would pass the comma delimited arguments. TestNG does this. If the feature is important to you, you can comment on the yahoo mailing list referenced at www.junit.org.
我最近在使用 JUnit 4.3.1 时遇到了同样的问题。我实现了一个扩展 Parameterized 的新类,称为 LabelledParameterized。它已使用 JUnit 4.3.1、4.4 和 4.5 进行了测试。它使用 @Parameters 方法中每个参数数组的第一个参数的字符串表示形式重建 Description 实例。您可以在以下位置查看相关代码:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../LabelledParameterized.java?r=3789
及其示例使用于:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../ServerBuilderTest.java?r=3789
测试描述格式很好地在 Eclipse 中,这正是我想要的,因为这使得失败的测试更容易找到!我可能会在接下来的几天/几周内进一步完善和记录课程。删除“?”如果您想要最前沿的内容,请包含 URL 的一部分。 :-)
要使用它,您所要做的就是复制该类(GPL v3),并将 @RunWith(Parameterized.class) 更改为 @RunWith(LabelledParameterized.class) 假设参数列表的第一个元素是一个合理的标签。
我不知道 JUnit 的任何后续版本是否解决了这个问题,但即使解决了,我也无法更新 JUnit,因为我的所有合作开发人员也必须更新,而且我们的优先级高于重新工具。因此,类中的工作可由多个版本的 JUnit 进行编译。
注意:存在一些反射问题,因此它可以跨上面列出的不同 JUnit 版本运行。可以找到专门针对 JUnit 4.3.1 的版本 此处,对于 JUnit 4.4 和 4.5,这里。
I recently came across the same problem when using JUnit 4.3.1. I implemented a new class which extends Parameterized called LabelledParameterized. It has been tested using JUnit 4.3.1, 4.4 and 4.5. It reconstructs the Description instance using the String representation of the first argument of each parameter array from the @Parameters method. You can see the code for this at:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../LabelledParameterized.java?r=3789
and an example of its use at:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../ServerBuilderTest.java?r=3789
The test description formats nicely in Eclipse which is what I wanted since this makes failed tests a lot easier to find! I will probably further refine and document the classes over the next few days/weeks. Drop the '?' part of the URLs if you want the bleeding edge. :-)
To use it, all you have to do is copy that class (GPL v3), and change @RunWith(Parameterized.class) to @RunWith(LabelledParameterized.class) assuming the first element of your parameter list is a sensible label.
I don't know if any later releases of JUnit address this issue but even if they did, I can't update JUnit since all my co-developers would have to update too and we have higher priorities than re-tooling. Hence the work in the class to be compilable by multiple versions of JUnit.
Note: there is some reflection jiggery-pokery so that it runs across the different JUnit versions as listed above. The version specifically for JUnit 4.3.1 can be found here and, for JUnit 4.4 and 4.5, here.
以参数化为模型,我编写了自己的自定义测试运行器/套件——只花了大约半小时。它与 darrenp 的
LabelledParameterized
略有不同,因为它允许您显式指定名称,而不是依赖第一个参数的toString()
。它也不使用数组,因为我讨厌数组。 :)
举个例子:
With
Parameterized
as a model, I wrote my own custom test runner / suite -- only took about half an hour. It's slightly different from darrenp'sLabelledParameterized
in that it lets you specify a name explicitly rather than relying on the first parameter'stoString()
.It also doesn't use arrays because I hate arrays. :)
And an example:
您可能还想尝试 JUnitParams: https://github.com/Pragmatists/JUnitParams
You may also want to try JUnitParams: https://github.com/Pragmatists/JUnitParams
从junit4.8.2开始,您可以通过简单地复制Parameterized类来创建自己的MyParameterized类。更改 TestClassRunnerForParameters 中的 getName() 和 testName() 方法。
from junit4.8.2, you can create your own MyParameterized class by simply copy Parameterized class. change the getName() and testName() methods in TestClassRunnerForParameters.
这些都不适合我,所以我获得了 Parameterized 的源代码并对其进行了修改,创建了一个新的测试运行程序。我不需要做太多改变,但它有效!
None of it was working for me, so I got the source for Parameterized and modified it create a a new test runner. I didn't have to change much but IT WORKS!!!
您可以创建一个类似的方法,
虽然我不会一直使用它,但是准确找出测试编号 143 是很有用的。
You can create a method like
While I wouldn't use it all the time it would be useful to figure out exactly which test number 143 is.
我广泛使用 Assert 和朋友的静态导入,因此我很容易重新定义断言:
例如,您可以向测试类添加一个“名称”字段,在构造函数中初始化,并在测试失败时显示该字段。只需将其作为每个测试的参数数组的第一个元素传递即可。这也有助于标记数据:
I make extensive use of static import for Assert and friends, so it is easy for me to redefine assertion:
For example, you could add a "name" field to your test class, initialized in the constructor, and display that on test failure. Just pass it in as the first elements of your parameters array for each test. This also helps label the data:
解决方法是捕获所有 Throwable 并将其嵌套到一个新的 Throwable 中,并使用包含有关参数的所有信息的自定义消息。该消息将出现在堆栈跟踪中。
每当所有断言、错误和异常的测试失败时,这都会起作用,因为它们都是 Throwable 的子类。
我的代码如下所示:
失败测试的堆栈跟踪是:
A workaround would be to catch and nest all Throwables into a new Throwable with a custom message that contains all information about the parameters. The message would appear in the stack trace.
This works whenever a test fails for all assertions, errors and exceptions as they are all subclasses of Throwable.
My code looks like this:
The stack trace of the failed test is:
当您想要测试名称中的参数值时,您可以执行类似 -
测试名称看起来像 -
JUnit Test图片
When you want the parameter values in test name then you can do something like -
Test name will look like -
JUnit Test image
查看 dsaff 提到的 JUnitParams,它使用 ant 在 html 报告中构建参数化测试方法描述。
这是在尝试 LabelledParameterized 并发现它虽然可以与 eclipse 一起使用,但就 html 报告而言却不能与 ant 一起使用。
干杯,
Check out JUnitParams as dsaff mentioned, works using ant to build parameterized test method descriptions in the html report.
This was after trying LabelledParameterized and finding that it although it works with eclipse it does not work with ant as far as the html report is concerned.
Cheers,
由于访问的参数(例如使用
"{0}"
始终返回toString()
表示形式,因此一种解决方法是进行匿名实现并覆盖toString( )
在每种情况下。Since the parameter accessed (e.g. with
"{0}"
always returns thetoString()
representation, one workaround would be to make an anonymous implementation and overridetoString()
in each case. For example:参数化测试正在内部调用
toString()
。如果您创建一个覆盖
toString()
的对象包装器,它将更改测试的名称。这是一个例子,我在其他帖子中回答过。
https://stackoverflow.com/a/67023556/1839360
Parameterized test is calling
toString()
internally.If you create an object wrapper overiding
toString()
, it will change the names of the test.Here is an example, I answered in other post.
https://stackoverflow.com/a/67023556/1839360
对于更复杂的对象,您可以执行以下操作(以 JUnit 4 为例):
这里的技巧是使用一个输入参数作为描述输入的某一部分或整个测试用例的字符串。
在添加第三个参数之前,它看起来像这样
然后像这样
For a more complex object you may do the following (example with JUnit 4):
The trick here is to use one input parameter as a string describing either some part of input or the whole test case.
Before adding third parameter it looked like this
And after like this