如何从一个RESTful api的TDD开始

gra*_*hez 8 java tdd

我正在尝试练习TDD并做一些练习.有一个现有的服务部署在互联网上的公共RESTful api.对此api的每个请求都需要一些数据准备,如有效的请求字符串构造,一些加密,一些正文消息格式化等.我想使用TDD为此服务编写通用客户端.

我知道它不像StringCalculator kata那么简单,需要一些不同的方法.

我不知道如何开始.我想在不使用真实服务的情况下测试它,因此需要一些假的impl.编写一些假实现,将它部署在localhost并从我的测试中调用它会更好吗?或者也许模拟一个负责发送http请求的类?

我希望我的客户端使用如下:

public class ServiceClientTest {
   @Test
   public void testSendStoreRequest() {
        ServiceClient client = new ServiceClient("app_key", "private_key")
        ClientResponse response = client.sendStoreRequest(StorageType.NORMAL,     "string_to_store");
       assertEquals("200", response.getStatus());
   } 
}
Run Code Online (Sandbox Code Playgroud)

你能指点我如何开始这个吗?我应该自下而上并编写所有组件(用于创建请求字符串,加密等),然后在ServiceClient中使用它们,或者我应该从ServiceClient测试和实现自上而下和模拟开始?

Woj*_* B. 5

首先,不要模拟外部API.为什么?因为你不拥有它们.

您问题的理想解决方案似乎就是您开始描述的内容.你应该在项目中创建一个接口你自己,那将代表外部服务.

public interface CalculatorService {
    int add(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)

这将是您的测试边界.所有的UNIT和ACCEPTANCE测试都应该针对模拟或存根运行CalculatorService.他们会很快.您可以这样做,因为您定义了该合同(该接口实际意味着什么).

稍后,您将拥有一个进入远程HTTP休息服务的实现:

class RemoteRestCalculator implements CalculatorService {
    public int add(int a, int b) {
        // call the remote service in here
    }
}
Run Code Online (Sandbox Code Playgroud)

你需要测试这个合同(边界).因此,您将编写集成测试RemoteRestCalculator.您还可以使用几个端到端测试运行应用程序RemoteRestCalculator来测试接线等.

现在,回答你的问题,如何测试RemoteRestCalculator

  1. 理想情况下,您将在测试环境中部署真正的http rest服务的实例,将其指向测试数据库等.因此,您与拥有该服务的人员交谈,他们为您提供*.war文件并进行部署在本地使用测试数据库等.有时他们会为您执行此操作,即"沙箱"部署该服务..然后RemoteRestCalculator针对该实例编写针对该运行的测试.
  2. 另一种解决方案与您提到的类似.创建"http休息服务模拟器".然后在本地部署它.诀窍在于,您必须为您在该模拟器中使用的所有功能复制真实的服务行为.因此,模拟器"添加"方法必须与真实方法相同.这个解决方案有很多强大的优点和缺点.然后你RemoteRestCalculator针对该模拟器编写针对该运行的测试.
  3. 有一种中间解决方案,在业界普遍使用.您只需针对实际服务(或有时是模拟器)的本地测试部署运行所有测试.在这种情况下,当您进行大量测试时,测试套件可能非常慢.不建议. 关于制作版本的进一步阅读更快.
  4. 还有一种常用的解决方案,在大多数情况下不推荐使用.你创建了一个"http rest stub class",有点像mockito mock,但总是通过http进行讨论.所以通常它会启动一个http服务器,你会在使用它之前填充它.它有许多缺点而不是优点.最大的缺点是服务的行为(外部依赖)分散在应用程序的许多测试中.不建议.


Chr*_*ton 0

我想这取决于...

如果您认为您可能会使用 fake impl 进行其他测试等,那么这似乎是一个可行的方法,即使不仅仅是模拟它。

我将从模拟开始,看看它是如何发展的。