Junit 关于边值检验的几个问题

Junit 关于边值检验的几个问题,junit,boundary,Junit,Boundary,我正在做初中作业,这里需要一些解释 以下是我作业描述中的引语: 边界条件的问题之一是,即使多次接近边界,系统也需要表现良好。这应该是显而易见的,但在实践中并不总是如此 请记住,我们可以将对象描述为状态和行为。通常,状态不是直接可访问的,而是通过行为间接访问的。也就是说,行为反映了对象的状态 现在,如果我们考虑数学中的边界,想象一下,如果我们以不同的方式接近某个边界,那么某个边界的值将不同,这可能并不太令人惊讶。因此,如果这个值可以与状态相比较,那么边界处的状态可能会根据我们如何到达那里而有所不同

我正在做初中作业,这里需要一些解释

以下是我作业描述中的引语:

边界条件的问题之一是,即使多次接近边界,系统也需要表现良好。这应该是显而易见的,但在实践中并不总是如此

请记住,我们可以将对象描述为状态和行为。通常,状态不是直接可访问的,而是通过行为间接访问的。也就是说,行为反映了对象的状态

现在,如果我们考虑数学中的边界,想象一下,如果我们以不同的方式接近某个边界,那么某个边界的值将不同,这可能并不太令人惊讶。因此,如果这个值可以与状态相比较,那么边界处的状态可能会根据我们如何到达那里而有所不同。这意味着行为可能会有所不同

要使对象行为一致,我们必须确保这些边界处的内部状态一致。所以,测试用例应该检查这个假设。要获得此作业的挑战点,请增强您的测试用例,以便发现边界附近的潜在问题。

在注释中用字符串“########”清楚地标记挑战测试用例。在这些注释中包括要测试的边界,以及根据接近边界的方式猜测对象状态可能不同的方式

我不明白这一点,尤其是突出显示的部分。他所说的“物体行为一致”和“潜在问题”是什么意思

另外,这与一般的边界检查有什么不同,它只会抛出异常,而我在JUnit中期望的是异常


谢谢大家!

在不知道家庭作业细节的情况下,答案只能有点笼统,但我会试试看

边界检查不仅仅是异常检查,它还涉及查看代码中的哪些路径在什么条件下执行。如果您有控制语句、循环、If-else、switch等,那么您必须验证这些语句是在什么条件下(内部状态)以什么方式处理的

对我来说,边界测试就是改变实例字段的某些值,从而使行为在代码的不同分支中运行

例如,您有以下行为:

if(someInstanceValue > 5) {
    return "great";
} else {
    return "poor";
}
现在,您可以使用定义边界的
someInstanceValue
数据进行测试

  • 4:“穷人”
  • 5:“太好了”
如果类中有多个字段,则所有字段都定义状态,但只有部分字段可能会影响代码中的特定路径。因为测试是被测试类的规范,是用代码编写的,所以应该指定哪些字段与函数相关,哪些字段不相关(通过省略它们)。 因此,您应该相应地设置测试中的实例(调用所有setter),或者如果您需要更复杂的对象,您可以使用类似框架的方法来指定状态(在
when().thenReturn()
语法中)

如果您想验证您是否覆盖了所有的边界,您可以使用突变测试工具对您的套件运行突变测试,如。它将翻转代码中的开关(即用代码>=替换
),以检查测试是否会失败。通常,它是改进测试方式的灵感来源

不过,作业的某些部分听起来让我有点困惑。你可以从两边接近一个边界,好吧,但是没有状态来代表边界,你要么在边界的一边,要么在边界的另一边。如果方式、接近边界一侧的方式很重要,并且对象的行为因您到达该状态的“历史”而异,则历史将成为该状态的一部分。换句话说:不同的历史=不同的状态


请记住:每个实例字段都是状态的一部分。实例字段值的每个可能组合都定义一个状态。从一个组合到另一个组合的每个转换都是通过调用行为触发的状态转换。不考虑您描述这个状态机的测试,请列出
{currentState,input}->nextState
(输入为方法调用)的三元组。这基本上就是好的测试应该具备的结构。

非常感谢!我还有一个问题:在引文中,“使对象行为一致”是什么意思?这也是我感到困惑的部分,因为对象通常不会在运行时改变其行为,因为这意味着改变字节码(行为=方法),并且因为方法实现在运行时不会改变。唯一能影响调用行为结果的是当前状态(其所有字段值的总和)。因此,在测试中,您必须确保与要测试的方法相关的所有字段都被相应地设置。如果你依赖默认值,你应该对默认值和自定义值进行单独的测试。对象具有状态(字段)和行为(方法)。在自然语言中,行为是可观察的,是状态和“活动”的组合。例如,某项活动的结果可能取决于你的内在状态,即压力水平、睡眠、饥饿等。你的行为,我们通常称之为“行为”。回到您的测试和对象,如果内部状态不同,则可能会有不同的行为(相同的方法调用两次)。这就是你在测试中指定的状态a;当方法b;好吧,这更有意义,再次感谢你的帮助!所以我们实际上只是在做一个简单的有界队列JUnit测试。只是为了确保我的理解是正确的,是吗