摘要:测试日志智能分析是提升智能化测试效率的一个关键步骤。
本文分享自华为云社区《【智能化测试专题】基于强化学习的测试日志智能分析实践》,作者: DevAI 。
随着软件规模的不断扩增,加快测试时间降低成本、实现智能化测试是至关重要的,而测试日志智能分析是提升智能化测试效率的一个关键步骤。当前由自动化测试阶段产生的大量日志,主要依赖人工分析,而人工分析工作量大、耗时较长,以华为某产品线为例,每月都会产生30-40万的测试失败日志,而人工分析每天仅能分析20-30条日志。此外人工分析时,很大一部分工作是分析重复或同类问题,且测试人员分析经验复用困难,严重制约测试效率。
测试日志智能分析是从日志采集、日志解析与预处理、失败日志根因分析及分类以及数据可视化的一整套解决方案。日志分析的发展从传统的基于规则引擎的算法,到现在的基于机器学习与AI技术的算法方案,其自动化程度得到了很大的提升, 然而它依然会面临着一些问题:1)算法和业务之间存在一定的信息差,业务需要理解算法层面所需要的关键信息,才可能使得所提供的信息是有效的。2)算法方面也需要协同产品方面的专家,来进行特征提取,而专家资源受限。3)其解决方案需要针对不同产品特性进行调参、优化模型等,但模型需要海量历史数据和标准化的标注,业务方标注准确率堪忧。
针对上述问题,我们基于强化学习和主动学习,提出了一种失败测试日志分析方案,其主要流程如图1所示。该方案包括了:1) 数据采集 2)数据预处理3)特征生成 4)模型生成 5)智能分析等模块。
日志智能分析的任务是有监督/半监督学习任务,我们需要事先对数据进行收集与标注,针对测试人员标注好的数据,我们按8:2的比例进行训练数据和测试数据的切分。平均地,训练数据的量级可达到万级以上,测试数据的量级可达到千级/万级以上。
测试日志文本通常是非结构化的日志文本,文本长度通常较长,单个日志大小平均可达300KB,我们需要事先进行文本清洗和预处理,来过滤与失败类别无关的信息,聚焦到与任务相关的有效信息上。预处理步骤会先移除不需要的格式,比如解析html格式文本,提取相应的日志内容;接着,提取的日志内容会分别经过基于通用规则的方法和基于用户自定义规则的方法,来进行数据的清洗和分词。这里的通用规则是综合多个业务提炼的规则,用户自定义规则则是用户针对当前业务生成的规则和自定义词典(包括专业名词和停用词等),可适配到各个业务。
日志文本特征向量构建主要选取了基于word2vec的向量化方法和基于TextCNN的向量化方法来。日志文档特征向量是利用word2vec方法生成的词向量与对数词频加权平均后的结果,以及TextCNN直接生成文档向量。
模型生成与智能分析主要是结合了强化学习和主动学习,来对是否给出正确预测进行奖罚。对于新采集到的日志,会跟日志库中的数据进行比较,选出top-k个距离最近的日志样本,若距离超出一定阈值,则不给出分析结论,若符合阈值内的样本则加入候选集中,并且强化学习模型会计算候选集的得分,根据得分判断是否给出失败原因描述。最后由人工去确认失败原因是否正确以此是否做出奖励或惩罚,从而不断优化强化学习模型。
相比于业界主流方法,该模型的分析准确率能够达到90%以上,算法时间整体从501.2s提升在2.1s左右。另外智能分析模型在某产品落地时,免人工复核占比52.78%。

测试日志智能分析已经落地华为100多个产品线,为用户提供了自主接入、自主训练、结果分析的功能:提供自动的预处理规则管理、预处理效果展示,支持用户一键式自助训练模型,观测模型分析准确率与结果。

在华为多个产品业务背景下,本文提出了一种有效的日志智能分析方案,可以学习历史测试日志,对现网失败用例根因智能定界,大大减少了重复问题的定位,减轻了测试人员的工作量,另外针对不同产品的数据特征,可以适配合适的模型方案,并提供了用户自助接入与分析的功能。相比于基于规则的分析方法,本文方法不需要维护复杂的规则表以及规则冲突的情况,另外相比于传统监督学习的方法,本文方法更适用于有大量人工标记且数据稀疏的情况,来提升预测结果的准确性。我们也将持续地关注业界学界的最佳实践及新模型,以探索更优的解决方案。
文章来自PaaS技术创新Lab,PaaS技术创新Lab隶属于华为云,致力于综合利用软件分析、数据挖掘、机器学习等技术,为软件研发人员提供下一代智能研发工具服务的核心引擎和智慧大脑。我们将聚焦软件工程领域硬核能力,不断构筑研发利器,持续交付高价值商业特性!加入我们,一起开创研发新“境界”!
PaaS技术创新Lab主页链接:https://www.huaweicloud.com/lab/paas/home.html
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element