51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 2426|回复: 0
打印 上一主题 下一主题

[转贴] [okHttp] 统计接口响应用时 TTFB

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-10 16:26:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
缘由

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

论坛的网络请求:

本司线上网络请求:

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

  • Queueing
  • Stalled -- 网络连接用时,可能会有网络延迟
  • Request sent
  • Waiting
  • Content download

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

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

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

pom
  1. <okhttp3.version>3.10.0</okhttp3.version>

  2. <dependency>
  3.     <groupId>com.squareup.okhttp3</groupId>
  4.     <artifactId>okhttp</artifactId>
  5.     <version>${okhttp3.version}</version>
  6. </dependency>

  7. <dependency>
  8.     <groupId>com.squareup.okhttp3</groupId>
  9.     <artifactId>logging-interceptor</artifactId>
  10.     <version>${okhttp3.version}</version>
  11. </dependency>
复制代码
实施方法

法一:现有API

  1. response.receivedResponseAtMillis() - response.sentRequestAtMillis()
复制代码

法二:使用拦截器

  1. public class NetworkInterceptorRecord implements Interceptor {

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

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

  6.         Response response = chain.proceed(request);

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

  9.         return response;
  10.     }
  11. }


  12.         httpsClient = new OkHttpClient().newBuilder()
  13.                 .connectTimeout(timeout, SECONDS)
  14.                 .readTimeout(timeout, SECONDS)
  15.                 .writeTimeout(timeout, SECONDS)
  16.                 .hostnameVerifier((s, sslSession) -> true)
  17.                 .sslSocketFactory(createSSLSocketFactory())
  18.                 .addNetworkInterceptor(new NetworkInterceptorRecord())
  19.                 .build();
复制代码
结果

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

思考
  • 我得找开发去问一问,为啥我们公司的请求每次都要建立连接了
讨论

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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-20 10:42 , Processed in 0.069482 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表