计算机基础知识
想成为一名合格的软件测试工程师,和其他任何 IT 工程师一样,在工作中扎实的计算机基础知识都是至关重要的。无论是从个人的职业发展角度,还是从公司招聘候选人的角度,计算机基础知识都是必备条件和必考内容。某种程度上说,计算机基础知识掌握的程度,决定了软件测试工作的优秀程度,也决定了软件测试职业生涯的高度。
从软件测试领域来讲,一定要掌握的计算机基础知识主要包括:操作系统、计算机 络、数据库、编程语言、数据结构和算法以及架构知识。当然,计算机基础知识还包括计算机组成原理、编译原理等基础学科,这些我们要不要掌握呢的经验来看,软件测试工作还没有直接用到过这两门学科的知识,所以,这里我不会介绍它们。
下面,我就来解释一下软件测试工程师为什么要掌握操作系统、计算机 络、数据库、编程语言、数据结构和算法以及架构方面的知识,并跟大家分享一下我的学习经验。
1.1 操作系统
首先,在软件测试面试中,不管是应聘哪一个级别,计算机 络一定是必考的内容。如果面试中还解答不出TCP和UDP的区别、三次握手四次挥手的流程和状态转移过程、解答不出HTTP协议请求头和响应头各字段含义、HTTPS为什么比HTTP更安全的面试问题,那肯定是应聘不到心仪的岗位。所以,就算为了面试,也一定要掌握好计算机 络的知识。
在日常的软件测试工作中,当遇到 络不通、发现 络请求异常时,计算机 络知识的储备就派上用场了,你需要到ping和telnet来判断是 络问题还是服务异常,你需要通过tcpdump或者wireshark抓包分析 络包的异常,需要用charles或者findler拦截HTTP请求分析请求和响应。
计算机 络概念太多,知识太零碎,一定要建立起知识体系,并加强练习和实操。知识体系的建立可以基于计算机 络的分层体系,理解数据链路层、IP层、传输层和应用层,这些层各是为了解决哪些 络问题,为了解决这些问题设计了哪些 络协议, 络协议的数据格式是什么样的,执行这些 络协议的是设备是什么,如何通过各种命令配置 络和排查问题。
计算机行业新技术滚滚而来,也不断被淘汰,而计算机 络知识一定是值得你掌握,让你长期受益。
1.3 数据库
部分测试同学惧怕编程,我也感同身受,因为当时我也是惧怕,觉得编程太难了,很多语法记不住,语法记住了也不会上手写代码。我不是计算机专业的,和大家一样,在学校时学的唯一一门编程语言是C语言,再加上不懂数据结构和算法,做起课程设计、毕业设计真的太痛苦了。所以从上大学时就下定决心了,以后一定要放弃编程这条路了。
毕业时,和大家一样找了一份软件测试的岗位,工作一年之后,发现测试工作中越来越需要我们编程实现一些小工具辅助测试。编程又回到了我的工作生活中,不过这次我换了一门语言——Java,因为当时公司里面一位前辈给我安利了Java的种种好处,有各种现成的工具库,可以快速解决实际中的问题。凭借着在学校时学C语言掌握的一些编程基础概念,比如循环、分支、条件、变量等,再配合Java中的工具类,我真的将Java用到了工作中,这使得我对掌握编程技能重新有了信心。
到了2014年,软件测试自动化已经成为趋势,我认识到要想继续在软件测试领域干下去,一定要掌握自动化测试本领。 当时我调研了各种自动化测试工具、测试框架,发现大部分自动化测试工具和框架都支持Java和Python语言,而且大部分人推荐使用Python做自动化测试。 从那时起,我就与Python结缘,当时我记得Python版本还是2.6版本,后来使用了很长一段时间2.7版本,在2019年我和我的团队小伙伴全面迁移到Pyhthon3.6。 相比于Java,Python更加简洁的语法,更加丰富的内置库和第三方库,使得我抛弃了Java,钟情上了Python直到现在。
现在,我使用Python进行服务端接口测试、进行WEB测试、APP测试以及性能测试,开发一些测试工具及Web系统。Python 3.0增加的更多新特性,使得我们编写测试代码更加如鱼得水。简洁高效的语法,使得我们可以用最少的代码完成工作任务。不仅仅是软件测试领域,随着人工智能的火爆,Python语言也成为现在排名前三的热门语言。
说了这么多,我想告诉大家的是,一定要学会编程,否则真的会被淘汰。之前学不会像C、Java编程语言,现在有了简单的Python语言,我相信你一定能学会,你看我都学会了,你也一定行的。我记得我当时学习Python使用的是一本特别短小的电子书,中文叫《简明Python教程》,这本电子书一直在更新,大家有兴趣可以看下。另外,国内比较好的 络教材是廖雪峰在他的个人博客上发布的Python教程。纸质书我看过两本,一本是《Python核心编程》,这本书是基于Python2写的,不过里面的核心内容现在也不过时,另外一本是《Python Cookbook》,这本书也有电子版。
1.5 数据结构与算法
在微服务下,准备测试数据、测试解耦、定位和排查问题,与之前的单体应用完全不同。这时,我打算深入了解一下微服务,解开微服务的面纱,探寻微服务下服务端架构的全貌。由于架构因公司而异,因业务而变,看市面上的经典架构方面的书籍可能不太高效,所以我从公司内部的微服务架构出发,了解什么是服务发现,如何做服务发现, 关的作用和价值,微服务下的监控体系如何运作。对这些有一定了解后,作为极客时间的重度用户,我在极客时间上订阅了一门课程《微服务架构核心20讲》,这门课从理论到实践,介绍了微服务关键问题。通过这门课程让我对微服务架构有了更加全面、清晰理解。
你可能会问了,作为软件测试工程师,有必要了解架构知识吗得非常有必要,因为只有深刻理解了服务端架构之后,你才能设计出合理的测试策略,才有办法解耦服务间依赖,才能针对性的进行测试数据准备,出了问题才能够定位是 关的问题、还是服务发现的问题、还是逻辑代码的问题,你才能理解线上 警意味着什么问题。
在微服务时代,架构知识也是软件测试工程师需要掌握的基础知识。
专项测试技能
我为什么把各项专项测试技能称为招式呢我觉得他们都是套路。不管是服务端测试、WEB测试、APP测试还是性能测试,他们的基本套路是一致的:准备测试数据、搭建测试执行环境、执行测试、校验结果、产生测试 告。
他们的不同点只是使用的测试工具不同,比如服务端测试HTTP协议时,使用使用request这个Python库,WEB测试使用的是Selenium,APP测试使用的Appium,性能测试使用的是Jmeter或者Locust。
这些不同的工具也有很多共同点,比如进行web自动化测试的Selenium和进行APP自动化测试的Appium都是基于webdriver的,他们的使用大同小异。
下面,我将这些套路拆解开了给大家看。
2.1 测试基础
自动化测试,涉及到编写脚本、开发工具,需要掌握一门编程语言才可以。目前软件测试领域常用的编程语言有Java和Python,大家可以选择任意一种来掌握。
除了编程语言,我们还要掌握相应的单元测试框架,Java中常用的单元测试框架是TestNG,Python中常用的单元测试框架是Pytest。单元测试框架的价值在于,帮助我们管理测试用例、执行测试用例、方便进行测试参数化,进行断言和输出测试结果。有了这些功能后,我们只需要关注我们测试代码的逻辑编写就好了,可以大大提高开展自动化测试的效率。
2.3 代码级质量保障
有的时候,如果拿不到API文档或者不清楚服务内部的逻辑,就需要通过抓包、和开发人员沟通、查看业务源代码等方式,明确API或者服务的逻辑信息,再进行针对性的 准备 测试数据、 设 计 测试用例。
对于服务端测试,发起测试的手段有Postman、Curl或者通过编写代码,通常来讲,试验性的查看接口是否能通,会使用Postman、Curl这类工具,但是为了更加全面、能够方便与CI流水线集成,我们更加推荐使用编写代码的方式发起测试。
服务端测试的检查点,我们通常要求对响应结果,以及数据流过的所有环节,包括数据库、kafka等进行校验,这样做的好处是,一方面能够强迫我们要对每一个接口或者处理流程做到心中有数,在服务出现问题时,能够很快的定位到问题所在。另外一个方面,当测试用例执行失败时,也能很快定位失败的位置,提交BUG时,就能够很快的给出BUG的出错的原因。
根据现在流行的菱形结构测试体系,服务端测试要尽量做到全面,要有更高的测试覆盖率。
2.5 持续集成
Web页面不稳定、或者在开发初期的项目,通常采用手工测试方法。对于回归测试、UI长期稳定的页面展开自动化测试。
如果要做自动化测试,还需要掌握Selenium的使用,能够对浏览器元素进行定位和操作,能够使用Page Object模型封装页面元素,提高自动化测试用例的可维护性,能够通过Selenium Grid进行多浏览器的并行测试提高测试效率。
将自动化测试脚本与单元测试框架融合,并与持续集成流水线集成到一起,才能发挥Web自动化测试的真正威力和价值。
2.7 APP测试
性能测试通常是借助一定的手段,模拟大量用户的并发请求,观察服务端的响应时间和QPS等数据,以判断服务端性能瓶颈,并对其进行优化或者扩容。性能测试通过需要借助测试工具来展开,主流的性能测试工具包括Jmeter、Locust等。
在进行性能测试时候,通常需要大量的机器组成集群一起向服务器发起请求。 因此性能测试集群的搭建,在性能测试工作中非常重要。 在早期我们通常是申请高配置的虚拟机来组成性能测试集群,不过这种方式有诸多弊端,一个是代价昂贵, 二 是初始化比较麻烦。 所以,伴随着容器云的发展,现在越来越多采用在Kubernetes集群中构建性能测试集群。
性能测试往往需要准备大量的测试数据,所以往往需要编写脚本和工具来自动化生成测试数据。对于测试人员的代码编写能力要求很高。
收集 性能测试结果,是性能测试的关键一环。我们需要得到性能测试结果并对其进行分析。目前常用的收集方式是通过监控系统,比如falcon、Promethus等,对服务进行业务监控、资源监控,监控系统会根据各种指标绘制直观的图表,非常便于我们分析。
对于性能测试结果的分析,真的是一个高深的技能。在这个环节会用上前面介绍的计算机基础(内功)部分各个学科的知识,需要从代码层面、数据库层面、 络层面、操作系统层面找出性能瓶颈的根本原因。这一点非常难,需要多年的实践经验。
2.9 测试平台开发

