0

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

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

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

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

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

总而言之,有 9 个过滤器在一个责任链中运行,每个过滤器将对象放入一个 bin 中,直到 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 个(完全猜测)被抓取的物体,不应该——而且出于各种原因。为了知道,我必须与另一个系统的用户一起检查每个过滤器的结果集是否正确。与此相反的情况也萦绕在我的脑海中……那些本应该被抓住但没有被抓住的物体呢?

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

4

2 回答 2

6

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

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

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

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

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

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

现在写一个一句话来解决每个问题。

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

Blargh 是 Gnusto 的 Frob 的正确 bin 始终是 FrozBin。

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

只要继续分解它,一次一个句子,直到你有一个完整和准确的规范。然后你会发现你的规范、实现的程序和测试用例看起来都非常相似。这是一个很棒的情况。

于 2009-07-23T18:44:31.477 回答
2

听起来您应该分别测试每个过滤器,并在每个过滤器“下方”链接一个模拟过滤器。

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

然后,当一切都连接好后,我会对整个事情进行一些集成测试。

于 2009-07-23T17:52:13.250 回答