使用JBehave编写逻辑测试是否有意义?

时间:2011-09-17 06:34:47

标签: java unit-testing bdd collaboration jbehave

我最近遇到过JBehave,我认为我们应该使用它。所以我打电话给我们团队的测试员,他也认为应该使用它。

以此为出发点,我已经要求测试人员为测试应用程序编写故事(Bob叔叔的Bowling Game Kata)。在一天结束时,我们会尝试将他的测试映射到保龄球比赛。

我期待这样的测试:

Given a bowling game
When player rolls 5
And player rolls 4
Then total pins knocked down is 9
相反,测试人员带来了“逻辑测试”,换句话说,他并没有那么具体。但是,就他而言,这是一个有效的测试。

Given a bowling game
When player does a regular throw
Then score should be calculated appropriately

我的问题是模棱两可,什么是'常规投掷'?什么是“适当的”?当其中一个步骤失败时,它意味着什么?

然而,测试人员说人类确实理解并且我正在寻找的是“物理测试”,其中写起来比较麻烦。

我可能会将“常规”映射为滚动两次4(仍然没有余地,也没有罢工),但感觉就像我再次做一个我不想做的翻译。

所以我想知道,你怎么接近这个?你是如何编写JBehave测试的?当你没有编写这些测试时,你是否有任何经验,你必须将它们映射到你的代码?

5 个答案:

答案 0 :(得分:2)

他的测试是有效的,但需要一定的域知识,没有框架会有。自动化测试应该是明确的,将它们视为示例。编写它们比编写“逻辑测试”的成本更高,但从长远来看,这是有效的,因为它们可以非常快速地重放,并立即给予反馈。

你应该与他配对,编写第一个测试,把它放在正确的方向。也许您可以给他测试,并要求他通过添加新测试来增加覆盖范围。

答案 1 :(得分:1)

验收标准所需的明确程度取决于开发团队与业务涉众之间的信任级别。

在您的示例中,业务假设开发人员/测试人员对保龄球有足够的了解以确定正确的结果。

但想象一个更复杂的领域,比如金融。为此,最好有更明确的例子来确保对要求有一个很好的理解。

或者,假设你有一个场景:

Given I try to sign up with an invalid email address
Then I should not be registered

为此,开发人员/测试人员可能比业务利益相关者更好地了解有效或无效电子邮件地址的构成。您仍然希望针对各种地址进行测试,但这可以在步骤定义中指定,而不是在场景级别公开。

答案 2 :(得分:1)

我讨厌“期望值”“恰当”这样模糊的词语。 “适当”只是用于测试的“有毒词”的一个例子,如果没有消除,这种“方法”可以普及,有效地杀死测试。对于人类测试者来说,它可能“足够”,但这种“测试用例”只有在第一次尝试进行探索性“烟雾测试”时才可接受。

无论可重现性,系统性和自动化程度如何,每个测试用例都必须具体。(不仅仅是“应该” ...以假设“愿意”的柔软性可以被允许?相反,我使用现在时 “应该是”甚至更好严格“是”,作为声明确认/拒绝。)和一旦涉及自动化,此规则就是绝对的。

你的测试人员做了什么,而不是一个“测试区域”,一个“场景模板”,而不是一个真实的测试案例:因为可以产生很多可能的测试结果...... 在您的场景中,您是特定的:这是一个非常具体的真实“测试案例”。可以自动化您的测试用例,很好:您可以将其委派到计算机上并根据需要自动进行评估。 (自动报告的奖励,来自持续集成服务器)

但是“空测试场景模板”?它也有一些价值:它是一个“场景模板”,一个准备由数据填充的空骨架:所以我喜欢将这些情况命名为“滴滴涕”:“数据驱动测试”。

想象一下要测试的网络表单,其10个输入的验证,交叉验证......以及提交按钮。每个输入可以有10个测试用例:

  • 空的;
  • 带着炭,但无论如何还是太短;
  • 服务器的时间太长,但允许在表单中进行复制粘贴和进一步编辑;
  • 无效的字符......

我建议的方法是准备一组传递数据:甚至生成它们(从数据库甚至是随机数据),无论你能预测什么,都应该通过测试,即“快乐的场景”。将数据放在一边,作为数据模板,并使用它来初始化表单,填充它,然后制止一些单一的值:创建测试用例“失败”。对于每一个输入,即10个输入中的每个输入(即使在交叉规则尝试之前的100个测试情况),每次输入也是10次...然后,在服务器拒绝表单的100次之后,填写通过传递数据的形式,不会扭曲它们,因此最终可以接受表格。 (接受在服务器应用程序上提交更改状态,因此需要作为最后一个,以测试同一应用程序状态下的所有101个案例)

要以这种方式进行测试,您需要做两件事:

  • 空场景模板,
  • 和一个包含100行数据的表格:
    • 10列输入数据:只有一个值被操纵,从表中逐行传递(即听说过格雷码?),
    • 可能将继承历史记录保存在行描述中,其中from是派生的行以及如何通过哪个被操纵的值。
    • 同样是第11列,“预期结果”列填写:传递/失败预期状态,预期错误/验证消息,参考要求,用于测试 - coveradge跟踪。 (即见过FitNesse?)
    • 当执行测试时,还可能还有用于跟踪单行测试用例的历史的真实检测结果的列。 (所以CI服务器已经提到了)

要将一方的“空方案骨架”与另一方的“数据表驱动测试”结合起来,确实需要一些机制。您的数据需要导入。因此,您可以在excel中准备行,这也可以在理论上导入,但为了更轻松的生活,我建议使用CSV,属性,XML或任何机器和人类可读格式,文本格式。

答案 3 :(得分:0)

他的“逻辑测试”与测试计划或TODO列表中的“测试常规保龄球得分”具有相同的信息内容。但它要长得多,因此更糟糕。

只有在测试团队负责生成包含更多信息的测试时,才使用jbehave才有意义。否则,获取TODO列表并在JUnit中对其进行编码会更有效。

答案 4 :(得分:0)

我喜欢和#34;恰当的#34;在"预期值"。您需要使用黄瓜或其他包装作为通用文档。如果您正在使用它来覆盖并指定所有可能的场景,那么您可能会浪费大量时间滚动浏览数百个功能文件。