java参数化测试怎么定义用户输入的数据,并且举几个详细代码例子说明
时间: 2023-05-27 09:05:56 浏览: 42
Java参数化测试可以使用JUnit的@Parameter注解来定义用户输入的数据。具体步骤如下:
1. 定义测试方法,使用@Parameter注解标注输入参数,例如:
```
@Test
@Parameters({"4, 2, 2", "12, 3, 4"})
public void testDivide(int dividend, int divisor, int expected) {
int actual = divide(dividend, divisor);
assertEquals(expected, actual);
}
```
2. 在测试类中定义数据源,例如使用@Parameters注解定义一个二维数组:
```
@RunWith(Parameterized.class)
public class CalculatorTest {
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{ 4, 2, 2 },
{ 12, 3, 4 },
{ 8, 4, 2 },
{ 20, 5, 4 },
{ 30, 6, 5 }
});
}
}
```
3. 在测试方法中使用输入参数,例如:
```
public int divide(int dividend, int divisor) {
if (divisor == 0) {
throw new IllegalArgumentException("Cannot divide by zero!");
}
return dividend / divisor;
}
```
4. 运行测试方法,JUnit会自动将数据源中的数据传入测试方法中,依次执行测试。
以上是Java参数化测试的基本步骤,下面举几个详细代码例子说明。
例1:使用@Parameter注解定义输入参数
```
@Test
@Parameters({"4, 2, 2", "12, 3, 4"})
public void testDivide(int dividend, int divisor, int expected) {
int actual = divide(dividend, divisor);
assertEquals(expected, actual);
}
```
在这个例子中,@Parameters注解指定了两个输入参数,分别是"4, 2, 2"和"12, 3, 4"。测试方法中使用@Parameter注解标注了三个输入参数,分别为dividend、divisor和expected。JUnit会自动将两个输入参数传入测试方法中,依次执行测试。
例2:使用@Parameters注解定义数据源
```
@RunWith(Parameterized.class)
public class CalculatorTest {
private int dividend;
private int divisor;
private int expected;
public CalculatorTest(int dividend, int divisor, int expected) {
this.dividend = dividend;
this.divisor = divisor;
this.expected = expected;
}
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{ 4, 2, 2 },
{ 12, 3, 4 },
{ 8, 4, 2 },
{ 20, 5, 4 },
{ 30, 6, 5 }
});
}
@Test
public void testDivide() {
int actual = divide(dividend, divisor);
assertEquals(expected, actual);
}
public int divide(int dividend, int divisor) {
if (divisor == 0) {
throw new IllegalArgumentException("Cannot divide by zero!");
}
return dividend / divisor;
}
}
```
在这个例子中,@RunWith注解指定了测试运行器为Parameterized.class。测试类中定义了三个成员变量dividend、divisor和expected,并通过构造函数初始化。@Parameters注解指定了数据源,它是一个二维数组,其中每个元素都是一个三元组,分别表示dividend、divisor和expected的值。测试方法中直接调用divide方法,再使用assertEquals方法对结果进行断言。JUnit会自动将数据源中的数据传入测试方法中,依次执行测试。
例3:使用外部数据源
```
@RunWith(Parameterized.class)
public class CalculatorTest {
private int dividend;
private int divisor;
private int expected;
public CalculatorTest(int dividend, int divisor, int expected) {
this.dividend = dividend;
this.divisor = divisor;
this.expected = expected;
}
@Parameters
public static Collection<Object[]> data() throws IOException {
List<Object[]> list = new ArrayList<>();
BufferedReader reader = new BufferedReader(new FileReader("testdata.csv"));
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split(",");
int dividend = Integer.parseInt(parts[0]);
int divisor = Integer.parseInt(parts[1]);
int expected = Integer.parseInt(parts[2]);
list.add(new Object[] { dividend, divisor, expected });
}
reader.close();
return list;
}
@Test
public void testDivide() {
int actual = divide(dividend, divisor);
assertEquals(expected, actual);
}
public int divide(int dividend, int divisor) {
if (divisor == 0) {
throw new IllegalArgumentException("Cannot divide by zero!");
}
return dividend / divisor;
}
}
```
在这个例子中,@Parameters注解指定了一个数据源data(),它从外部文件testdata.csv中读取数据。测试方法中使用divide方法计算结果,并使用assertEquals方法对结果进行断言。JUnit会自动将外部数据源中的数据传入测试方法中,依次执行测试。