我这里有一个非常简单的场景,我只想知道如何编写一个足够有效的测试用例,以在将来捕获回归问题。
我要测试的是传递给要测试的方法(SUT)的参数位于有效范围内。
代码
class A {
public:
static std::shared_ptr<A> create() {
return std::make_shared<A>();
}
protected:
friend class std::shared_ptr_access;
A() {}
A(const A &) = delete;
const A &operator =(const A &) = delete;
};
测试
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
PS:我知道我可以使用随机变量,但是仍然可以依靠random()抛出一个数字,该数字对于我先前指定的免除方案可能会失败也可能不会失败。
答案 0 :(得分:0)
让我们想象以下情况:
type ArrayKeyInner<T, Key extends keyof T> =
Key extends any ? T[Key] extends any[] ? Key : never : never
type ArrayKey<T> = ArrayKeyInner<T, keyof T>
使用您的方法,您必须检查世界上所有的单词,以防万一有人将if条件添加例外。好像错了吧?
相反,我会测试以下内容:
成功案例:数字范围为0..300
失败案例:数字超出范围
小写字母:数字等于0或300。
p.s。团队成员应该了解为什么需要测试。如果您遇到有人在没有测试的情况下添加某些内容的情况,那就不是测试问题。您无法捕获所有此类更改,这是不值得的。只能通过代码审查来解决。