我有一个具有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个(完全猜测)那些被抓住的物体,不应该 - 并且出于各种原因。为了知道,我必须与另一个系统的用户一起检查每个过滤器,以了解每个过滤器的结果集是否正确。与此相反的情况也在我的脑海中徘徊......那应该抓住的所有物体怎么样,但事实并非如此。
我开始认为这可能是需求收集中的一个问题,而不是测试。
答案 0 :(得分:6)
听起来你没有明确的规格。如果您没有明确的规范,那么您怎么可能知道代码是否按照规范运行?
退后一步。首先写一个一句话规范:
FrobFilter组件采用一系列Frobs,并将每一个放在正确的FrobBin中,直到一个bin已满。
好的,现在你已经有了规格。它还不是可测试或可实现的规范。为什么不?两个原因。原因一:未指定在Frob序列用完之前没有FrobBin填满的结果。
原因二:未指定“正确”。
现在写一个解决每个问题的一句话规范。
如果序列在某个bin已满之前结束,则会通知管理员。
Brobgh是Gnusto的Frob正确的bin总是FrotzBin。
好的,现在你还有两个问题。如何通知管理员?如果Frob的Blargh不是Gnusto会怎么样?
继续分解,一次一句,直到你有一个完整而准确的规范。然后你会发现你的规范,实现的程序,以及测试用例都看起来非常像彼此。这是一个非常棒的情况。
答案 1 :(得分:2)
听起来你应该分别测试这些过滤器中的每一个,并在每个过滤器的“下面”使用模拟过滤器。
希望每个过滤器都很简单,并且可以简单地进行测试。
然后,当它全部接通时,我会对整个事情进行一些集成测试。