本文整理了做为一个测试人员应该具备的一些基本技术和素养,并在大数据、人工智能等专项测试方面做了一些小小的拓展,梳理了一份“全栈软件测试能力培训”的思维导图。
为直观起见,先来看这张层次框架图,是个总体框架:
总体来说,软件测试能力从内到外分为三个层次:基础知识+核心技能+外延能力。
还是乱如麻看不清,接下来会本文逐个主题展开。
1.前期知识储备
一直以来数学,在测试领域仿佛很少被提及,但是现在时代不同了,随着大数据、人工智能、中大型软件、高密度持续交付快速更新管理的涌现,用严谨的数学进行科学的分析和管理将是软件测试领域非常重要的课题。
离散数学对于软件测试是必学课程,数理逻辑、代数结构、组合数学、图论对于后续的软测设计能力和管理能力的培养不可或缺。
形式化分析,是将语言描述性的内容进行公式化数学化。许多学者都在致力于研究,如何把需求进行形式化分析,需求一旦能完全用严格的数学语言表示出来进行数学推导和求证,那么后续的开发、测试和维护都可以在一个非常严谨的监控下有序完成。然而时至今日,这件事的完全实现,仍然是一个梦,也许随着AI的到来,分布式表征(Distributed Representation),应用在形式化表示上,可能是一种可行的思路。另外学习形式化分析,对软件和测试建模的逻辑思维很有帮助。
算法学习,是针对人工智能(AI)的前期准备。现在我们国家准备把人工智能纳入小学教育!“过去10年我们在忙于打造移动为先的世界。未来10年,我们将步入AI为先的世界。”(谷歌CEO Sundar Pichai,2016年10月),从亚马逊到Facebook,再到谷歌和微软,全世界最顶尖、最有影响力的技术公司都将目光转向了人工智能(AI)。作为一名准备迎接挑战的测试人员,各种与AI有关的算法的学习是必备。
数理统计中的数学期望、大数定理、似然估计、假设检验、马尔科夫链(马尔科夫链是怎么预测未来的)等等理论,在大数据测试、缺陷分析与预测、AI测试、可靠性分析等软件测试分析能力方面都将大有作为。
软件测试的前续课程是软件工程毋庸置疑,但是随着软件测试在软件开发流程中的不断左移(Left-Shift),软测与开发的持续互相渗透和融合,单单软件工程课程不足以支撑软件测试的知识储备了,软件体系架构、软件建模和设计模式,也是软测人员必备的课程。
数据库课程一直是测试人员非常重要的前续学习,了解数据库的运行原理,了解代码与数据库之间的层次结构,能有效的帮助测试人员深入的功能用例设计、缺陷定位和数据库测试等。
网络原理的是任何一种类型的软件测试人员都必须了解的,无论从事性能测试、安全测试、功能测试、大数据测试等,这类课程可以帮助测试人员理解中间件概念,了解Web软件、理解接口测试、更合理的设计和应用安全测试、性能测试等。
还有一门,是朱教授的能力图谱中提到的心理学,这个很重要。本人深有体会,测试工作做得好不好,拼到最后,为人处世(沟通与协作)占很大的比重。
常常我在上课的时候会问学生,测试人员经常遇到的问题:“如果你提出了一个你认为很重要的Bug,开发人员不以为然,甚至不改!你做为测试人员应该怎么办?怎样才能让开发人员修改呢?”(欢迎您留言分享您的应对方法。)
2.软件测试基础知识
基础知识部分,都是传统的软测知识体系,这里就不作详细展开。现在白盒与黑盒测试用例设计技术也有相融合的趋势,重要的是要灵活运用集合论、边界分析和路径分析的图论、组合数学等。
测试策略,可以增加启发式测试策略、探索式测试等快速测试方面的知识内容。测试策略是在测试人员培训和工作中很容易被忽略的一个部分。
3. 软件测试设计能力
测试设计在整个测试过程中,应该是重中之重的,直接决定测试质量,进而可能会影响整个测试工作乃至开发工作的进程。
测试的设计工作多在执行测试之前或者测试执行中进行,主要分成两个部分,顶层设计和用例设计。
顶层设计包括:测试架构设计、测试策略的制定和测试计划的编制。
专项测试领域的设计是各不相同,如:性能测试、安全测试、大数据测试和人工智能测试等各自需要设计不同的测试架构、测试平台、测试策略和独立的测试计划。
大数据测试功能性测试主要分成几个阶段,需要针对不同阶段分别进行不同的设计活动:
数据输入验证阶段(pre-hadoop)--测试数据源加载到HDFS,对数据装载一致性、准确性、正确性等方面进行测试。
数据输出验证阶段(MapReduce)--分割后的数据,多节点的正确性,单节点的业务逻辑准确性,键值对的准确度,以及输出文件与期望的吻合度等。
ETL测试--转换规则测试、数据期望测试以及数据完整性测试等。
分析报告验证--生成报告的正确性和与需求吻合度测试。
大数据测试还包含性能测试(数据摄取和吞吐量、数据处理速度以及子功能的性能)、容错性测试、可用性测试、扩展性测试、稳定性测试、部署方式测试、数据一致性测试和压力测试等等
人工智能测试,还是一个崭新的领域,毕竟人工智能涉猎的范围非常广,相同的输入也可能会产生不同的结果,与传统的测试有许多不同的地方。图灵测试设计,常常用来作为AI的与人“交流”程度的测试;对抗测试(多维测试设计),与AlphaGo对战的李世石,就是一个很好的测试用例,而在其他智能软件测试中,如何能设计与智能对抗的用例呢,这就需要用到多维的设计思路,也就是同样的输入可能有多种不同的输出;算法测试:无论是深度神经网络还是卷积神经网络,人工智能必然是采用某种算法的迭代或者加权筛选的过程,那么最直接的测试就是对算法的测试设计,对算法学习过程的测试设计。
测试用例的设计,则主要分成常规测试用例设计(普适性的设计技术)、根据业务需求的用例设计和专项测试用例设计。