您将如何在Java中对整数范围进行单元测试?

时间:2018-07-10 13:14:51

标签: java unit-testing tdd junit5

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

我要测试的是传递给要测试的方法(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()抛出一个数字,该数字对于我先前指定的免除方案可能会失败也可能不会失败。

1 个答案:

答案 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。团队成员应该了解为什么需要测试。如果您遇到有人在没有测试的情况下添加某些内容的情况,那就不是测试问题。您无法捕获所有此类更改,这是不值得的。只能通过代码审查来解决。