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

标签 web-services unit-testing moq bdd mspec

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

我最近开发了一个 Windows 服务,它开始时很小,但最终变成了一大堆杂乱无章的业务规则。以下是该服务功能的简要概述。

  1. 记录到数据库“Service starting…”

  2. 从需要发布到另一个网络服务的数据库中获取数据

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

  4. 如果数据包含重复值记录到数据库“重复数据 找到,这条记录将被跳过。”

  5. 更新发现重复数据的记录的状态 对某事,例如302

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

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

  8. 如果数据库由于某种原因不可用或宕机,登录文件“Database is down…”

  9. 如果服务宕机,我们必须将数据日志发布到数据库“Receiver service is down”。

  10. 记录到数据库“Exiting service…”

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

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

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

执行带有重复数据的windows服务时

  • 它应该记录到数据库“发现重复数据,这条记录将被 跳过了。”
  • 它应该将记录的状态更新为 302

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

其次,由于服务与数据库以及 Web 服务通信,我如何测试服务发送和接收的 HttpRequest 和 HttpResponse?

最后,如果我简单断言调用某个类的某个特定方法的服务就足够了,我该如何实际测试像上面编写的业务规则这样复杂的东西?我们怎么知道通过简单地调用一些方法它将执行正确的任务?

最佳答案

一些简单的想法有助于正确看待它:

  1. 你说学习...
    记住这一点,不要执着于什么是完美的、正确的或恰当的。你在学习,尽管犯错,但知道你会在前进的过程中有所进步。坚持下去,不断练习,你会变得更好,你做的越多,想得越多,就会感觉越自然。
  2. BDD 测试行为。
    你用它来表示系统应该以特定方式运行,这意味着它必须是系统。有时您可能仍然存入一些虚拟服务(例如虚假的信用卡处理服务),但在大多数情况下,您希望这能证明系统按需要工作。将它们更多地视为集成测试。
  3. 您的 BDD 测试应该驱动您的单元测试。
    编写失败的 BDD 测试,然后让它决定应该编写哪些单元测试以使您的系统按照您的预期运行。这实质上意味着您的每个 BDD 测试也将引入一组单元测试。
  4. 总而言之,让 BDD 驱动 TDD 并且您将拥有正确的测试平衡。起点是您的第一个 BDD 测试。

在您的场景中,如果您的系统应该提醒用户他们正在尝试添加重复项,那么这是一个有效的测试。

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

单元测试应该隔离你正在做的事情,所以你可以在你的网络服务内部进行单元测试以确保它正确响应,但你不会在调用网络服务的外部进行单元测试;而是将其提取出来。

这一切都可以变得非常哲学化,这可能涉及什么是好的单元测试与什么是好的行为测试,但希望这能帮助您开始前进。

关于web-services - 如何在非常复杂的业务规则上实现 BDD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20343591/

相关文章:

java Restful Web服务解释

java - SOAP Web 服务是否只支持 "POST"http 方法

python - 假设随机抽样

php - Laravel 5 单元测试调用方法顺序

c# - Xamarin : Testing Android application using Moq/NUnit and the MockContext?

c# - 为什么这个带有 Expression<Func<T,bool> 的模拟不匹配?

java - 在 SOAP header 请求中添加元素以进行身份​​验证

iOS 单元测试 : simulate Home Button press etc

c# - 最小起订量工作单位

web-services - 如何在 Postman 中设置 HTTP 协议(protocol)版本?