非常感谢您可以和我一起来聊一聊智能化测试的一些事。智能化测试是一个新鲜又老旧的问题,说新鲜是因为很多人当听到智能化测试都会联想到人工智能、机器学习、深度学习等高大上的技术,很多时候觉得离我们的实际工作还很远;说老旧,是因为智能化测试的一些技术的发展在行业里面已经很久了,例如符号执行、静态分析等技术已经有很长的历史了。近些年,随着测试技术的的飞速发展,智能化测试也有了越来越多的实践,优秀的开源项目慢慢的被行业推行并且落地。那么在这里我们就一起来聊聊智能化测试以及智能化测试好的思路、实践、方法以及技术落地过程。
我曾经在京东中台工作,经历了内部质量保障过程从人工点点点到测试自动化,最后到智能化测试的转变过程。而我就是这个过程中的技术推动者之一。因此我想先和你分享一下我在推动团队一步一步走上智能化测试的过程中的一些经历和体会。
智能化测试是什么
再说在自动化测试之前我们应该先说说智能是什么。我们这里的智能,也就是人工智能,也就是artificial intelligence,缩写为AI。主要是指通过普通计算机程序来呈现人类智能的技术。麻省理工学院的温斯顿教授把人工智能定义为研究如何使用计算机做过去只有人才能做的智能工作。这里所谓的智能工作就是指通过人类智慧完成的工作流程、内容和方法。
在1950前后,人工智能就开始逐渐的走进人们的视野,当时对人工智能的理解还很肤浅,随着很多科幻电影和小说不断的对人工智能的描述,才使得人逐渐的认识到了人工智能的应用未来会是一个什么样的场景。在1980年以后,人工智能领域逐渐的发展出了机器学习,他是人工智能的核心,它专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。到2010年以后,深度学习逐渐的出现,他是机器学习的技术和研究领域之一,通过建立具有阶层结构的人工神经网络,在计算系统中实现人工智能。
智能化测试,英文AI Driven Testing,简称AIDT。人工智能驱动的测试,就是研究如何使用计算机去做过去只有人能够做的智能的测试工作内容。测试工程师在这个工程过程中变成了决策者、工具链的维护和创造者。现如今,被测系统的复杂度从来没有变得如此的高。微服务化使得系统间通过无数的API联系到一起,老旧系统的兼容和服役,使得测试场景越来越复杂,系统复杂度非线性的增长使得测试用例设计靠人工越来越难于覆盖绝大部分场景。随着项目交付生命周期的不断缩减,测试需要更高效更准确的评价并反馈被测系统的质量。这也变成了在DevOps大行其道的今天,过程化测试变得越来越重要。随着之前月级别的交付逐渐的演变成周级别的迭代交付、日级别的构建,这些都推动了流水线式质量保障手段的发展,更加凸显过程化的测试流程变得尤为重要。智能化测试走到今天已经不再是停留在论文上的学术领域的事情了,现在已经逐渐的在很多个团队落地推行。这里面有开源工具的落地引入和改造,也有自研的智能化测试工具。但是无论是哪一种的落地实践,都是对智能化测试的推动和发展。通过AI的方式驱动测试,通过算法来释放人工繁重的劳动应该是目前看来最为行之有效的方法之一。
为什么要落地智能化测试
随着敏捷和DevOps的推广和实践,软件开发生命周期正在发生质的变化,这样才能够适应几小时以及几分钟的发布时间间隔。虽然发布周期越来越短,但是测试技术却没有跟得上技术的发展,虽然测试窗口在不断的缩小,但测试效率并没有大幅度的提高,这就导致了很多潜在的问题遗留线上系统,线上系统故障率急速攀升。在我所在的团队大力推广持续集成、持续交付的同时,测试自动化还处于最原始的状态:在接到一个新需求的时候,手工测试工程师,有些也叫做业务测试工程师会参加需求评审会或者叫需求澄清会,然后手工测试工程师会按照需求或则原型撰写测试用例,在系统提测后,会按照原测试用例进行测试,在完成测试后,系统上线;同时测试开发工程师按照按照业务测试用例编写测试脚本,并把测试脚本推进测试代码仓库中。到这里,自动化测试都没有发挥一点测试的作用,只有等到再次回归测试的时候,自动化测试脚本才会发挥应该有的作用。我相信很多团队到现在都还在经历这个过程。再投入了大量人力去维护的自动化测试,却无法在系统第一轮测试的时候发挥作用,这也难怪很多team都认为自动化测试的ROI(Return On Investment,投资回报率)太小了。
在工作中发现问题我们就逐渐的解决问题,在团队内部复盘的时候我们发现脚本撰写是所有自动化测试过程中最大的痛点,因此我们就一起想办法解决了测试脚本自动生成算法,并将应用到实际工作中,这样占据自动化测试工作量的一大半的内容都交给了算法来完成。
我们都知道测试用例是在IEEE Standard 610 (1990)中定义的:“ A set of test inputs, execution conditions, and expected results developed for a particular objective, such as to exercise a particular program path or to verify compliance with a specific requirement.”从这个定义中可以看出我们有了测试脚本就是预期逻辑已经设计好了,那么后续的测试数据可以再给出一些推荐性的内容,是不是就可以将测试更多的放给算法完成了。因此我们又经历各种学习、研究后设计了适合于我们的测试数据生成方法,这样测试脚本和测试数据都有了,在测试执行过程中,测试工程师将更多的逻辑放测试结果的决策上了。在这个专栏中我也会针对我参与设计和研发的智能化测试相关的关键算法进行一些讲解,希望对你有所启发。
智能化测试走到今天已经不再是停留在论文上的学术领域的事情了,现在已经逐渐的在很多个团队落地推行。这里面有开源工具的落地引入和改造,也有自研的智能化测试工具。但是无论是哪一种的落地实践,都是对智能化测试的推动和发展。通过AI的方式驱动测试,通过算法来释放人工繁重的劳动应该是目前看来最为行之有效的方法之一。
测试行业是一个以技术为原子驱动力的行业,智能化测试既能提升行业的技术实力也能帮助我们摆脱枯燥、乏味、反复的工作。在一起学习的这段时间里,我会把我对智能化测试的实践、认知和理解毫无保留的告诉你,在技术的海洋了,不存在猫教老虎要留一手这样的事情,在我给你讲述的过程中我也在不断的整理我的技术思维,掌握的越来越熟练,不熟悉的越来越熟悉,我们在互相督促进步,我希望在你完成了这个专栏的学习后,我是那个为您打来了另外一个窗户的人,看到智能化测试的美好,但是要走出去融于美景之中,却要靠你自身努力,破窗为门。所以现在来和我一起学习智能化测试,作为先进技术的推动者