随着年纪增长,记性越来越差,现在把之前写的专利《一种测试覆盖分析方法与系统》的实践、思考和技术实现过程记录下来,以便思考和学习,继续深入。
PS:想法基于“冲天炮”,主要逻辑写在Oracle Procedure存过,具有一定的独特(约束)性,但是实现的想法涉及很多方面的工具和技术。)
想法来源于一些项目需要:
1. 由于需求变更,需要表变更或者调整存过,需手工梳理存过和修改的配置文件;
2. 由于“冲天炮”技术升级,配合程序修改,需提供测试入口菜单;
3. 根据服务接口的登记情况,通知上下游修改;
4. 自动化的测试脚本关联程序。
“冲天炮”是一个非常棒(非前后端分离)的框架,易学好使实用,愧于本人水平所限,把基于“冲天炮”搭建的系统想象为这样:
菜单程序链路图.jpeg然后根据XML的信息、程序内容嵌套的“调用”关键字(forward、include、form等等),生成菜单程序链路。
开始的实现,通过启发式的双向宽度优先搜索,发现程序链路图的规模很大,菜单-程序-程序之间——多对多的网络关系,当时通过内存和文件方式存储,一直无法满足日常使用的需要。后来采用NoSQL的Neo4j存储链路节点,去重写链路生成和遍历,效果满足日常使用的需求。
此时得到一份菜单为入口的菜单程序链路图,生成了所有菜单经过的程序、存储过程和涉及的表的关联图。该方法有局限性,纯文本分析和XML解析,容易把多余的程序链路生成,改进想法通过系统运行的日志,还原菜单运行过程中的程序链路。
为了实现测试覆盖分析,想法是基于各种Guard系列(PageObject 模式)的自动化测试框架,自动生成自动化脚本(Velocity实现),人工只需配置数据和断言:
1)Oracle Procedure的存过单元测试;
2)底层是Java程序的系统内部和外部调用接口;
3)菜单页面的UI是基于Selenium和SikuliX的封fuzzer先建立测试案例,自动化测试脚本与程序链路的关系(手动),然后
捕捉到代码变化(Java git tool)或者表结构变化,便可完成通过菜单链路调用自动化测试,同时测试覆盖的统计依赖冲天炮自带,jacoco,还有利器antrl。
实践中,自动化测试的能力得到扩展:ui帮助实现ie兼容性测试;基于owasp的 top10 payloads实现接口测试和存过单元测试的安全能力;基于覆盖率反馈和鲁棒性的思考,引入了fuzzer data generator,提升测试覆盖率,fuzzer的断言非常不易,做过基于机器学习做数据分类和结果聚类,在小的接口测试结果样本没有较好的准确率, 大神指导过有深度学习的方法还没尝试;一直没有了解基于AFL的测试覆盖反馈做fuzz 也没完整用oss-fuzz做0day。
过程中,观察到测试问题反馈,需求描述,开发进度,项目质量,测试覆盖的关系,用jieba做了这些内容的NLP,然后暴力knn,发现一些有趣的东西,但是模型是有问题的,跟项目其他特征如工作量,人数,关联系统等特征来重建模型。
既然需要更多资源和语聊,特意用scrapy写了spider,基于itchat搭了一个基于规则的应答机器人,本意是作为入口查看爬虫数据,结果发现如果基于常见开发测试运维问题做智能应答,岂不美事,规则易建,智能难做。
待续…
网友评论