在C#中,可以为同一单元测试方法指定参数。 例如:
[DataTestMethod]
[DataRow(12,3,4)]
[DataRow(12,2,6)]
public void DivideTest(int n, int d, int q)
{
Assert.AreEqual( q, n / d );
}
是否可以在Java中执行相同的操作?我已经阅读过Parametrized runner,但这个解决方案不是那么容易使用。
答案 0 :(得分:3)
Spock Framewok为Java和Groovy提供Data Driven Testing。
使用Groovy编写的测试(不幸?):
class MathSpec extends Specification { def "maximum of two numbers"() { expect: Math.max(a, b) == c where: a | b || c 1 | 3 || 3 7 | 4 || 7 0 | 0 || 0 } }
答案 1 :(得分:2)
使用JUnit 5,参数化测试与JUnit 4一样使用起来更加直接和自然。
在您的情况下,要提供多个参数作为输入,您可以使用@CsvSource
注释。
以下是必需的依赖项(maven声明方式):
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.0.0-M4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.0.0-M4</version>
<scope>test</scope>
</dependency>
这是一个示例代码(带有必需的导入):
import org.junit.Assert;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
public class YourTestClass{
@ParameterizedTest
@CsvSource({ "12,3,4", "12,2,6" })
public void divideTest(int n, int d, int q) {
Assert.assertEquals(q, n / d);
}
}
答案 2 :(得分:1)
开箱即用的JUnit
无法实现这一目标,但您可以使用第三方JUnitParams:
@RunWith(JUnitParamsRunner.class)
public class PersonTest {
@Test
@Parameters({"17, false",
"22, true" })
public void personIsAdult(int age, boolean valid) throws Exception {
assertThat(new Person(age).isAdult(), is(valid));
}
@Test
public void lookNoParams() {
etc
}
}
答案 3 :(得分:0)
https://github.com/junit-team/junit4/wiki/parameterized-tests
唯一的缺点是类中的所有测试方法都将针对每个参数(行)执行。