0

我有以下代码来确定两个周期是否相交并想证明它是正确的:

public static bool Intersect(this DateTime start1, DateTime end1, DateTime start2, DateTime end2)
{
    return (start1 == start2) || (start1 > start2 ? start1 <= end2 : start2 <= end1);
}

经过几次尝试,我能想到的最好的办法就是将一堆硬编码的值扔进去。

在进行这项研究的过程中,我发现了这个问题的SO 答案,它使用了非常简单的语法

return (StartA <= EndB) and (EndA >= StartB) 

无论哪种方式,有人可以告诉我对日期相交方法进行单元测试的最有效方法是什么?

4

2 回答 2

1

根据描述,您有两个日期范围

1) 开始 1...结束 1

2) 开始 2...结束 2

你想看看它们是否重叠

那么,有哪些可能

A) 错误案例

End1 < Start1
End2 < Start2

B) 精确重叠

Start1 == Start2, End1 == End2, Start1 == End1
Start1 == Start2, End1 == End2, Start1 < End1

C) 没有重叠

Start1 < End1 < Start2 < End2
Start1 == End1 < Start2 < End2
Start1 < End1 < Start2 == End2
Start1 == End1 < Start2 == End2

D) 完全重叠

Start1 == Start2 < End2 < End1
Start1 == Start2 == End2 < End1
Start1 < Start2 < End2 < End1
Start1 < Start2 == End2 < End1
Start1 < Start2 < End2 == End1
Start1 < Start2 == End2 == End1

E) 部分重叠

Start1 < Start2 < End1 < End2

认为这是很多。它假定范围是有序的(Start1 <= Start2)。
您可能需要将案例加倍,首先传递第二个范围。答案应该仍然相同(重叠不依赖于顺序),但实现可能隐式依赖于 (Start1 <= Start2) 并且如果以其他方式输入日期则失败。

以上每一个都成为一个测试用例。
注意:如果不允许 0 长度(开始 == 结束)范围,它们将成为错误情况,可以从其他部分中删除。

对于一个简单的函数,有很多测试用例,但是您有 4 个变量(每个日期)以及它们之间的一组关系,并且每个关系组合都会给出不同的答案。

您需要决定是否值得为此付出努力,或者选择最常见和“最有可能导致算法问题”(非常主观)的案例就足够了。

我希望这是您正在寻找的并且有用的,
艾伦。

于 2012-04-25T09:54:44.003 回答
0

您应该使用所有可能的输入值组合来测试您的方法。这样,您不仅要测试有效输入,还要测试无效输入。使用描述有效(预期)输入以及无效(意外但可能)输入的示例输入值。这就是通常应该如何进行测试,以便人们可以证明他们的代码可以按预期工作。

于 2012-04-25T02:29:05.180 回答