WebKit自动化回归测试之LayoutTest实践 (超时问题的处理)

本文主要是介绍WebKit自动化回归测试之LayoutTest实践 (超时问题的处理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载请注明出处:http://blog.csdn.net/horkychen

WebKit的回归测试是由一组脚本构成的Layout Tests,测试内容是测试的网页和标准结果(Baseline)。其测试脚本执行的基本方式示意如下:

 *脚本会启动http服务器以支持网页加载,在此不做描述。


而每个网页里面都含有测试用的JavaScript脚本, 主要因为有一些DOM对象被动态注入了供JavaScript本使用。(关于如何添加这个DOM对象,可以参考这篇文章的第二种情况。代码在WebCoreTestSupport.cpp::injectInternalsObject()) 。这些对象中就是testRunnereventSenderGCControllertextInputControllerinternals。它们的功能是和DumpRenderTree交互。可以交互的内容列在这里了:

     Write Layout Tests for DumpRenderTree

 

测试脚本其实就是JavaScript脚本加上这些新对象。需要注意在使用这些对象前最好检查一下,保持一个兼容性,如官网给的例子:

    <script>

    if (window.testRunner)

    {

    testRunner.dumpAsText(true);

    }

   ……


使用WebKit提供的脚本就可以开始测试了: (以下是在WebKit目录下执行)

 Tools/Scripts/run-webkit-tests --verbose --debug [目标目录]

  *更多选项,使用Tools/Scripts/run-webkit-tests --help可以看到。


下面讲一个实作,中间要解决一个关于时间控制的问题。


先架环境,下载了Webkit后,还需要从Webkit的代码库中导出LayoutTest。在WebKit目录执行:

  svn export http://svn.webkit.org/repository/webkit/trunk/LayoutTests/ LayoutTests

 

等吧!有1.5G之大,我可是下了两天。


说明一下测试目标。测试一下JS Engine对时间控制的准确性。写了一段JS脚本,会每隔两秒输出当前时间及与上次的时间差。所以Document加载完成后,脚本还需要运行一段时间。好在testRunner提供waitUntilDonenotifyDone可以使用。waitUntilDone表示测试程序要等待脚本发送notifyDone才表示测试用例执行结束,然后才能收集结果。否则DumpRenderTree当网页加载完成后,就后直接Dump,然后走人,而这个时候,这个测试脚本还什么都没发生呢。


测试的网页如下:

[html]  view plain copy print ?
  1. <html>  
  2. <head>  
  3.   
  4. </head>  
  5.   
  6. <body>  
  7.   
  8.     <div id="dd"></div>  
  9.   
  10.   
  11.     <script>  
  12.     if (window.testRunner)  
  13.     {  
  14.     testRunner.dumpAsText(true);  
  15.     }  
  16.       
  17. totalCount = 20;  
  18.         text = "";  
  19.         nOld= -1;  
  20.         var handle;  
  21.   
  22.         function repaint()  
  23.         {  
  24.             var now = new Date();  
  25.               
  26.              str = "<b>" + now + "</b>####" ;  
  27.               
  28.             if(-1==nOld)  
  29.             {  
  30.             nOld=now.getTime();  
  31.             str+= "  <span style=\"color:#0000FF;\"]] > Begin</span><div />"  
  32.             }  
  33.             else  
  34.             {  
  35.             nDiff = now.getTime()-nOld;  
  36.             if(  Math.abs(nDiff-2000) >=5 )  
  37.             {  
  38.             str+= "<span style=\"color:#FF0000;\"]]  
  39. >  
  40. NG ("+nDiff+")</span><div />"  
  41.             }  
  42.             else  
  43.             {  
  44.               str+= "<span style=\"color:#0000FF;\"]] > OK</span><div />"  
  45.             }  
  46.             nOld=now.getTime();  
  47.             }  
  48.               
  49.             text = str + text;  
  50.             document.getElementById('dd').innerHTML = text;  
  51.               
  52.             totalCount--;  
  53.               
  54.             if( 0 == totalCount )  
  55.             {  
  56.                 clearInterval(handle);  
  57.                 if (window.testRunner)   
  58.                 {  
  59.                 testRunner.notifyDone();  
  60.                 }  
  61.             }  
  62.         }     
  63.   
  64.         handle = setInterval(repaint, 2000);  
  65.           
  66.         if (window.testRunner)  
  67.         {  
  68.         testRunner.waitUntilDone(); //Ask testRunner to wait the script done.  
  69.         }  
  70.   
  71.     </script>  
  72.   
  73. </body>  
  74.   
  75. </html>  


然后把脚本放到LayoutTests目录下:

执行Tools/Scripts/run-webkit-tests脚本,指定运行脚本的目录就可以了。不幸的是出错了。

 

看到是Time-Out的问题(脚本执行时加上--verbose可以看到更多的细节),前面的测试脚本会运行至少20*2s, 也就是至少需要40秒的时间。而run-webkit-tests默认的时间为35s (执行时脚本也有输出),所以超时了。喜欢探究一下的,可以看看Scripts/webkitpy/layout_tests/controllers/manager.py


 run-webkit-tests提供了一个参数可以指定自己的TimeOut设定。

     --time-out-ms=TIME_OUT_MS  (针对所有测试用例)


将Time-Out时间设为70秒再试一次:

     Tools/Scripts/run-webkit-tests --verbose --debug --no-build --no-retry --time-out-ms=70000 xxxxx

结果仍然出错了。真正的问题来了。

 

这里关于分析过程省略500字……


最终发现, DumpRenderTree还有一个对于waitUntilDone/notifyDone的限定。默认在收到waitUntilDone后,超过30秒没有接到notifyDone,就算超时。相关代码都在DumpRenderTree工程中:

     Mac OS        LayoutTestControllerMac.mm  ->waitToDumpWatchdogInterval赋值

     Windows       TestShell.cpp -> 建构函数


所以这里有两个Time-Out时间,一个是控制每个测试用例的运行时间,另一个是waitUntilDone等多久的时间。示意如下:

两个一组合,这个测试还是没过。而且后者在Mac OS的实现(Windows有入口可以改掉)是Hard Code没办法通过参数设置。我们只能强行改掉它了,关于这个问题我正在联系WebKit确认准备提交个Bug。


注意,改完后,要使用Tools/Scripts/build-dumprendertree来重新编译。在run-webkit-tests加--build帮不上你的。


然后再执行一次上面的脚本,就可以看到正常的结果了。测试的结果会被存储在与DumpRenderTree同级目录下:

*xxx-actual.txt -> 为实际dump出来的结果

*xxx-diff.txt ->差异比对结果

*xxx-expected.txt -> 标准输出

*xxx-stderr.txt -> 运行过程中的错误信息输出

 

另一种方案,修改layouttest脚本给DumpRenderTree加个--no-timeout使得每个Case几乎不用考虑超时的问题。这样做,风险就太高了,很可能卡死在某个测试用例。


补一张测试执行的示意图 (英文比较直接一点):
 

Reference:

   http://www.webkit.org/blog/1456/layout-tests-practice/

   http://trac.webkit.org/wiki/Writing%20Reftests

这篇关于WebKit自动化回归测试之LayoutTest实践 (超时问题的处理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/799928

相关文章

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测