是否有一个等同于NUnit的testcase属性的JUnit?

Ste*_*eph 25 junit nunit unit-testing testcase testcaseattribute

我已经搜索了JUnit测试用例,它提出了一些看起来实现起来要复杂得多的东西 - 你必须创建一个扩展测试用例然后调用的新类:

public class MathTest extends TestCase {
    protected double fValue1;
    protected double fValue2;

    protected void setUp() {
       fValue1= 2.0;
       fValue2= 3.0;
    }
 }

public void testAdd() {
   double result= fValue1 + fValue2;
   assertTrue(result == 5.0);
}
Run Code Online (Sandbox Code Playgroud)

但我想要的是非常简单的东西,比如NUnit测试用例

[TestCase(1,2)]
[TestCase(3,4)]
public void testAdd(int fValue1, int fValue2)
{
    double result= fValue1 + fValue2;
    assertIsTrue(result == 5.0);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在JUnit中这样做?

Sou*_*man 12

2017更新: JUnit 5将通过junit-jupiter-params扩展包括参数化测试.文档中的一些示例:

原始类型的单个参数(@ValueSource):

@ParameterizedTest
@ValueSource(strings = { "Hello", "World" })
void testWithStringParameter(String argument) {
    assertNotNull(argument);
}
Run Code Online (Sandbox Code Playgroud)

逗号分隔值(@CsvSource)允许指定类似于以下JUnitParams的多个参数:

@ParameterizedTest
@CsvSource({ "foo, 1", "bar, 2", "'baz, qux', 3" })
void testWithCsvSource(String first, int second) {
    assertNotNull(first);
    assertNotEquals(0, second);
}
Run Code Online (Sandbox Code Playgroud)

其他来源注释包括@EnumSource,@MethodSource,@ArgumentsSource和@CsvFileSource,看到文档的详细信息.


原始答案:

JUnitParams(https://github.com/Pragmatists/JUnitParams)似乎是一个不错的选择.它允许您将测试参数指定为字符串,如下所示:

@RunWith(JUnitParamsRunner.class)
public class MyTestSuite {
    @Test
    @Parameters({"1,2", "3,4"})
    public testAdd(int fValue1, int fValue2) {
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以通过单独的方法,类或文件指定参数,有关详细信息,请参阅JUnitParamsRunner api文档.


All*_*lan 11

显然,正确答案是"不,没有等价物".那太可悲了.

JUnit参数化测试和理论(如此处和JUnit中所述 - 如何测试具有不同值的方法?)两者都可以完成工作,但几乎没有干净.他们写作很难读,也很难阅读.

我希望有一天JUnit可以添加更简单,类似NUnit的语法.似乎不应该那么困难; 虽然也许需要lambdas?


Gon*_*n I 6

查看JUnit Theories和Datapoints也许是值得的.它们允许您参数化测试,但在输入上运行全对类型组合.


Den*_*rev 5

你可以使用zohhak获得带参数的junit

用法示例:

@RunWith(ZohhakRunner.class)
public class HelloWorldTest {

    @TestWith({
        "2, 1,   3",
        "3, 5,   8"
    })
    public void should_add_numbers(int addend1, int addend2, int result) {

        assertThat(addend1 + addend2).isEqualTo(result);
    }
}
Run Code Online (Sandbox Code Playgroud)


Ken*_* Xu 2

这很愚蠢,但这是我最终的解决方法。使用 4 行代替 1 行。

@Test
public void testAdd1() {
    testAdd(1,2);
}
@Test
public void testAdd2() {
    testAdd(3,4);
}
private void testAdd(int fValue1, int fValue2)
{
    double result= fValue1 + fValue2;
    assertIsTrue(result == 5.0);
}
Run Code Online (Sandbox Code Playgroud)