你将如何测试过滤复杂对象的东西?

时间:2009-07-23 17:46:43

标签: c# unit-testing chain-of-responsibility

我有一个具有7个相关字段的持久对象。

字段可以包含此处列出的值的数量:

Field    # of Possible Values
1        5
2        20
3        2
4        2
5        19
6        2
7        8

这是121600个独特对象的潜力。

正在测试的代码是一些过滤器,它们根据字段的值获取一定数量的这些对象,然后将它们放入一个bin以供另一个系统使用。 bin存放是微不足道的,经过测试,并且工作正常...只是过滤不起作用。似乎有许多边缘情况没有被覆盖,许多对象被放置在垃圾箱中时根本不应该被选中,反之亦然。

总而言之,有9个过滤器在一系列责任中运行,每个过滤器将物体放入箱子直到箱子装满,此时链条退出。链中的最后一个过滤器只是一个“过滤器”,它向管理员发送一封电子邮件,指出对象运行不足(即,如果链到达此过滤器,则bin未满,并且需要看看)。

所以我的问题是:我如何测试这些过滤器?我可以使用一系列for语句创建每个唯一类型的对象之一:

public void FixtureSetup()
{
    for(each possible value for field 1)
    {
        for(each possible value for field 2)
        {
            // ... continue with 5 more for statements

            // Create Object with each value
        }
    }
}

但是尝试手动确定哪些对象应该从生成的集合(甚至是过滤对象的集合)中正确过滤将是非常困难的(如果可能的话,我会在第一次编写过滤器时轻松完成它)。

我知道要求是错误的,因为他们说的是:

filter 1 gets
    - field 1: values 1/2/3
    - field 2: values 2/3/4
    - etc.

但是结果显示了很多边缘情况,每次我改变它以包括那个特定情况,其他东西都会中断(我没有回归测试来确保它没有)并且很难找到哪里在链中发生了特定的问题。

编辑>我试图单独测试过滤器,但假设如下:

过滤器1抓取121600个可能对象中的500个(根据过滤器的标准)。我发现,对100个(完全猜测)那些被抓住的物体,不应该 - 并且出于各种原因。为了知道,我必须与另一个系统的用户一起检查每个过滤器,以了解每个过滤器的结果集是否正确。与此相反的情况也在我的脑海中徘徊......那应该抓住的所有物体怎么样,但事实并非如此。

我开始认为这可能是需求收集中的一个问题,而不是测试。

2 个答案:

答案 0 :(得分:6)

听起来你没有明确的规格。如果您没有明确的规范,那么您怎么可能知道代码是否按照规范运行?

退后一步。首先写一个一句话规范

FrobFilter组件采用一系列Frobs,并将每一个放在正确的FrobBin中,直到一个bin已满。

好的,现在你已经有了规格。它还不是可测试或可实现的规范。为什么不?两个原因。

原因一:未指定在Frob序列用完之前没有FrobBin填满的结果。

原因二:未指定“正确”。

现在写一个解决每个问题的一句话规范。

如果序列在某个bin已满之前结束,则会通知管理员。

Brobgh是Gnusto的Frob正确的bin总是FrotzBin。

好的,现在你还有两个问题。如何通知管理员?如果Frob的Blargh不是Gnusto会怎么样?

继续分解,一次一句,直到你有一个完整而准确的规范。然后你会发现你的规范,实现的程序,以及测试用例都看起来非常像彼此。这是一个非常棒的情况。

答案 1 :(得分:2)

听起来你应该分别测试这些过滤器中的每一个,并在每个过滤器的“下面”使用模拟过滤器。

希望每个过滤器都很简单,并且可以简单地进行测试。

然后,当它全部接通时,我会对整个事情进行一些集成测试。