如何从一个RESTful api的TDD开始

时间:2011-10-17 08:25:51

标签: 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());
   } 
}

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

4 个答案:

答案 0 :(得分:5)

First of alldon't mock external APIs。为什么? Cos you don't own them

您的问题的理想解决方案似乎就是您开始描述的内容。您应该在项目中创建一个您拥有的界面,该界面将代表外部服务。

public interface CalculatorService {
    int add(int a, int b);
}

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

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

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

您需要测试此合同(边框)。因此,您只需为RemoteRestCalculator编写集成测试。您还可以使用RemoteRestCalculator运行应用程序的几个端到端测试来测试接线等。

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

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

答案 1 :(得分:0)

我想这取决于......

如果你认为你可能会将假冒的impl用于其他测试等,那么这似乎是要走的路,如果不是只是嘲笑它。

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

答案 2 :(得分:0)

Or maybe mock a class responsible for sending http request?

我认为这是要走的路。毕竟,ServiceClient负责的是:将请求转发给实际服务。

Btw:想想用TDD来实现假服务,听起来有点奇怪。

答案 3 :(得分:0)

这可能会有所帮助 https://hackernoon.com/spring-boot-rest-tdd-from-scratch-15f13ed799e0 在本文中,您可以通过Spring Boot

从头开始找到带有spring和Rest api的TDD