测试平台的目的是更好地辅助测试工作,通常我们会为测试工作开发一些测试数据生产平台,Mock平台、测试执行管理平台、测试 告管理平台。
测试数据生产平台,作为 准备 测试数据的统一平台,集成了各种测试数据准备方法,对外提供Restful API,所有测试数据使用方,可以通过唯一的平台和API产生自己所需要的测试数据。
Mock平台,方便对依赖服务进行Mock,以便与依赖服务 解耦 ,专注于本模块、本服务的测试,提高测试稳定性。
如果需要,可以将所有测试执行集成到一个测试执行管理平台上,这个平台对接Jenkins,在平台上方便进行测试Job的创建和配置,简化测试执行流程。
测试 告平台作为测试 告的存储、分析和展示平台,可以查询历史上所有测试的测试结果。对被测试服务的历史版本质量进行分析。
总之,测试开发工作在软件测试工作中,将会占据越来越大的比例,测试工程师要掌握一定的开发技能,比如借助常见的开发框架Django或者Spring Boot,配合前端框架Vue.js,进行测试平台开发是性价比比较高的方案。
综合素质
前面介绍了计算机基础( 内功)和专项测试技能(招式),为了更好地做好测试工作和更好的职业发展,一些基本的素质也是非常重要的。
首先,我觉得测试工程师要保持学习热情,锻炼学习方法,提高学习能力,能够在需要的时候快速学习新的技术。
测试工程师作为研发团队的一份子,具备良好的沟通表达能力,做好与产品经理、开发人员之间的沟通,及时预警潜在风险,展示项目质量,推动和协调团队解决问题。
非常建议大家及时总结所学知识,养成写博客的良好习惯,大家都说输出是最好的输入,在写博客进行输出的过程中,其实是对自己的知识进行加固的过程。
总结
总之,软件测试工作是一项对综合能力要求非常高的工作,对于测试工程师要求的技术面特别广,既要懂得操作系统、计算机 络、数据库、编程和算法等基础知识这些内功,又要掌握多种测试领域的测试套路,还要具有一定的开发能力。既要懂软件测试,还要了解DevOps。
我花了10年认清了软件测试的知识体系和技能要求,并一直在路上学习和探索。希望大家看了这篇文章之后,能够比我更早领悟。
燃烧秀发输出内容,如果有一丢丢收获,点个赞鼓励一下吧!
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!