首页 > 解决方案 > 如何最好地模拟 S4 端点来进行性能测试(负载测试)?

问题描述

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

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

我的问题是,你们遇到过这个用例吗?也许你自己,或者也许来自你的消费者。我想知道 SAP 的其他团队是如何解决这个问题的。

谢谢,萨钦

标签: sap-cloud-sdk

解决方案


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

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

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

推荐阅读