热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WebkitLayoutTest理论部分1+深入分析部分2–LayoutTest:

原文:blog.csdn.netyajun0601articledetails8887332当我开始做WebKit开发的时候,令我好奇的一件事儿就是这玩艺儿怎么测试。作为一个Web开发者,我清楚浏览器渲染引擎有多少bug(尽管现在情况好了很多),以及日益复杂的web页面给浏览

原文 : http://blog.csdn.net/yajun0601/article/details/8887332 当我开始做 WebKit 开发的时候,令我好奇的一件事儿就是这玩艺儿怎么测试。作为一个 Web 开发者,我清楚浏览器渲染引擎有多少 bug (尽管现在情况好了很多),以及日益复杂的web 页面给浏览

原文 :

http://blog.csdn.net/yajun0601/article/details/8887332

当我开始做 WebKit 开发的时候,令我好奇的一件事儿就是这玩艺儿怎么测试。作为一个 Web 开发者,我清楚浏览器渲染引擎有多少 bug (尽管现在情况好了很多),以及日益复杂的web 页面给浏览器引擎带来多大的挑战。伴随bug 一起工作多年自然是要极力避免的事情,所以强制对规范的遵从和避免倒退就显得很关键。


WebKit 的解决方案就是 layout tests。 从最简单层面来说,layout tests 就是提交到 WebKit 源码库中的一堆简单的网页(越简单越好)和期望的渲染结果文件( golden files),有文本也有图片。测试脚本( run-webkit-tests)使用一个内嵌了 WebKit 的应用(DumpRenderTree)遍历测试用例(现在有30000多了),然后对比这些测试用例的渲染结果和期望结果(golden files),最后将失败、崩溃、超时以及其他和期望不一致的结果生成报告。WebKit 项目中有让 layout test 在已经移植的所有平台上持续运行的编译机,这样就可以容易得发现那些有问题的改动(一旦发现就回滚)。


鼓励开发者在提交代码前先运行 layout tests。最简单的方式是使用 commit queue,它会自动完成测试的执行。如果不这样,在工作站上运行全部测试用例也是可行的,目前运行一遍大约耗时15分钟,如果使用Dirk Pranke 的 multi-process test runner 时间可以缩短至约 4 分钟或者更少。
通过合理的使用测试数据,layout tests 可以被用来验证很多东西,从 Javascript 引擎规范一致性到重绘以及 WebSocket 协议的实现。对于类似后者需要访问网络的情况,测试脚本会启动一个本地服务器(Apache, lighthttpd, 或者 WebSocket),然后从服务器上运行测试。本地 HTTP 服务器对模拟网络边界情况也是有用的;让我我觉得很可笑的是,在过去六个月的WebKit 工作中,我被迫学习和使用更多的PHP,比我过去六年做Web开发使用的还要多。


对于比较简单的测试,他们更多采用了单元测试的形式(比如使用断言),有一个辅助的框架可以让这样的测试很容易的搭建起来。对应的期望结果文件里只是一条条的 "success" 描述。


考虑到 layout test 不仅仅测试了渲染、布局,同时也包含了 Javascript bindings的单元测试,网络堆栈的交互测试,数量级性能测试等等,大家也会偶尔讨论到"layout test" 这个名字越来越不精确。也正是由于这样的灵活性,layout test 模型在引入第三方测试套件的时候也有很好的表现。作为 layout test 的一部分,我们还运行了 Sputnik Javascript 一致性套件,Philip Taylor 的 canvas 套件,以及 HTML5 解析套件,和更多其他浏览器厂商的测试用例。



接下来的一篇会讨论 layout test 系统一些实际的东西,如果要了解更多,请移步 the WebKit wiki.


=============================================================================================

深入分析WebKit之Layout Tests

来自内部一个分享PPT整理过程的知识点,没有特别组织。

Layout Test主流程:


运行的指令:

run-webkit-tests [选项] 测试脚本文件或所在的目录
主要的参数有:

--verbose 显示详细的信息

--no-build 不要尝试重新编译dumprendertree

--debug 使用Debug版本进行测试

--help 显示所有选项信息


0. 测试方法的归纳

i. 静态测试 (测试结果是通过比对最终网页输出来决定的。)

四种检测方法:

Render tree, Body Text, Pixel Data, Ref Test

(Body Text没有格式信息,而Pixel Data没有文本信息,所以两者是配合使用,以Body Text为主。)

Ref Test是以HTML页面的形式比对。不匹配的结果以图片形式存储。


ii. 动态测试 (测试结果在执行过程中动态决定。但仍输出到网页,通过静态测试的方式报告出来。)

动态测试的判断方法和静态测试相同。差异在于比对的内容已经是测试的结果。就是Javascript脚已经根测试条件和数据,判断出测试成功或失败。然后静态测试的机制输出结果。


测试用例的构成:

a.测试用HTML文件 (必须在LayoutTests目录下)

{testname}.html

b.基准文件 (Baseline)

. {testname}-expected.txt -> Body Text

. {testname}-expected.png -> Pixel Test

. {testname}-expected.html -> Ref Test

. {testname}-expected-mismatch.html -> Ref Test

c.说明

. missmatch类型的测试只有Ref Test支持

. Ref Test具有排它性,如果当前CaseRef Test, 不会再对其它内容检测。

*关于Audio的比对,脚本里相关内容,但没有再分析。

*第一次跑测试时,没有比较标准,LayoutTest会自动生成xxx-expected.txt 或xxxx-expected.png。

