如何断言从 BDD 测试发送到 restful 网络服务的请求(带有 nunit 的规范流)

How to assert the request sent to restful web service from a BDD test (specflow with nunit)

我正在为客户的新需求编写 BDD 风格的测试。

简单介绍一下被测系统的背景。我们有一个正在侦听 TCP 端口的 windows 服务。这个windows服务负责处理客户端在端口上发送的消息,并响应客户端。

处理涉及

1) 根据请求找到合适的消息处理器
2)然后格式化第三方服务可以理解的请求
3) 将格式化后的请求发送给第三方Restful web服务
4) 重新格式化从 web 服务获得的响应并将其发送到客户端套接字。

出于 BDD 的目的,我们创建了一个自托管模拟 restful 服务,该服务将根据为每个请求配置的消息发送响应。

到目前为止,我们所有的测试都是基于我们发送到端口的内容以及我们在端口中得到的响应。通过这种方法,我们能够涵盖 BDD 测试中的所有功能。

现在的新要求是,如果客户端在消息正文中发送一个额外的元素,那么第三方服务也应该获得这个额外的元素。如果客户端没有在消息正文中发送额外的元素,那么我们甚至不应该将该元素发送给第三方服务。我们已经完成了此更改(使用 ShouldSerialize 方法更新了 POCO 请求 class)并且还使用日志文件测试了结果。

但我们正在努力从 BDD 测试中涵盖这一点。这是因为我们的测试充当客户端并在端口上发布消息,因为我们只能控制从端口收到的响应,我们只断言响应。我们无法控制第三方服务调用,因为它发生在 windows 服务生产代码中。

我们有什么方法可以拦截从测试发送到 restful Web 服务的请求以断言请求以检查请求的格式是否符合预期。

注意:我们使用的是 C#,specflow 和 Nunit。

我认为您唯一的选择是能够 运行 使用存根第 3 方服务进行测试,然后您可以询问该服务以检查是否被正确调用。

您可以创建一个测试代理服务,在某处记录调用以供测试检查,然后调用实际服务。您也许可以为您的初始服务使用一个简单的装饰器。

看来你有一个中间件需要有自己的测试:

{Your Application} --> {Middleware} --> {3rd Party Service}
                                                 |
{Your Application} <-- {Middleware} <------------+

您应该为独立于较大应用程序的中间件创建单元测试或功能测试,以便测试中间件的这一新功能。

在您的完整应用程序中,不要测试中间件和第 3 方服务之间的通信。这是一个你永远出不来的黑洞。您还剩下三组测试:

  1. 验证 {Your Application} <--> {Middleware} 是否正常工作
  2. 验证 {Middleware} <--> {Mock 3rd Party Service} 是否正常工作
  3. 将您的应用程序和中间件部署到正确连接这些服务的环境中,并进行一些手动测试。

user2389992 评论:

I am not able to write the test for first point from BDD because I have control only to write request to the port and assert the response on the port.

这里的关键部分是"I have control only to write request to the port and assert the response"。您的 BDD 测试不应比这更深入。该服务是一个黑盒子。你不需要知道它在做什么来测试你的主应用程序。你只需要知道 "If I send the service this, it returns me that."

您需要一套完全独立的测试以确保 middleware/service 与第 3 方服务正确交互。

最后,您需要在应用程序环境中进行第三套完全独立的手动测试,将您的应用程序、中间件和第 3 方服务连接起来,以确保这些层的集成正常工作。

您是否试图通过 BDD 测试来描述您的 API 以获得某种类型的文档?也许以下文章可能会有所帮助: http://java.dzone.com/articles/documenting-api-using