当前位置: 首页 > news >正文

一站式网站建设服务商天津做网站哪家好

一站式网站建设服务商,天津做网站哪家好,网站建设大赛海报,互联网公司排名2021完整版1.背景 当前闲鱼在精益开发模式下#xff0c;整个技术团队面临了诸多的能力落地和挑战#xff0c;尤其是效能方面的2-1-1的目标(2周需求交付周期#xff0c;1周需求开发周期#xff0c;1小时达到发布标准)#xff0c;具体可见 闲鱼工程师是如何构建持续集成流水线#x…1.背景 当前闲鱼在精益开发模式下整个技术团队面临了诸多的能力落地和挑战尤其是效能方面的2-1-1的目标(2周需求交付周期1周需求开发周期1小时达到发布标准)具体可见 闲鱼工程师是如何构建持续集成流水线让研发效率翻倍的 在这个大目标下就必须把每个环节都做到极致。自动化的建设是决定CI成败的关键能力今天分享一下闲鱼Android客户端性能自动化环节的实践。 2.面临的问题 2.1 主要是两个方面的问题 工具缺失 目前淘宝系对于线上性能水位的监控有一套完善的体系但是针对新功能的性能测试每个业务团队都有对应的性能专项小组产出的工具都是根据自己业务特点的定制开发的闲鱼客户端目前使用Flutter做为客户端主开发语言对于Flutter性能数据的获取及UI自动化测试支撑工具目前是缺失的同时业界对Flutter自动化和性能相关的实践几乎没有 测试工作量翻N倍(N一个版本周期内的分支数) 原先的开发模式是功能测试集成测试一起进行的所以性能测试只需要针对集成后的包进行测试即可到现在转变为泳道的开发模式一个版本内会一般包含十几个左右的泳道分支甚至更多我们必须确保每个泳道的分支的性能是达标的如果有性能问题需要第一时间反馈出来如果遗留到集成阶段问题的排查(十几个分支中筛查)问题的解决将会耗费大量的时间效率很难得到大的提升 2.2 问题思考 体系化解决要让每个泳道分支都得到有效测试覆盖测试件能够自动化执行持续反馈结果 3. 解决方案 综合上述问题梳理如下解决方案 针对Flutter性能数据的获取(比如Flutter有自己的SurfaceView原有Native计算FPS的方式无法直接使用)针对Flutter UI自动化的实现(Flutter/Native UI混合栈的处理)性能自动化脚本 / 性能数据自动采集、上报 融入CI流程性能问题的通知 / 报表展示 / 分析 3.1 性能数据 [FPS] 解析处理 adb shell dumpsys SurfaceFlinger --latency 的数据详细请见文末参考链接(该方式兼容Flutter及Native的解决方案已在Android4.x-9.x验证可行)处理SurfaceFlinger核心代码如下 dumpsys SurfaceFlinger --latency-clear #echo dumpsys SurfaceFlinger... if [[ $isflutter 0 ]];thenwindowdumpsys window windows | grep mCurrent | $bb awk {print $3}|$bb tr -d } # Get the current windowecho $window fi if [[ $isflutter 1 ]];thenwindowdumpsys SurfaceFlinger --list |grep ^SurfaceView|$bb awk NR1{print $0} if [ -z $window ]; then windowSurfaceView fi echo $window fi $bb usleep $sleep_t dumpsys SurfaceFlinger --latency $window|$bb awk -v time$uptime -v target$target -v kpi$KPI {if(NR1){r$1/1000000;if(r0)r$1/1000;b0;n0;w1}else{if(n0$0)O1;if(NF3$2!0$2!9223372036854775807){x($3-$1)/1000000/r;if(b0){b$2;n1;d0;D0;if(x1)Cr;if(x1){d1;Cint(x)*r;if(x%10)Cr};if(x2)D1;mr;o0}else{c($2-b)/1000000;if(c1000){O1}else{n1;if(cr){Cc;if(ckpi)o1;if(cm)mc;if(x1)d1;if(x2)D1;b$2}else{Cr;bsprintf(%.0f,br*1000000)}}};if(n1)ssprintf(%.3f,$2/1000000000)};if(n0O1){O0;if(n1)tsprintf(%.3f,sC/1000);else tsprintf(%.3f,b/1000000000);Tstrftime(%F %T,timet).sprintf(%.0f,(timet)%1*1000);fsprintf(%.2f,n*1000/C);msprintf(%.0f,m);gf/target;if(g1)g1;hkpi/m;if(h1)h1;esprintf(%.2f,g*60h*20(1-o/n)*20);print s,t,T,f0,n,d,D,m,o,e,w;n0;if($0){b0;w1}else{b$2;n1;d0;D0;if(x1)Cr;if(x1){d1;Cint(x)*r;if(x%10)Cr};if(x2)D1;mr;o0}}}} $file [CPU] 使用的是top的命令获取(该方式获取性能数据时数据收集带来的损耗最少) export bb/data/local/tmp/busybox $bb top -b -n 1|$bb awk NR4{print NF-1} [内存] 解析 dumpsys meminfo $package 拿到 Java Heap,Java Heap Average,Java Heap Peak,Native Heap,Native Heap Average,Native Heap Peak,Graphics,Unknown,Pss 数据 do_statistics() {((COUNT1))isExist$(echo $OUTPUT | grep Dalvik Heap) if [[ ! -n $isExist ]] ; thenold_dumpsystrueelseold_dumpsysfalsefiif [[ $old_dumpsys true ]] ; thenjava_heap$(echo $OUTPUT | grep Dalvik | $bb awk {print $6} | $bb tr -d \r)elsejava_heap$(echo $OUTPUT | grep Dalvik Heap[^:] | $bb awk {print $8} | $bb tr -d \r)fiecho 1.$JAVA_HEAP_TOTAL 2.$java_heap 3.$JAVA_HEAP_TOTAL((JAVA_HEAP_TOTALjava_heap))((JAVA_HEAP_AVGJAVA_HEAP_TOTAL/COUNT))if [[ $java_heap -gt $JAVA_HEAP_PEAK ]] ; thenJAVA_HEAP_PEAK$java_heapfiif [[ $old_dumpsys true ]] ; thennative_heap$(echo $OUTPUT | grep Native | $bb awk {print $6} | $bb tr -d \r)elsenative_heap$(echo $OUTPUT | grep Native Heap[^:] | $bb awk {print $8} | $bb tr -d \r | $bb tr -d \n)fi((NATIVE_HEAP_TOTALnative_heap))((NATIVE_HEAP_AVGNATIVE_HEAP_TOTAL/COUNT))if [[ $native_heap -gt $NATIVE_HEAP_PEAK ]] ; thenNATIVE_HEAP_PEAK$native_heapfig_StrGraphicsif [[ $OUTPUT *$g_Str* ]] ; thenecho Found Graphics...Graphics$(echo $OUTPUT | grep Graphics | $bb awk {print $2} | $bb tr -d \r)elseecho Not Found Graphics...Graphics0fiUnknown$(echo $OUTPUT | grep Unknown | $bb awk {print $2} | $bb tr -d \r)total$(echo $OUTPUT | grep TOTAL|$bb head -1| $bb awk {print $2} | $bb tr -d \r) } [流量] 通过 dumpsys package packages 解析出当前待测试包来获取流量信息 uid$(dumpsys package packages|$bb grep -E Package |userId|$bb awk -v OFS {if($1Package){Psubstr($2,2,length($2)-2)}else{if(substr($1,1,6)userId)print P,substr($1,8,length($1)-7)}}|grep $package|$bb awk {print $2}) echo Net:$uid initreceive$bb awk -v OFS NR1{if($2wlan0){wr[$4]$6;wt[$4]$8}else{if($2rmnet0){rr[$4]$6;rt[$4]$8}}}END{for(i in wr){print i,wr[i]/1000,wt[i]/1000,wifi};for(i in rr){print i,rr[i]/1000,rt[i]/1000,data}} /proc/net/xt_qtaguid/stats | grep $uid|$bb awk {print $2} inittransmit$bb awk -v OFS NR1{if($2wlan0){wr[$4]$6;wt[$4]$8}else{if($2rmnet0){rr[$4]$6;rt[$4]$8}}}END{for(i in wr){print i,wr[i]/1000,wt[i]/1000,wifi};for(i in rr){print i,rr[i]/1000,rt[i]/1000,data}} /proc/net/xt_qtaguid/stats | grep $uid|$bb awk {print $3}echo initnetarray$initreceive,$inittransmit getnet(){local data_tdate %Y/%m/%d %H:%M:%Snetdetail$bb awk -v OFS, -v initreceive$initreceive -v inittransmit$inittransmit -v datat$data_t NR1{if($2wlan0){wr[$4]$6;wt[$4]$8}else{if($2rmnet0){rr[$4]$6;rt[$4]$8}}}END{for(i in wr){print datat,i,wr[i]/1000-initreceive,wt[i]/1000-inittransmit,wifi};for(i in rr){print datat,i,rr[i]/1000-initreceive,rt[i]/1000-inittransmit,data}} /proc/net/xt_qtaguid/stats | grep $uidecho $netdetail$filenet } 3.2 性能自动化脚本 基于Appium的自动化用例这个技术业界已经有非常多的实践了这里我不再累述如果不了解的同学可以到Appium官网 http://appium.ioFlutter和Native页面切换使用App内的Schema跳转Flutter页面的文本输入等交互性较强的场景使用基于Flutter框架带的Integration Test来操作An integration test Generally, an integration test runs on a real device or an OS emulator, such as iOS Simulator or Android Emulator. The app under test is typically isolated from the test driver code to avoid skewing the results. Flutter的UI自动化及Flutter/Native混合页面的处理在测试上的应用后续单独开文章介绍原理相关可以先参考 千人千面录制回放技术 3.3 性能自动化CI流程 3.4 性能数据报表 FPS相关 Framediff: 绘制帧的开始时间和结束时间差FPS: 每秒展示的帧数Frames: 一个刷新周期内所有的帧jank: 一帧开始绘制到结束超过16.67ms 就记一次jankjank非零代表硬件绘制掉帧和屏幕硬件性能及相关驱 动性能有关jank2: 一帧开始绘制到结束超过33.34ms 就记一次jank2MFS: 在一个刷新周期内单帧最大耗时每两行垂直同步的时间差代表两帧绘制的帧间隔OKT: 在一个刷新周期内帧耗时超过16.67ms的次数SS: 流畅度通过FPSMFSOKT计算出来流畅度 实际帧率比目标帧率比值60【目标帧率越高越好】 目标时间和两帧时间差比值20【两帧时间差越低越好】 (1-超过16ms次数/帧数)*20【次数越少越好】4. 成果展示 4.1 指定泳道分支性能监控 泳道分支出现了性能问题再报表上一目了然 4.2 性能专项支撑 1、Flutter商品详情页重构 14轮测试 2、客户端图片统一资源测试 4轮测试 5. 总结 性能自动化只是整个CI流程中的一个环节为了极致效率的大目标闲鱼质量团队还产出了很多支撑工具CI平台遍历测试AI错误识别用例自动生成等等后续也会分享给大家。 原文链接 本文为云栖社区原创内容未经允许不得转载。
http://www.zqtcl.cn/news/941654/

