我是Junit测试的新手,我的问题是:如何为这种方法编写一个非常好的测试。 我想要一个可以涵盖所有角落案例的测试。 谢谢大家。
public static byte myMethod(byte b1) {
byte b2 = b1;
if ((b1 >> 4 & 0x0F) > 0x09)
{
b2 = (byte) (b1 & 0x0F);
}
if ((b1 & 0x0F) > 0x09)
{
b2 = (byte) (b1 >> 4);
}
if ((b2 & 0x0F) > 0x09)
{
b2 = (byte) 0xFF;
}
else
{
b2 = (byte) ((b2 & 0x0F) + 10 * (b2 >> 4 & 0x0F));
}
return b2;
}
答案 0 :(得分:0)
如果你真的想测试所有角落情况",你需要测试所有可能的输入 - 所以,你可能会这样做:
@Test
public void testByteMethod() {
// Every possible byte.
for (int b = Byte.MIN_VALUE; b <= Byte.MAX_VALUE; b++) {
byte r = myMethod((byte) b);
System.out.printf("%d = %d\n", b, r);
}
}
答案 1 :(得分:0)
为了编写单元测试,您需要一点点知道所测试方法的实现以及大概知道它应该是什么去做。你只给了我们第一位。
话虽如此,由于测试永远不会覆盖每一个可能的情况,您通常会尝试定义期望相同类型行为的输入类,并且对于每个类,您需要一个或几个示例输入。
从您的代码中,您可以推断出以下类:
(b1 >> 4 & 0x0F) > 0x09
(b1 & 0x0F) > 0x09
(b2 & 0x0F) > 0x09
(b2 & 0x0F) <= 0x09
(对于其他部分)如果这些数字集相交,您可能需要每个交集的示例以及不相交的集的部分。
代码中的每个条件块都可能具有语义含义。你应该明确这些含义。一个好的单元测试不仅测试代码的正确性,还记录了测试内容的原因/原因。
E.g。 myMethod_WhenSomeSpecificCaseHoldsTrue_ShouldSpitOutThisAndThat
对于模糊的示例名称,我感到非常抱歉,但如果没有向我们提供有关重大事项问题的信息,我无法猜出更好的名称。
答案 2 :(得分:0)
使用Arthur提出的测试用例(感谢他)这里可能是一个junit参数化测试(为简单起见省略了声明)
编辑:根据chicodoro
的建议添加评论占位符@RunWith(Parameterized.class)
/**
* Details on what the test is for
*/
public class Ess1Test {
byte b1; // input value for myMethod
byte b2; // corresponding output value for myMethod
public Ess1Test(Integer input, Integer output) {
b1 = input.byteValue();
b2 = output.byteValue();
}
@Parameters
/**
* List of pairs [ input_value, expected_result ] for myMethod
*/
public static List<Object[]> getParameters() {
return Arrays.asList(new Object[][]{
new Object[]{0xBD, -1}, // details on what the test case represents
new Object[]{0x2C, 2}, // another famous condition
});
}
@Test
/**
* Test that myMethod returns correct values on the above conditions
*/
public void testMyMethod() {
assertEquals(b2, myMethod(b1));
}
}
要添加其他一些极端情况,只需将它们添加到getParameters
中的数组即可。这是一个简单的解决方案,可以在多个条件下再次运行相同的测试。