auto.js 脚本代码大全_基于切片覆盖过滤的测试代码推荐系统

cb555786-6e1d-eb11-8da9-e4434bdf6706.jpeg

1. 项目意义

软件测试是软件生命周期中至关重要的一部分,而白盒测试是其中关键的一环,白盒测试是很多无经验人员入门测试行业的必备技能,如何帮助无经验人员掌握白盒测试是一个值得关注的问题。对于白盒测试的学习,初学者往往通过在线课程学习测试相关技术,并利用一些测试工具在本地开发环境中辅助实践,如使用自动化测试用例生成工具生成测试用例帮助自己理解源码、使用测试覆盖可视化工具帮助自己了解覆盖情况。这些辅助工具能够为测试经验丰富的工程师提供显著帮助,但如过使用在测试学习场景下,对于无测试经验的初学者,这些工具或多或少存在着一些问题。

自动化测试用例生成工具生成的测试用例通常可读性差,初学者理解生成的测试用例需要花费大量时间;覆盖可视化工具提供的报告不够清晰,初学者在学习过程中难免会无法理解为什么测试用例未能覆盖被测方法的某一行,而可视化工具仅可提示哪一行或者哪一个分支没有覆盖。为解决初学者测试学习窘境,一种快速高效的学习方式是提供一个在线的测试学习环境并采用推荐相关测试代码片段的方式,帮助初学者理解被测代码、引导初学者挖掘测试方向、指导初学者设计测试用例,进而提高初学者的白盒测试学习效率。

2. 项目内容

如何获取高质量、可推荐的测试代码片段是核心关键问题,为此我们借助了慕测平台。慕测平台每年通过比赛和考试收集了大量学生提交数据,它们可帮助学生从测试角度理解被测内容以及学习如何设计测试用例。学生提交的数据为 Maven 项目包格式,项目包中包括完整被测源码文件和测试脚本文件。但学生提交的项目包质量参差不齐、测试脚本不够精简,导致无法直接用于推荐。例如很多学生提交数据中包含了使用自动化生成工具产生的低质量、高冗余的测试用例,或者学生在测试过程中由于较差的编程习惯将全部测试用例掺杂在同一个测试方法中。传统的处理方式是直接文本处理,将测试用例按照方法进行切分,这种方式会造成测试用例切分粒度大、代码片段的测试覆盖信息过多的问题,导致推荐的测试代码片段不利于初学者的测试学习。因此,我们需要一种更细力度的切分方法分离测试脚本中的测试代码片段,才可将学生代码片段用于初学者测试学习过程中。程序切片技术可帮助我们更好的完成测试脚本的分离工作。

cd555786-6e1d-eb11-8da9-e4434bdf6706.jpeg

图 1. 慕测 TeSRS 总体架构

本文依托于慕测公司的 WebIDE 在线编程平台,设计和实现了一个基于程序切片和测试覆盖分析的测试代码推荐系统 TeSRS。将二者有机结合,为用户提供便捷式、沉浸式的白盒测试学习环境。TeSRS 的整体架构如图 1 所示,共分为两个流程、四个模块。虚线以下为离线数据处理流程,用于构建测试代码片段和测试覆盖关联关系的语料库,为推荐流程提供数据支撑。虚线以上为实时推荐流程,包含实时代码推荐模块。在用户进行白盒测试时,系统会推荐可读性好、测试覆盖信息丰富的代码片段。各模块详细介绍如下:

(1)测试脚本切片模块:该模块使用了程序切片技术,对学生提交数据中的测试脚本进行分析和切片,得到一系列覆盖信息丰富、有助于程序理解的优质测试代码片段。该模块具体处理流程为:首先,编译项目产生测试脚本的字节码文件;之后,使用 Java Parser 进行源码分析得到切片入口点(Assert 语句)所在代码行和切片结束点(方法签名)所在代码行;接着使用 Wala 工具分析测试脚本的字节码文件,产生系统调用图 SDG;最后,定位切片入口点和结束点在 SDG 上的位置,并进行图遍历和剪枝得到最终的程序切片。

(2)项目模板构建模块:该模块用于构建一个可结合代码片段后可运行的项目模板。该模块具体处理流程为:首先,整理切片用到的用户测试脚本 Maven 项目包,使用 Dom4j 在 pom.xml 文件中添加 OpenClover Maven 插件;之后,通过 AST 分析测试脚本文件,删除原测试脚本中所有@Test 注解标注的测试方法得到测试模板;最后,从各个切片文件中读取测试代码片段,将读到的测试代码片段融入到测试模板中并进行保存备用。

(3)测试覆盖分析模块:该模块对每一个测试模板项目使用 OpenClover 工具进行覆盖分析。每个测试模板项目均产生一份测试覆盖报告,该报告为 Xml 格式;之后,通过对 Xml 覆盖报告中的覆盖信息分析,得到该测试代码片段包含的分支、语句测试覆盖向量;最后,将得到的测试覆盖向量和测试代码片段进行关联,通过事先准备好的 ElasticSearch 进行存储,保证语料库可以被更好的管理同时满足实时推荐过程的高效查询。