相关文章:

  • 凡科做的网站推效果网站做seo第一步
  • 建设在线观看视频网站免费企业网站建设免费
  • 网站开发需要后台吗哪家建站公司好
  • 个人建设网站论文网站视频怎么做的
  • 不同类型的购物网站汉川网站建设
  • 网站开发需求文档范文广州公司网站托管
  • 网站制作公司官网首页撸撸撸做最好的导航网站
  • 网站建设毕业设计综述centos 安装wordpress lnmp
  • 济宁专业做网站网站建设中 html
  • 中国排名高的购物网站最新发布的手机2022
  • 备案的网站名与公司名称出国用哪个地图app好
  • 网站建设工作室图片文章资讯类网站
  • 深圳自助建站系统网站题目有哪些
  • 郑州做网站kuihuakeji软文发布的平台与板块
  • 一那个网站可以做一建题安全文化企业示范企业评价标准
  • 网站没有关键词收录phpstudy配置网站
  • 返利网站怎么做的做网站推广见客户的话术
  • 两个人看的视频在线观看成都网站seo厂家
  • 做汽车配件出口用什么网站好些微信朋友圈营销技巧
  • 怎样建设传奇网站空间什么做电子书下载网站
  • 自己怎么做dj 视频网站网站模板制作教程视频
  • 苏州瑞熙网站建设签名图片在线制作
  • 重庆建站模板大全给公司创建网站
  • king cms网站建设上海传媒公司有哪些
  • 优时代网站建设网站建设哪家公司最好
  • 做网站有多难平面设计学徒要学多久
  • 包装网站模板做西式快餐店网站
  • 泉州制作网站软件九歌人工智能诗歌写作网站
  • wordpress安装时失败网站后台seo设置
  • 顺企网吉安网站建设网站设计师岗位职责