如何最好地模拟 S4 端点来进行性能测试(负载测试)?

How best to mock S4 endpoints to do performance tests (load test)?

这与cloud sdk本身无关,更多的是关于模拟我们通常使用c sdk查询的s4端点。 我们想为我们的负载测试执行此操作,我们不希望负载测试进行到 s4 端点。我们正在考虑使用 wiremock 来模拟端点,但问题是,wiremock 本身的模拟逻辑是否会对我们采用的指标做出微不足道的贡献。如果是这样,那么该指标就会变得有些不可靠,因为我们需要应用程序性能指标而不是模拟框架的指标。

其他方法是使用专用于此的模拟服务器应用程序,这样我们就不必从应用程序进行任何模拟。只需将调用路由到模拟服务器应用程序(可能使用模拟目的地)

我想问你们,你们遇到过这个用例吗?可能是您自己,也可能来自您的消费者。想知道SAP其他团队是怎么解决这个问题的

谢谢, 萨钦

在像您这样的情况下,应该测试整个系统(包括来自外部服务的响应),我们通常建议使用 Wiremock。 这是因为 Wiremock 相当容易设置,并且在常规测试场景中运行良好。 但是,正如您还指出的那样,Wiremock 为测试代码引入了显着的运行时开销,因此使任何类型的性能测量或多或少变得无用。

因此,您可以尝试使用 Mockito 模拟 HttpClient

BasicHttpResponse page = new BasicHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, 200, "OK"));
page.setEntity(new StringEntity("hello world!));
HttpClient httpClient = mock(HttpClient.class);
doReturn(page).when(httpClient).execute(any(HttpUriRequest.class));

这可以对您的应用程序从模拟端点检索的内容进行细粒度控制,而无需引入任何类型的实际网络操作。

使用上面显示的代码显然需要您的被测应用程序实际使用模拟 httpClient。 假设您在应用程序中使用 SAP Cloud SDK,这可以通过使用 returns 您的模拟客户端的自定义实现覆盖 HttpClientAccessor 中使用的 HttpClientCache 来实现,如下所示:

class MockedHttpClientCache implements HttpClientCache
{
    @Nonnull
    @Override
    public Try<HttpClient> tryGetHttpClient(@Nonnull final HttpDestinationProperties destination, @Nonnull final HttpClientFactory httpClientFactory) {
        return Try.of(yourMockedClient);
    }

    @Nonnull
    @Override
    public Try<HttpClient> tryGetHttpClient(@Nonnull final HttpClientFactory httpClientFactory) {
        return Try.of(yourMockedClient);
    }
}

// in your test code:
HttpClientAccessor.setHttpClientCache(new MockedHttpClientCache());