(4)实时代码推荐模块:该模块会实时提取用户产生的测试覆盖报告,计算当前提交内容所覆盖到的各个方法的覆盖率,以百分制分数的形式存储于数据库中,通过判断各个方法是否处于推荐阈值进行过滤;之后,使用方法签名检索 ElasticSearch 语料库中的代码片段;最后,使用学生提交数据的分支覆盖向量、语句覆盖向量和语料库中测试代码片段的测试覆盖向量计算 Jaccard 相似度,选择覆盖向量互补的 Top-K 代码片段返回给用户,完成一次推荐过程。

3. 项目效益

用户在进行白盒测试学习时,可通过浏览器直接访问本系统,通过在线编程平台慕测 WebIDE 进行白盒测试学习。慕测 WebIDE 提供的被测源码覆盖着色、测试代码智能提示和语法错误检测等功能可帮助高效提升用户学习体验。慕测 TeSRS 通过实时分析用户每一次提交结果,提取测试覆盖报告,并通过 Jaccard 算法计算测试覆盖向量的相似度,检索测试代码片段语料库,过滤得到对当前用户有价值、有意义的测试代码片段,最后推荐给用户。TeSRS 推荐的测试代码片段可帮助用户逐步提高测试覆盖,并且有助于用户理解源码、开拓测试思路。

ce555786-6e1d-eb11-8da9-e4434bdf6706.jpeg

图 2 实验结果统计

为了验证 TeSRS 是否可对初学者白盒测试提供有效帮助,我们通过邀请 20 位无测试经验的初学者进行试用,并回答一系列问题,结论如图 2 所示。首先,我们验证了论文中方法得到的代码片段和文本处理方式得到的代码片段相比是否可读性更好。实验分别让用户比较 3 组复杂程度不同的代码片段并给出 1-5 的可读性评分,结果表明“程序切片”组代码片段为 253 分,“文本处理”组代码片段为 180 分,程序切片产生的测试代码片段更被初学者所接受。接着实验验证了 TeSRS 是否可帮助用户打开测试思路以及是否可帮助用户提高测试学习效率,结果分别表明 90%用户对这两个结论表示认可。

目前 TeSRS 已上线使用,并通过对慕测多年积累的测试代码进行切片,构建了一个可供测试学习的代码片段语料库。本文通过实验调研的方式,证明了 TeSRS 可提高初学者的白盒测试学习效率。在未来,我们计划通过扩充测试代码片段语料库以及完善推荐策略两个方面迭代系统,为初学者提供更好的测试学习体验。

致谢

本文由南京大学软件学院智能软件工程实验室 2018 级硕士生门铎撰写。

感谢国家自然科学基金项目:智能软件系统的数据驱动测试方法与技术(61932012)支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现 Auto.js 脚本的自动更新功能,你可以按照以下步骤进行: 1. 首先,在你的脚本中添加一个检查更新的函数。这个函数可以连接到你的代码仓库,比如 GitHub,然后检查是否有新的代码提交。你可以使用网络请求库,比如 Auto.js 的 `http` 对象发送 GET 请求,获取最新代码的版本信息。 2. 在获取到最新代码的版本信息后,判断是否需要更新。你可以将当前脚本的版本号与最新代码的版本号进行比较。 3. 如果需要更新,你可以使用 `http` 对象下载最新的脚本文件。你可以使用 `http.downloadFile()` 方法来下载文件,并保存到指定的路径。 4. 下载完成后,你可以使用 `files.path()` 方法获取下载文件的路径,然后使用 `engines.execScriptFile()` 方法重新运行脚本。 下面是一个简单的示例代码,用于演示自动更新脚本的功能: ```javascript var versionCode = 1; // 当前脚本的版本号 var scriptUrl = "https://raw.githubusercontent.com/your-repo/your-script.js"; // 你的脚本文件代码仓库中的 URL function checkUpdate() { http.get(scriptUrl, function(res) { var latestCode = res.body.string(); // 获取最新代码 var latestVersion = getVersionCode(latestCode); // 解析最新代码中的版本号 if (latestVersion > versionCode) { downloadLatestScript(); // 下载最新脚本 } else { toastLog("已是最新版本"); // 输出提示信息 } }); } function getVersionCode(script) { // 解析脚本中的版本号 // 这里可以使用正则表达式或其他方式提取版本号 // 返回版本号 } function downloadLatestScript() { http.downloadFile(scriptUrl, "./latest_script.js", function(result) { if (result.statusCode == 200) { var scriptPath = result.path; // 获取下载文件的路径 restartScript(scriptPath); // 重新运行脚本 } else { toastLog("下载失败"); // 输出提示信息 } }); } function restartScript(scriptPath) { engines.execScriptFile(scriptPath); // 重新运行脚本 exit(); // 退出当前脚本 } checkUpdate(); // 执行检查更新函数 ``` 请注意,上述示例代码仅提供了一个基本的思路,具体实现方式可能因项目的不同而有所差异。你需要根据自己的需求进行适当地修改和扩展,并替换 `scriptUrl` 变量为你的脚本文件代码仓库中的 URL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值