Web测试用例产生的新思考
Model-based Automated Testing of JavaScript Web Applications via Longer Test Sequences
arXiv:1905.07671v1 [cs.SE] 19 May 2019
获得高代码覆盖率
- 事件序列
- 输入数据
传统的白盒测试和GUI测试中已经表明,增加测试用例的长度可以改善覆盖范围和故障检测
作者提出的问题:
- 在测试JS Web应用时候,事件序列构造的时候会呈指数型爆炸,为了测试的有效性考虑,通常会指定一个序列长度的最大界限。例如6[12],为了弥补测试的充分性,提出了变异测试和部分有序(partial order reduction)。在合理的时间将允许探索受限长度的事件序列。
- 输入数据通常通过随机选取值或者轻量级的启发式策略,或者使用符号执行等重量级的技术。这些通常被考虑在单元测试中。
使用FSM代表JS Web应用的行为
非确定性的有限状态机 M = (S,I,δ,s0):
S是有限状态集合 s0 ∈ S 初始状态
I是有限的输入字符集
δ ⊆ S × I × S 转换关系
(s1,e,s2) ∈ δ表示在状态s1读取了输入符e,便可以从状态s1跳转到状态s2。
supp(s)= {(e,s0) ∈ I ×S | (s,e,s0) ∈ δ}
Given a word e1···en ∈ I∗, a run of M(FSM) on e1···en is a sequence of states s0s1···sn such that for every 1 ≤ i ≤ n, (si−1,ei,si) ∈ δ.
LJS主要由四部分构成
static analysis静态分析 JSDEP[22]
execution engine执行机 ARTEMIS [2]
model construction模型构造
testcase generation测试用例生成 partial-order reduction(POR) & random event sequence generation
通过静态分析计算DOM事件依赖性
通过利用执行引擎和DOM事件依赖性,使用深度搜索的变体构建应用程序的FSM模型。
所有生成的事件序列在执行引擎上迭代执行并输出覆盖率报告。
在测试用例生成阶段,partial-order reduction(POR) 通常会产生很多短的事件序列,但是可以覆盖所有路径。
random event sequence generation虽然不能够覆盖所有可行路径,但是可以产生数量比较少但是长度较长的测试序列。
粗粒度状态抽象可能会造成的问题:
- 一方面,FSM的状态应该包含足够的数据来区分不同的应用程序状态,因为如果之前已经探索过抽象状态,则可能会错误地跳过未探测的应用程序状态,如果采用粗粒度状态抽象,则可能会发生这种情况。
- 另一方面,过度细化的状态抽象可能会产生一些与某些覆盖标准无法区分的状态,从而导致爆炸性的甚至是有限的状态空间。
ARTEMIS构建的状态模型有一个问题在于过度细化,比如说一些源码中隐式(implicit)的属性。将会引起状态空间爆炸的问题。
ARTEMIS但丢弃DOM树中隐式属性的随机值。 这允许关注通过执行事件而不是随机值赋值所做的状态更改。
显然,事件的选择将影响FSM模型的质量。
本文实现了两种事件选择策略:
- 基于基准算法的随机事件选择策略
- 权重事件选择策略
已经执行过的事件具有较低的优先级,要使用长事件序列公开角落代码,依赖于先前所选事件的事件应该有更高的选择机会。
weight(e) =[α$_e$×x+βe×(1−x)] / N$_e$+1
α$_e$、βe是权重参数,x是布尔值表示是否选中,如果e依赖于之前选择的事件则x=1,否则x=0
N$_e$表示事件已经被执行的次数
基于模型的测试之间的不同主要在三方面:被测软件的模型、模型的构造、测试用例的生成。
- 基于状态的(pre-/post-condition)
- 基于迁移的(UML和I/O)
[22][55]
现在主要关注的研究点在两方面:
一个是测试路径的生成,多考虑长序列的生成。
一个是轻量级测试数据的产生。
Transferring Tests Across Web Applications
利用应用之间的UI元素的语义相似度(semantic similarity)
功能区分阶段:我们确定了现有Selenium测试套件的基本功能。 因此,特征被定义为任何用户UI元素,例如, 输入字段,按钮和其他元素以及附加的事件处理程序。 为了识别特征,我们分析给定测试套件执行命令的UI元素,并使用可视化聚类算法将它们与描述标签组合在一起。
跨应用程序匹配功能阶段:使用语义文本相似度作为度量。 匹配的功能然后引导爬行。