前言:
眼前大家对“html元素覆盖”大体比较注重,朋友们都需要剖析一些“html元素覆盖”的相关知识。那么小编也在网上汇集了一些关于“html元素覆盖””的相关知识,希望大家能喜欢,同学们快快来学习一下吧!Yunxiao Zou ,Chunrong Fang ,Zhenyu Chen ,Xiaofang Zhang,Zhihong Zhao
南京大学软件新技术国家重点实验室,南京,中国
苏州大学计算机科学与技术学院,苏州,中国
电子邮件:zychen@software.nju.edu.cn
摘要
测试准则是软件测试的一个基本课题,其对于评估和驱动测试方法非常重要。代码覆盖由于其易实现性和有效性在软件测试中得到了广泛的应用。动态 web 技术已经被用来提高应用程序的可用性及其用户体验。然而,它带来了一些新的测试挑战,因为动态 web 应用程序在客户端和服务器端之间有更多的迭代,所以代码覆盖就很难捕获这些复杂的迭代来进行充分的测试。
本文提出了一种新的覆盖准则--hybrid 覆盖。这是一种混合覆盖准则,它结合了语句覆盖和 HTML 元素覆盖,并同时覆盖了客户端和服务器端的特性。
1. 引言
Web 应用程序已经成为应用最广泛的软件类型之一。AJAX(异步 JavaScript 和 XML 格式)作为 web2.0 核心的一项新技术,它极大地改变了 web 应用程序的开发方式。
测试是保证软件质量的主要手段。对于不同的应用程序(包括 web 应用程序),有许多现有的测试方法。为了评估和驱动测试方法,我们引入了一些覆盖标准来计算测试集使用的程序元素的百分比。
语句覆盖(Statement coverage)是一种代码覆盖,由于其易于实现性及其以较小的开销执行被测程序的特性而得到广泛应用,但是语句覆盖不足以支持 web2.0 的 web 应用程序的丰富功能。
元素覆盖(Element coverage),对于 web 应用程序来说,标准的 HTML 元素是显示内容和接收用户输入事件的基本单元。然而,仅仅基于 HTML 元素的覆盖标准有其自身的不足。
在本文中,我们提出了一种新的动态 web 应用程序的混合覆盖。它结合语句覆盖和元素覆盖来表示测试集的服务器端和客户端覆盖条件,以此来验证 web 应用程序是否得到了充分的测试。web 爬虫将创建 UI(user interface)结构,收集测试集执行的 HTML 元素和代码点,并将其用于计算混合覆盖率。
2. 混合覆盖准则
(1) HTML 元素
HTML 元素是 HTML 文档的单个组件,而 HTML 文档是 web 应用程序前端内容的基本块。每个元素都可以有特定的属性和内容。HTML 元素有三种:Void 元素、原始文本元素和普通元素。
•Void 元素只有一个包含任何属性的开始标记。
•原始文本元素由以下内容构成:标记元素开头的开始标记、一些文本内容、 一种结束标记。
•普通元素通常同时具有开始标记和结束标记以及其内容。内容可以是嵌套元素,也可以是元素和文本内容的组合。
(2) 元素覆盖
本文将 web 应用的 UI 模型定义如下:
定义 1(web 前端状态图):动态 web 应用程序 A 的 web 前端状态图 G 是一个三元组<i、V、E>,其中:
•i 是加载完成后的初始状态(通常是 web 应用的索引项)
•V 是一组状态,表示 web 应用程序 a 运行时的 DOM tree 条件。
•E⊆V×V 是两个顶点之间的一组有向边。每个边(v1,v2)只有在当且仅当通过在状态 v1 下对 HTML 元素执行事件可以从 v1 到达 v2 时的条件成立时才都存在。
在我们的方法中,集合是从 web UI 模型获得的。它的定义如下:
•元素集 E 是一组 HTML 元素。
•每个元素 e∈E 在以下条件成立时存在,当且仅当 G 至少存在一个状态 v∈V 时,v 的 DOM tree 结构包含 e。
定义 2(元素覆盖):测试用例集 T 在这样的条件下满足元素覆盖准则
•当且仅当对于每个元素 e∈E,至少有一个测试用例 t∈T 使得 e 被 t 访问,其中 e 表示被测试的应用程序的元素集。
在定义中,元素被测试用例访问意味着该元素在测试用例执行期间在浏览器上显示或接收事件。
(3) 混合覆盖
混合覆盖的关键思想是结合 web 应用程序运行时的客户端和服务器端功能。服务器端特性可以表示为服务器脚本的代码执行条件。而客户端特性则处于 JavaScript 执行和 DOM tree 条件的混合状态。DOM tree 条件可以由元素表示,JavaScript 执行通常由元素事件触发。服务器端和客户端的交互也可以用访问的元素来表示。
基于语句覆盖和元素覆盖,混合覆盖可以定义如下:
定义 3(混合覆盖):一组测试用例在这样的条件下满足混合覆盖准则,当且仅当对于每个元素 e∈E,至少有一个测试用例 t∈T 使得 e 被 t 访问,对于每个语句 s∈S,至少有一个测试用例 t∈T 使得 s 被 t 执行,其中 E 表示元素集,S 表示被测应用程序的语句集。
定义中的状态集包含被测应用程序的服务器端脚本的所有语句。
3. 方法
我们实现了一个框架来获取测试用例的元素覆盖率。并使用 Crawljax 作为被测 web 应用程序的模型生成工具,因为据我们所知,它是目前唯一支持基于 AJAX 的 web 站点的可用工具。
在上一步得到了 web 前端模型之后,该框架使用 web UI 模型和在自动化测试运行环境中收集的测试数据来计算测试套件的覆盖率。为了收集测试数据,框架在 web 应用程序的测试套件中运行测试用例,并在执行测试用例中的每个测试命令后从浏览器的 DOM tree 中收集数据。
在之前收集的数据用于识别 web UI 模型中访问的 HTML 元素并计算元素覆盖率。对于语句覆盖,我们使用了用于 PHP 和 phpunit3 的 Xdebug2 扩展的组合。工具链可以生成包含语句覆盖信息的测试报告。混合覆盖率可以很容易地用元素覆盖率和语句覆盖率信息来计算。
4. 实验
实验的目的是从测试池中选取一部分具有较高故障检测能力的测试用例。测试用例优先排序的选择策略通常基于覆盖率指标。因此,我们通过比较通过基于不同的覆盖的策略来选择的测试用例集的故障检测能力来评估不同覆盖准则的有用性。
(1) 实验项目
我们选择了两个 PHP web 应用程序 schoolmate4 和 timeclock 5 作为我们的项目程序,表 1 显示了这些主题的一些信息。
我们招募了一个由高年级本科生和研究生组成的团队来为学科项目创建测试用例。
(2) 实验过程
我们首先初始化测试池。所选测试用例的初始集为空,并且在该过程的每一轮中从测试工具中选择 0 或 1 个测试用例。对于每个选择,该过程遍历测试工具中未选择的测试用例并计算适应度值作为每个候选测试用例的选择度量。选择适应度值最大的候选测试用例。如果存在多个具有相同最大适应度值的合格候选测试,则从中随机抽取一个测试用例。如果选定测试的覆盖率达到最大覆盖率(即测试池的覆盖率),则清除覆盖数据并继续该过程。如果满足结束条件,程序将结束。
我们设置了一个所选测试用例的最大数量。如果选择了足够的测试用例,或者检测到了所有的 bug,那么该过程将结束。实验过程如图 1 所示。
(3) 选择策略
我们实验的关键是适应度函数。适应度函数是基于覆盖的。同时还考虑了测试用例的执行成本。候选测试用例对所选测试用例集的覆盖贡献可以通过附加覆盖集(ACS)来度量,它包含在候选测试用例 t 的覆盖集(CS(t))中的覆盖点,而不是在所选测试用例集 t 的覆盖信息(CS(Cover Info(T))的覆盖集中的覆盖点。附加覆盖集可以通过公式 ACS(t,Cover Info(T))=CS(t)− CS(Cover Info(T))。因为覆盖信息可能在实验过程中被清除,所以我们用 CS(Cover Info(T))代替 CS(T)。测试用例的执行成本由初始化测试用例的成本加上在测试用例中执行测试命令的成本来衡量,一般适应度公式定义如下:
Fitness(t, T)=
(4) 结果分析
一个有效的策略可以用少量的测试用例来检测大量的故障。我们用每个试验项目和选择策略组合而成的错误检测率来衡量这个特征。图 2 和图 3 显示了三种策略在两个试验项目(同学和时钟)上的错误检测率。
从图中可以看出,基于混合覆盖的策略比基于语句覆盖和基于元素覆盖的策略能够检测到更多的 bug。
(5) 有效性威胁
外部威胁:我们试验项目的数量。
内部威胁:我们为元素覆盖率计算创建的 web UI 模型的不完整性。
5. 结论
本文提出了一种新的 web 应用测试覆盖准则。元素覆盖用于度量测试用例访问的 HTML 元素集。基于这种元素覆盖和传统的语句覆盖,我们提出了一种混合覆盖来覆盖客户端和服务器端的特性。实验还评估了混合覆盖准则的有效性。
标签: #html元素覆盖