关于边界值检查的问题
Questions about the Boundary Value Check
我正在做 JUnit 作业,这里需要一些解释。
引用我的作业描述:
边界条件的一个问题是,即使多次接近边界,系统也需要表现良好。这应该是显而易见的,但在实践中并不总是会发生。
请记住,我们可以将对象表征为状态和行为。通常,状态不可直接访问,而是通过行为间接访问。即行为反映了对象的状态。
现在,如果我们考虑数学中的边界,想象一下如果我们以不同的方式接近某个边界,该边界处的值会有所不同,这可能就不足为奇了。因此,如果可以将值比作状态,则边界处的状态可能会根据我们到达那里的方式而有所不同。这意味着行为可能会有所不同。
为了使对象行为一致,我们必须确保这些边界处的内部状态是一致的。所以,测试用例应该检查这个假设。要获得此家庭作业的挑战点,请增强您的测试用例,以便发现边界附近的潜在问题。
在评论中用字符串“### challenge ###”清楚地标记Challenge测试用例。在这些评论中包括正在测试的边界,以及您如何猜测对象的状态可能会因接近边界的方式而有所不同。
我不明白这一点,尤其是突出显示的部分。 "object behave consistently" 和 "potential probelms" 是什么意思?
此外,这与一般的边界检查有何不同,一般的边界检查只会抛出我在 JUnit 中预期的异常?
谢谢!
不知道作业的细节,回答只能笼统一些,不过我会试试的。
边界检查不仅仅是异常检查,它是关于查看代码中的哪些路径是在什么条件下执行的。如果你有控制语句、循环、if-else、switch 等,你必须验证在什么条件下(你的内部状态)这些语句以什么方式处理。
对我来说,边界测试是您更改实例字段的某些值,从而导致行为 运行 通过代码的不同分支。
例如,您有以下行为:
if(someInstanceValue > 5) {
return "great";
} else {
return "poor";
}
现在您可以使用定义边界
的 someInstanceValue
数据进行测试
- 4 : "poor"
- 5 : "great"
如果您的 class 中有多个字段, 所有 字段都定义了状态,但只有其中一些可能会影响代码中的特定路径。由于测试是您的 class 被测规范,用代码编写,您应该指定哪些字段与函数相关,哪些不相关(将它们排除在外)。
因此,您应该相应地设置您的被测实例(调用所有设置器),或者如果您需要更复杂的对象,您可以使用 Mockito 之类的框架来指定状态(在 when().thenReturn()
语法中)。
如果您想验证是否覆盖了所有边界,您可以 运行 使用变异测试工具 PIT 对您的套件进行变异测试。它将翻转代码中的开关(即将 <
替换为 >=
)以检查您的测试是否会失败。通常,它是改进测试方式的良好灵感来源。
尽管如此,家庭作业的某些部分对我来说听起来有点混乱。你可以从两侧接近边界,好的,但是没有代表 THE 边界的状态,你要么在边界的一侧,要么在边界的另一侧。如果顺便说一句,你如何接近边界的一侧很重要,并且对象的行为取决于你如何到达那个状态的"history",那么历史就成为状态的一部分。换句话说:不同的历史 = 不同的状态。
请记住:每个实例字段都是状态的一部分。实例字段值的每个可能 组合 都定义了一个状态。从一种组合到另一种组合的每次转换都是通过调用行为触发的状态转换。不要想你的测试描述这个状态机,列出 {currentState,input} -> nextState
的三元组(输入是方法调用)。这基本上是 Given-When-Then 好的测试应该具有的结构。
我正在做 JUnit 作业,这里需要一些解释。
引用我的作业描述:
边界条件的一个问题是,即使多次接近边界,系统也需要表现良好。这应该是显而易见的,但在实践中并不总是会发生。
请记住,我们可以将对象表征为状态和行为。通常,状态不可直接访问,而是通过行为间接访问。即行为反映了对象的状态。
现在,如果我们考虑数学中的边界,想象一下如果我们以不同的方式接近某个边界,该边界处的值会有所不同,这可能就不足为奇了。因此,如果可以将值比作状态,则边界处的状态可能会根据我们到达那里的方式而有所不同。这意味着行为可能会有所不同。
为了使对象行为一致,我们必须确保这些边界处的内部状态是一致的。所以,测试用例应该检查这个假设。要获得此家庭作业的挑战点,请增强您的测试用例,以便发现边界附近的潜在问题。
在评论中用字符串“### challenge ###”清楚地标记Challenge测试用例。在这些评论中包括正在测试的边界,以及您如何猜测对象的状态可能会因接近边界的方式而有所不同。
我不明白这一点,尤其是突出显示的部分。 "object behave consistently" 和 "potential probelms" 是什么意思?
此外,这与一般的边界检查有何不同,一般的边界检查只会抛出我在 JUnit 中预期的异常?
谢谢!
不知道作业的细节,回答只能笼统一些,不过我会试试的。
边界检查不仅仅是异常检查,它是关于查看代码中的哪些路径是在什么条件下执行的。如果你有控制语句、循环、if-else、switch 等,你必须验证在什么条件下(你的内部状态)这些语句以什么方式处理。
对我来说,边界测试是您更改实例字段的某些值,从而导致行为 运行 通过代码的不同分支。
例如,您有以下行为:
if(someInstanceValue > 5) {
return "great";
} else {
return "poor";
}
现在您可以使用定义边界
的someInstanceValue
数据进行测试
- 4 : "poor"
- 5 : "great"
如果您的 class 中有多个字段, 所有 字段都定义了状态,但只有其中一些可能会影响代码中的特定路径。由于测试是您的 class 被测规范,用代码编写,您应该指定哪些字段与函数相关,哪些不相关(将它们排除在外)。
因此,您应该相应地设置您的被测实例(调用所有设置器),或者如果您需要更复杂的对象,您可以使用 Mockito 之类的框架来指定状态(在 when().thenReturn()
语法中)。
如果您想验证是否覆盖了所有边界,您可以 运行 使用变异测试工具 PIT 对您的套件进行变异测试。它将翻转代码中的开关(即将 <
替换为 >=
)以检查您的测试是否会失败。通常,它是改进测试方式的良好灵感来源。
尽管如此,家庭作业的某些部分对我来说听起来有点混乱。你可以从两侧接近边界,好的,但是没有代表 THE 边界的状态,你要么在边界的一侧,要么在边界的另一侧。如果顺便说一句,你如何接近边界的一侧很重要,并且对象的行为取决于你如何到达那个状态的"history",那么历史就成为状态的一部分。换句话说:不同的历史 = 不同的状态。
请记住:每个实例字段都是状态的一部分。实例字段值的每个可能 组合 都定义了一个状态。从一种组合到另一种组合的每次转换都是通过调用行为触发的状态转换。不要想你的测试描述这个状态机,列出 {currentState,input} -> nextState
的三元组(输入是方法调用)。这基本上是 Given-When-Then 好的测试应该具有的结构。