Java 如何使用参数编写单元测试?
我不熟悉java,但在c#(NUnit)中,您可以通过添加Java 如何使用参数编写单元测试?,java,c#,unit-testing,junit,mockito,Java,C#,Unit Testing,Junit,Mockito,我不熟悉java,但在c#(NUnit)中,您可以通过添加[TestCase]属性来参数化单元测试,如下所示: [TestCase(12,3,4)] [TestCase(12,2,6)] [TestCase(12,4,3)] public void DivideTest(int n, int d, int q) { Assert.AreEqual( q, n / d ); } 在这种情况下,我们不必为每个测试用例编写单独的单元测试。相反,我们需要编写[TestCase]来更改值 Java
[TestCase]
属性来参数化单元测试,如下所示:
[TestCase(12,3,4)]
[TestCase(12,2,6)]
[TestCase(12,4,3)]
public void DivideTest(int n, int d, int q)
{
Assert.AreEqual( q, n / d );
}
在这种情况下,我们不必为每个测试用例编写单独的单元测试。相反,我们需要编写[TestCase]来更改值
Java上有等价物吗?
当前使用JUnit4.12的参数化是您所需要的。考虑下面的例子。请注意,test3显然是红色的,因为20/5=4
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class DividerTest {
private int dividend;
private int divisor;
private int expectedResult;
@Parameterized.Parameters
public static Collection<Object[]> data() {
Object[] test1 = { 10, 5, 2 };
Object[] test2 = { 15, 5, 3 };
Object[] test3 = { 20, 5, 5 };
return Arrays.asList(test1, test2, test3);
}
public DividerTest(int dividend, int divisor, int expectedResult) {
this.dividend = dividend;
this.divisor = divisor;
this.expectedResult = expectedResult;
}
@Test
public void testDivider() {
assertEquals(expectedResult, dividend / divisor);
}
}
导入静态org.junit.Assert.assertEquals;
导入java.util.array;
导入java.util.Collection;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.junit.runners.Parameterized;
@RunWith(参数化的.class)
公共类分割测试{
私人股息;
私有整数除数;
私有内部预期结果;
@参数化。参数化
公共静态收集数据(){
对象[]test1={10,5,2};
对象[]test2={15,5,3};
对象[]test3={20,5,5};
返回Arrays.asList(test1、test2、test3);
}
公共除数测试(整数除数、整数除数、整数预期结果){
这个。股息=股息;
这个除数=除数;
this.expectedResult=expectedResult;
}
@试验
公共无效测试分隔器(){
资产质量(预期结果、股息/除数);
}
}
以下是测试结果:
参数化是您所需要的。考虑下面的例子。请注意,test3显然是红色的,因为20/5=4
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class DividerTest {
private int dividend;
private int divisor;
private int expectedResult;
@Parameterized.Parameters
public static Collection<Object[]> data() {
Object[] test1 = { 10, 5, 2 };
Object[] test2 = { 15, 5, 3 };
Object[] test3 = { 20, 5, 5 };
return Arrays.asList(test1, test2, test3);
}
public DividerTest(int dividend, int divisor, int expectedResult) {
this.dividend = dividend;
this.divisor = divisor;
this.expectedResult = expectedResult;
}
@Test
public void testDivider() {
assertEquals(expectedResult, dividend / divisor);
}
}
导入静态org.junit.Assert.assertEquals;
导入java.util.array;
导入java.util.Collection;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.junit.runners.Parameterized;
@RunWith(参数化的.class)
公共类分割测试{
私人股息;
私有整数除数;
私有内部预期结果;
@参数化。参数化
公共静态收集数据(){
对象[]test1={10,5,2};
对象[]test2={15,5,3};
对象[]test3={20,5,5};
返回Arrays.asList(test1、test2、test3);
}
公共除数测试(整数除数、整数除数、整数预期结果){
这个。股息=股息;
这个除数=除数;
this.expectedResult=expectedResult;
}
@试验
公共无效测试分隔器(){
资产质量(预期结果、股息/除数);
}
}
以下是测试结果:
TestNG是一个库和框架,它使用数据工厂和依赖项注入对测试参数进行了出色的控制。TestNG是一个库和框架,它使用数据工厂和依赖项注入对测试参数进行了出色的控制。看看参数化测试()。注意构造函数-您可以指定该方法可以使用多少个参数。在Java中没有那么漂亮(也可能没有那么好),但这将是一种选择,您可以为不同的测试重用相同的测试用例data@robjob27,我查看了您提供的链接。但它看起来不像努尼特。有没有可能让它看起来更优雅。我所说的优雅是指像努尼特一样的简单。或者至少,我可以选择为它编写新属性并在后面将其转换为JUnit样式吗?@AkinerAlkan是的,我同意。这些看起来一点也不漂亮。顺便说一句,C#中有一点非常酷,那就是理论。基本上类似于上面的测试用例,但它进一步抽象了它。注意构造函数-您可以指定方法可以使用多少个参数。在Java中没有那么漂亮(也可能没有那么好),但这将是一种选择,您可以为不同的测试重用相同的测试用例data@robjob27,我查看了您提供的链接。但它看起来不像努尼特。有没有可能让它看起来更优雅。我所说的优雅是指像努尼特一样的简单。或者至少,我可以选择为它编写新属性并在后面将其转换为JUnit样式吗?@AkinerAlkan是的,我同意。这些看起来一点也不漂亮。顺便说一句,C#中有一点非常酷,那就是理论。基本上类似于上面的测试用例,但它进一步抽象了它。这是一个很好的示例,我知道这与nunit的逻辑相同,但表示不同。我想知道的是:我们是否可以编写某种通用代码并简化集合的创建,就像nunit场景中那样。那么在这种情况下,我们可以使用与现在完全相同的实现,比如[TestCase(x,y,z)],我认为Junit不支持[TestCase(x,y,z)]。所以答案还没有:)还没有,但是JUnit5中有更好的参数化支持。也许没有那么优雅,但它很接近。查看@CsvSource:这是一个很好的例子,我知道这与nunit的逻辑相同,但表示不同。我想知道的是:我们是否可以编写某种通用代码并简化集合的创建,就像nunit场景中那样。那么在这种情况下,我们可以使用与现在完全相同的实现,比如[TestCase(x,y,z)],我认为Junit不支持[TestCase(x,y,z)]。所以答案还没有:)还没有,但是JUnit5中有更好的参数化支持。也许没有那么优雅,但它很接近。签出@CsvSource: