接口测试 [okHttp] 统计接口响应用时 TTFB

bauul · 2019年04月10日 · 最后由 bauul 回复于 2019年04月13日 · 1916 次阅读

缘由

我们在做接口测试时,统计的响应时间是从发请求之前,到收到响应后,整个接口测试用例执行的时间,但这个时间不能准确反应服务端的响应处理时间

论坛的网络请求:

本司线上网络请求:

两张图都是 Chrome 的 network 页面中 Timing 信息,整个网络请求包含几块:

  1. Queueing
  2. Stalled -- 网络连接用时,可能会有网络延迟
  3. Request sent
  4. Waiting
  5. Content download

问题点很明显,当 Stalled 用时较长时,会影响整个接口用例执行时间,进而影响结果的准确度,那么如何统计准确的 Waiting 时间呢?

基础概念

  • TTFB: “最初的网络请求被发起” 到 “从服务器接收到第一个字节前” 所花费的毫秒数

问题分析

简单来说,就是在三次握手成功后,记一个开始时间,收到服务端响应的第一个字节,再记一个结束时间,这个时间就是 Waiting 了

pom

<okhttp3.version>3.10.0</okhttp3.version>

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>${okhttp3.version}</version>
</dependency>

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>logging-interceptor</artifactId>
    <version>${okhttp3.version}</version>
</dependency>

实施方法

法一:现有 API

response.receivedResponseAtMillis() - response.sentRequestAtMillis()

法二:使用拦截器

public class NetworkInterceptorRecord implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {

        Request request = chain.request();
        long startReq = System.currentTimeMillis();

        Response response = chain.proceed(request);

        long endReq = System.currentTimeMillis();
        System.out.println("TTFB:"+(endReq - startReq));

        return response;
    }
}


        httpsClient = new OkHttpClient().newBuilder()
                .connectTimeout(timeout, SECONDS)
                .readTimeout(timeout, SECONDS)
                .writeTimeout(timeout, SECONDS)
                .hostnameVerifier((s, sslSession) -> true)
                .sslSocketFactory(createSSLSocketFactory())
                .addNetworkInterceptor(new NetworkInterceptorRecord())
                .build();

结果

这两个方法基本上拿到的结果是一致的

思考

  1. 我得找开发去问一问,为啥我们公司的请求每次都要建立连接了

讨论

大家是如何统计接口的响应时间的?欢迎留言

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 5 条回复 时间 点赞

header 请求的 connection 是不是设置成 keep-live?
参考文章:https://blog.csdn.net/zhaohongyan6/article/details/70841456

CC 回复

嗯,看请求头是有这个参数的,可能要问下后端同学了,可能服务端未配置

bauul 回复

现在 spring 有些框架默认是不开启长连接的,开发需要代码上额外处理下

CC 回复

嗯,我问问开发去

CC 回复

跟青云有关系,现在都用的云服务,然而云服务商相关的配置功能并没有到位

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册