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

问题描述

这与 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,这可以通过使用返回模拟客户端的自定义实现覆盖 HttpClientCache 中使用的 HttpClientAccessor 来实现,如下所示:

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());