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

简介: 转载请注明出处:http://blog.csdn.net/horkychen WebKit的回归测试是由一组脚本构成的Layout Tests,测试内容是测试的网页和标准结果(Baseline)。

转载请注明出处: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>
<head>

</head>

<body>

    <div id="dd"></div>


    <script>
    if (window.testRunner)
    {
    testRunner.dumpAsText(true);
    }
    
totalCount = 20;
        text = "";
        nOld= -1;
        var handle;

        function repaint()
        {
            var now = new Date();
            
             str = "<b>" + now + "</b>####" ;
            
            if(-1==nOld)
            {
            nOld=now.getTime();
            str+= "  <span style=\"color:#0000FF;\"]] > Begin</span><div />"
            }
            else
            {
            nDiff = now.getTime()-nOld;
            if(  Math.abs(nDiff-2000) >=5 )
            {
            str+= "<span style=\"color:#FF0000;\"]]
>
NG ("+nDiff+")</span><div />"
            }
            else
            {
              str+= "<span style=\"color:#0000FF;\"]] > OK</span><div />"
            }
            nOld=now.getTime();
            }
            
            text = str + text;
            document.getElementById('dd').innerHTML = text;
            
            totalCount--;
            
            if( 0 == totalCount )
            {
            	clearInterval(handle);
            	if (window.testRunner) 
            	{
    			testRunner.notifyDone();
    	     	}
            }
        }   

        handle = setInterval(repaint, 2000);
        
        if (window.testRunner)
        {
        testRunner.waitUntilDone(); //Ask testRunner to wait the script done.
        }

    </script>

</body>

</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/

目录
相关文章
|
25天前
|
安全 Linux 测试技术
提升龙蜥内核测试能力!探究持续性模糊测试优化实践
清华大学软件学院对Anolis OS使用靶向模糊测试方法将测试工作引向修改的代码,进而提高对业务代码的测试能力。
|
1月前
|
运维 监控 持续交付
构建高效自动化运维体系:策略与实践
在数字化时代,企业IT基础设施的管理和维护变得日益复杂。为了提高效率、降低错误率并快速响应市场变化,构建一个高效的自动化运维体系至关重要。本文将探讨自动化运维的核心策略,并通过实际案例分析展示如何将这些策略应用于日常管理中,以实现IT运维的优化。
17 0
|
1天前
|
运维 监控 安全
构建高效自动化运维体系:策略与实践
【4月更文挑战第25天】在数字化转型的浪潮中,企业IT基础设施日趋复杂多变,传统的手动运维模式已难以满足快速响应和高效管理的需求。本文探讨了构建一个高效自动化运维体系的关键环节,并结合实际案例分析,提出了一系列切实可行的策略与实践方法。文章着重分析了自动化工具选择、流程设计优化以及持续监控的重要性,并讨论了如何通过这些手段降低运维成本,提升系统稳定性和安全性。
|
2天前
|
测试技术 API 网络架构
Python的api自动化测试 编写测试用例
【4月更文挑战第18天】使用Python进行API自动化测试,可以结合`requests`库发送HTTP请求和`unittest`(或`pytest`)编写测试用例。以下示例: 1. 安装必要库:`pip install requests unittest` 2. 创建`test_api.py`,导入库,定义基础URL。 3. 创建继承自`unittest.TestCase`的测试类,包含`setUp`和`tearDown`方法。 4. 编写测试用例,如`test_get_users`,检查响应状态码和内容。 5. 运行测试:`python -m unittest test_api.py`
12 2
|
10天前
|
敏捷开发 监控 前端开发
深入理解自动化测试框架Selenium的架构与实践
【4月更文挑战第16天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加快迭代速度的关键手段。Selenium作为一种广泛使用的自动化测试工具,其开源、跨平台的特性使得它成为业界的首选之一。本文旨在剖析Selenium的核心架构,并结合实际案例探讨其在复杂Web应用测试中的高效实践方法。通过详细解读Selenium组件间的交互机制以及如何优化测试脚本,我们希望为读者提供深入理解Selenium并有效运用于日常测试工作的参考。
15 1
|
11天前
|
自然语言处理 测试技术 API
深入理解自动化测试框架Selenium的设计理念与实践
【4月更文挑战第15天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加速迭代的关键手段。Selenium作为一种广泛使用的自动化测试框架,提供了对多种浏览器和平台的支持,极大地促进了Web应用的功能测试。本文旨在剖析Selenium的核心设计理念,探讨其在实际项目中的应用,并指出常见的误区及最佳实践,以期帮助测试工程师更高效地利用Selenium进行测试工作。
|
11天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
11天前
|
测试技术 持续交付 Docker
Django中的自动化部署与持续集成实践
【4月更文挑战第15天】本文介绍了Django项目中自动化部署与持续集成的实践方法。自动化部署通过选择Ansible、Fabric或Docker等工具,编写部署脚本,配置持续集成工具(如Jenkins、GitLab CI),确保服务器环境一致,实现快速应用上线。持续集成则涉及配置版本控制系统,设置自动化构建和测试,编写全面的测试用例,集成代码质量检查工具,并配置通知机制,以提升代码质量和开发效率。这两者结合能有效提升项目的迭代速度和可靠性。
|
12天前
|
人工智能 运维 监控
构建高效自动化运维体系的实践与思考
【4月更文挑战第14天】在数字化转型的浪潮中,自动化运维作为提升系统稳定性和效率的关键手段,受到了企业的广泛关注。本文将深入探讨如何构建一个高效的自动化运维体系,涵盖从基础设施的搭建到流程的优化等多个方面。通过分析当前自动化运维的挑战及解决方案,文章旨在为读者提供一套实用的策略框架,帮助企业实现运维工作的高效化、标准化和智能化。
|
18天前
|
运维 监控 Kubernetes
构建高效自动化运维体系的实践与思考
【4月更文挑战第8天】在数字化时代,IT基础设施的复杂性日益增加,传统的手工运维模式已经难以满足快速响应和高效率的需求。本文将探讨如何通过自动化工具和策略构建一个高效的自动化运维体系,旨在提高系统的稳定性、减少人为错误以及优化资源分配。文章首先分析了自动化运维的必要性,接着介绍了实现自动化的关键技术和工具,并通过案例分析展示自动化运维体系的实际效果。最后,对自动化运维的未来发展趋势进行了展望。

热门文章

最新文章