gpt4 book ai didi

java - 如何在 java 中对一系列整数进行单元测试?

转载 作者:行者123 更新时间:2023-12-02 11:01:57 27 4
gpt4 key购买 nike

我这里有一个非常简单的场景,我只是想知道如何编写一个足够有效的测试用例来捕获将来的回归问题。

我想要测试的是传递给我的测试方法(SUT)的参数是否在有效范围内。

代码

public class LengthValidator{
public static final int MAX_LENGTH = 300;
public boolean isValid(String pattern){
if (pattern.length() < 0 || pattern.length() > MAX_LENGTH){
return false;
}
return true;
}
}

测试

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.ArrayList;
import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class LengthValidatorTest {

@DisplayName("Should validate pattern of varied lengths against maxValue=" + LengthValidator.MAX_LENGTH)
@ParameterizedTest(name = "test: {index} => pattern of length: {0} should result into: {1}")
@MethodSource(value = "createPatternsWithVariedLength")
public void testShouldVerifyDiffernetLengthsOfPattern(int patternLength, boolean expectedResult) {
//given
String pattern = createPatternString(patternLength);

//when
boolean result = LengthValidator.validatePattern(pattern, new ArrayList<>());

//then
assertEquals(expectedResult, result);

}

private static Stream<Arguments> createPatternsWithVariedLength() {
return Stream.of(
Arguments.of(0, true)
Arguments.of(LengthValidator.MAX_LENGTH - 1, true),
Arguments.of(LengthValidator.MAX_LENGTH, true),
Arguments.of(LengthValidator.MAX_LENGTH + 1, false));
}

private String createPatternString(int length) {
StringBuilder patternBuilder = new StringBuilder();
for (int i = 0; i < length; i++) {
patternBuilder.append("G");
}
return patternBuilder.toString();
}

}

我当前的单元测试足以满足此功能吗?有没有一种有效的方法可以为 0<pattern.length()<500 编写测试这样,对于假设开发人员在此范围内添加豁免的情况,当前测试应该失败?例如

if (pattern.length() <  0 || pattern.length() > MAX_LENGTH || pattern.length()==20){
return false;
}

PS:我知道我可以使用随机,但测试仍然依赖于 random() 抛出一个数字,对于我之前指定的豁免场景,该数字可能会失败,也可能不会失败。

最佳答案

让我们想象一下以下情况:

void validateUserName(String name){

if(!VALID_NAME.equals(name){
throw new BadNameException();
}

}

使用您的方法,您必须检查世界上的所有单词,以防万一有人将异常添加到 if 条件中。好像不对吧?

相反,我会测试以下内容:

成功案例:数字在 0..300 范围内

失败案例:数字超出范围

极端情况:数字等于 0 或 300。

附:团队成员应该理解为什么需要测试。如果遇到有人在没有测试的情况下添加某些内容的情况,那么这不是测试问题。你无法捕捉到所有此类变化,而且这是不值得的。只能通过代码审查来解决。

关于java - 如何在 java 中对一系列整数进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51266260/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com