*所有测试的网页必须放到LayoutTests目录下。


1. 不要在网页中输出日期或时间。

(动态变化的内容是不可以拿来比对的)


2. 整个Test Case运行时间不能超过30s。详见另一篇文章。


3. js-test-re.js (配合js-test-post.js使用) 中定义了若干结果确认的函数,如shouldBeTrue.

如:


运行的结果:

FAIL totalCount == 3 should be true. Was false.


其它函数有:shouldBe,shouldBeCloseTo,shouldNotBe,shouldBeFalse,sholdBeNaN,shouldBeNull,shouldBeZero,

shouldBeEqualToString,shouldBeEmptyString,shouldBeDefined,shouldBeUndefined,shouldThrow…

详细地内容可以查看js-test-pre.js脚本。



4. LayoutTests/canvas/tests/23.canvas.reference.html

...

FAIL (fallback content)



    _assertSame定义在LayoutTests/canvas/test.js中.


    所有canvas 2D测试使用同相同的id以方便测试脚本执行。


    工作方式 (test.js中的实现):



    测试成功就在网页输出一个Pass, 否则输出错误信息。这样达到比对结果的目的。


    另一个函数:_assertPixel (2d.clearRect.nonfinite.html)

    _assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");


    函数定义:

    _assertPixel(canvas, x,y, r,g,b,a, pos, colour)

    pos和colors是代表坐标和颜色的两个字串。函数内没有使用。

    pos : "x,y"

    color: "r,g,b,a"


    函数列表:

    _assert

    _assertSame (===)

    _assertDifferent (!==)

    _assertEqual (==)

    _assertMatch (match) 正则表达式匹配

    _assertPixel

    _assertPixelApprox <-可以允许颜色有一点偏差


    _requireManualCheck 因为一些原因取不到数据,可能需要人工检查确认。



    5.对于pixel test,除了dumpAsText()参数设为true, 在运行run-webkit-tests也要指定--pixel参数。 Expected的图像以PNG存储。PNG文件会被保存到对应的platform目录下。

    a. 抓下的图像仅限于可视区域。

    b. 因为字体渲染的原因,尽量不要涉及文本内容。

    c. 因为原生控件(native control)是由系统绘制,不同系统间有差异性。

    参考WebKit的这篇文章。


    6. overridePreference (key, value)

    用于在脚本中动态修改Preference的&#20540;。可用的Keys:

    WebKitEnableCaretBrowsing

    WebKitUsePreHTML5ParserQuirks

    *更多的定义在WebPreferencesPrivate.h


    7. Windows下使用LayoutTest的字体问题

    参考:http://trac.webkit.org/wiki/BuildingOnWindows (Font-metric-related failures)

    8. 完整的testController方法列表:

    对照代码LayoutTestController.cpp中LayoutTestController::staticFunctions()的定义

    9. 默认的网页视图大小 (DumpRenderTree)

    W3C SVG测试: 480x360

    其它测试:800x600

    *定义在LayoutTestController.cpp:2563 lines, 在函数sizeWebViewForCurrentTest中使用。

    都是常量定义,没有参数可以修改。


    10. 自带DOM测试用例。使用selfhtml.js 和 同html同名的js文件。

    selfhtml.js 提供测试入口函数startTest和9个assert operation供使用: assertSize, assertEqualsCollectionAutoCase

    xxxx.js则提供runTest的实现供startTest调用。

    startTest执行:

    a. waitUntilDone

    b. runTest

    c. notifyDone


    11. 黄金法则:

    a. 对于Pixel Test, 尽量不要涉及文本。

    b. 测试内容不要涉及动态内容,如时间、日期等。

    推荐阅读
    • 一句话解决高并发的核心原则
      本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
    • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
      本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
    • 文章目录简介HTTP请求过程HTTP状态码含义HTTP头部信息Cookie状态管理HTTP请求方式简介HTTP协议(超文本传输协议)是用于从WWW服务 ... [详细]
    • 目录爬虫06scrapy框架1.scrapy概述安装2.基本使用3.全栈数据的爬取4.五大核心组件对象5.适当提升scrapy爬取数据的效率6.请求传参爬虫06scrapy框架1. ... [详细]
    • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
    • 知识图谱——机器大脑中的知识库
      本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
    • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
    • mac php错误日志配置方法及错误级别修改
      本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
    • PHP组合工具以及开发所需的工具
      本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
    • Tomcat安装与配置教程及常见问题解决方法
      本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
    • 前言对于从事技术的人员来说ajax是这好东西,都会使用,而且乐于使用。但对于新手,开发一个ajax实例,还有是难度的,必竟对于他们这是新东西。leo开发一个简单的ajax实例,用的是 ... [详细]
    • Python爬取豆瓣数据实现过程解析
      这篇文章主要介绍了Python爬取豆瓣数据实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值, ... [详细]
    • 表单提交前的最后验证:通常在表单提交前,我们必须确认用户是否都把必须填选的做了,如果没有,就不能被提交到服务器,这里我们用到表单的formname.submit()看演示,其实这个对于我们修炼道 ... [详细]
    • Itwasworkingcorrectly,butyesterdayitstartedgiving401.IhavetriedwithGooglecontactsAPI ... [详细]
    • Iwouldliketobeabletohaveasidebarthatcanbetoggledinandoutonabuttonpress.However ... [详细]
    author-avatar
    快乐俱乐部老巢_260
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有