DateTime交叉方法的单元测试

时间:2012-04-25 02:20:40

标签: .net unit-testing date intersection

我有以下一些代码来确定2个句点是否相交并想要证明它是正确的:

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

经过几次尝试后,我能想到的最好的就是将一堆硬编码的值投入其中。

在进行这项研究的过程中,我发现SO answer在这个问题上使用了

的非常简单的语法
return (StartA <= EndB) and (EndA >= StartB) 

无论哪种方式都可以告诉我什么是单元测试日期交叉方法的最有效方法?

2 个答案:

答案 0 :(得分:1)

根据说明,您有两个日期范围

1)Start1 ... End1

2)Start2 ... End2

你想看看它们是否重叠

那么,有什么可能性

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&lt; = Start2)。
你可能需要加倍案例,先传入第二个范围。答案应该仍然是相同的(重叠不依赖于顺序)但是实现可能隐含地取决于(Start1&lt; = Start2),如果以另一种方式输入日期则失败。

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

对于一个简单的函数来说,有很多测试用例,但是你有4个变量(每个日期)和它们之间的一组关系,关系数据的每个组合给出了不同的答案。

您需要确定对此进行全面的详尽测试是否值得付出努力,或者选择最常见且'最有可能导致算法问题(非常主观)的情况是否足够。< / p>

我希望这是你正在寻找的东西,并且很有用,
艾伦。

答案 1 :(得分:0)

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