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

Ste*_*ers 0 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
Run Code Online (Sandbox Code Playgroud)

这是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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

filter 1 gets
    - field 1: values 1/2/3
    - field 2: values 2/3/4
    - etc.
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Eri*_*ert 6

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

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

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

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

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

原因二:未指定"正确".

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

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

对于Frob这样Bladgh是Gnusto的正确的bin总是FrotzBin.

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

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