代码之家  ›  专栏  ›  技术社区  ›  Steven Evers

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

  •  0
  • Steven Evers  · 技术社区  · 15 年前

    我有一个7个相关领域的持久对象。

    这些字段可以保存下面列出的值的数目:

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

    这是一个潜在的121600独特的对象。

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

    总而言之,有9个过滤器在一个责任链中运行,每个过滤器将对象放在一个箱子中,直到箱子装满为止,此时链条退出。链中的最后一个过滤器只是一个“过滤器”,它向管理员发送一封电子邮件,指出对象的运行速度很低(即,如果链到达这个过滤器,则垃圾箱没有满,需要查看一些内容)。

    所以我的问题是:如何测试这些过滤器?我可以使用一系列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.
    

    但是结果显示了如此多的边缘情况,以至于每次我将它更改为包含特定的情况时,都会有其他一些情况中断(我没有回归测试来确保它不会中断),而且很难找出特定问题在链中发生的位置。

    edit>我正在尝试单独测试筛选器,但是假定:

    过滤器1抓取121600个可能对象中的500个(根据过滤器的标准)。我发现,比方说100个(完全猜测)被抓取的物体,不应该是,原因也不尽相同。为了知道,我必须和另一个系统的用户一起检查每个过滤器的结果集是否正确。与之相反的事情也在我的脑海中萦绕…所有本该被抓住但却没有的东西呢?

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

    2 回复  |  直到 15 年前
        1
  •  6
  •   Eric Lippert    15 年前

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

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

    frobfilter组件获取一系列frob,并将每个frob放入正确的frobbin中,直到一个箱满为止。

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

    原因一:在frob序列耗尽之前没有frobbin填充的结果尚未指定。

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

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

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

    对于一个frob,比如blargh是gnusto,正确的bin总是frotzbin。

    好吧,现在你还有两个问题。如何通知管理员?如果frob的blargh不是gnusto怎么办?

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

        2
  •  2
  •   Jon Skeet    15 年前

    听起来您应该单独测试每个过滤器,在每个过滤器的“下面”都有一个模拟的过滤器。

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

    然后我会对整个系统进行一些集成测试,当它全部连接起来时。