如何在非常复杂的业务规则上实现BDD?

时间:2013-12-03 05:30:00

标签: web-services unit-testing moq bdd mspec

我正在学习单元测试和BDD的艺术,在我的公司里,没有人遵循这种方法。我自己尝试了很多但是在某个地方遇到困难并且在尝试了几天之后就放弃了。过了一段时间后,我再次从某人那里获得灵感,并尝试再次学习在这些水域游泳。

我最近开发了一个小型的Windows服务,但结果却是一个混乱的业务规则。以下是该服务的简要概述。

  1. 登录数据库“服务启动...”

  2. 从需要发布到其他网络服务的数据库获取数据

  3. 如果没有数据要发布到数据库“没有要处理的数据......” 并退出服务

  4. 如果数据包含重复值,请记录到数据库“重复数据 发现,此记录将被跳过。“

  5. 更新找到重复数据的记录的状态 对某事例如302

  6. 如果数据为空,则记录到数据库“记录包含空值,无法处理。”

  7. 适当更新记录的状态,例如310

  8. 如果由于某种原因数据库不可用或已关闭,请登录文件“数据库已关闭...”

  9. 如果服务中断,我们必须将数据日志发布到数据库“接收服务已关闭。”

  10. 登录数据库“退出服务...”

  11. 所以我的服务基本上从数据库中检索一些数据,从中创建JSON请求并将其发布到另一个服务。

    它还解析来自该服务的响应,并记录数据是否成功发布。我刚刚输入了一些当前在服务中实现的业务规则,以便让您了解底层的内容。我正在学习BDD和单元测试,并且真的很想知道专家如何编写测试这些复杂业务规则的测试用例?

    根据我的理解,BDD不需要在内部关注服务的编写方式,而是测试服务应该满足的场景。例如

    执行具有重复数据的Windows服务时

    • 它应该登录到数据库“找到重复数据,此记录将是 跳过“。
    • 它应该将记录的状态更新为302

    我可以编写多个场景来测试服务的某些功能。这是正确的方法还是我应该在每次测试中测试每个业务规则的非常大的场景集?

    其次,当服务与数据库以及Web服务进行通信时,如何测试服务发送和接收的HttpRequest和HttpResponse?

    最后,我如何实际测试与上面编写的业务规则一样复杂的东西,如果我简单断言服务调用某个类的某个特定方法就足够了?我们怎么知道只需调用某个方法就可以执行正确的任务?

1 个答案:

答案 0 :(得分:2)

一些简单的想法,以帮助保持透视:

  1. 你说学习......
    牢记这一点,不要挂在完美,正确或恰当的东西上。你正在学习,随意犯错误,并知道你会随着时间的推移而改进。坚持下去,继续练习,你会变得更好,你做得越多就会感觉更自然,你想的就越多。
  2. BDD测试行为。
    您可以使用它来表示系统应该以特定方式运行,这意味着它必须是系统。有时候你可能仍然存在一些虚拟服务(比如伪造的信用卡处理服务),但在大多数情况下,你希望这可以证明系统可以根据需要运行。将它们视为更多集成测试。
  3. 您的BDD测试应该推动您的单元测试。
    编写BDD测试失败,然后让它决定应该编写哪些单元测试,以使系统按预期运行。这实际上意味着您的每个BDD测试也将引入一组单元测试。
  4. 总之,让BDD驱动TDD 并且你将拥有适当的测试平衡。起点是第一次BDD测试。
  5. 在您的方案中,如果您的系统应该提醒用户他们正在尝试添加副本,那么这是一个有效的测试。

    测试Http请求和响应的烦人之处在于你最终会进行字符串比较,但这是可行的。 BDD测试应该只关心系统如您所期望的那样响应。

    单元测试应该根据您正在进行的操作进行隔离,因此您需要在Web服务中进行单元测试以确保其正确响应,但是您不会在外部调用Web服务进行单元测试;提取出来。

    这一切都可以变得非常具有哲学性,并且这可能会成为良好的单元测试与进行良好行为测试的结果,但希望这有助于您开始前进。