初、中、高级测试工程师面试题汇总(附答案)

初、中、高级测试工程师面试题汇总(附答案)

2023年6月28日发(作者:)

初、中、⾼级测试⼯程师⾯试题汇总(附答案)【热⾝题】1.为什么选择测试这⾏?因为其具有挑战性和成就感,找⼀些系统隐藏的逻辑漏洞的时候,⾃⼰就⾮常的开⼼。并且测试需要细⼼和耐⼼,⾃⼰可以很快的分析bug的来源。2.请描述下你公司的测试流程?需求分析讨论-确定测试策略-设计测试⽤例-测试⽤例评审-beta测试-uat测试-测试报告【基础题】1.软件测试项⽬从什么时候开始为什么?需求确认开始,因为在需求阶段,测试可以评审需求并进⾏静态测试,减少开发过程中的bug。2.软件的评审⼀般由哪些⼈员参加?其⽬的是什么?参加⼈员:需求业务⼈员、产品经理、项⽬经理、开发⼈员、测试⼈员;⽬的:查看软件在未正式投⼊运⾏前是否还存在问题。对于不同软硬件平台能否正常运⾏,是否有与客户理解不⼀致的地⽅,同时可以对⼀些可以改进的地⽅再多加改进。3.如何设计测试⽤例?什么样⼦的测试⽤例是好⽤例?掌握边界值分析、等价类划分、错误推测等⽅法来设计测试⽤例。好⽤例是⼀个完备的集合,它能够覆盖所有等价类以及各种边界值;需要从软件功能需求出发,全⾯地,⽆遗漏地识别出测试需求;最好是代码覆盖测试也全⾯的测试。4.不能发现BUG的测试⽤例不是好的测试⽤例吗?不⼀定,要看情况,如果测试⽤例质量⾼,没有发现bug,说明开发质量⾼。但⼀般程序都会有bug,如果没有发现BUG,就要思索测试场景是否有遗漏,需求是否理解没到位。5.测试⽤例需要哪些⼈来评审?产品经理,开发⼈员,测试⼈员,业务需求⼈员。6.什么是bug?没有实现需求说明书列出的功能,出现了没有需求说明书提到不该出现的事情;实现了多的功能;没有实现应该实现的逻辑。7.简单概述缺陷报告,并说明包括哪些项?缺陷描述,缺陷的优先级,缺陷的标题,缺陷所属版本号,缺陷所属的功能模块,操作步骤,预期效果,缺陷原因,缺陷所属的开发⼈员。8.开发⼈员修复缺陷后,如何保证不影响其他功能?重新执⾏测试⽤例,并且针对这个缺陷影响的相关点写新的测试⽤例。9.开发⼈员说不是bug时,你如何应付?⾸先把⾃⼰的理由,并以需求说明书为⾃⼰的站点,如果开发⼈员还是不认同,可以把⾃⼰的观点和理由,提交给产品经理,由其去决定是否为⼀个bug。10.当测试过程发⽣错误时,有哪⼏种解决办法?  a.跳转其他的测试流程;  b.调⽤某个程序能绕过这个错误,继续后⾯的流程。11.所有的软件缺陷都能修复吗?所有的软件缺陷都要修复吗?能修复,但不⼀定所有的缺陷都要修复。12.进⾏测试时产⽣了哪些⽂档或记录?测试⽤例,测试报告,测试⽇报14.功能测试在 beta 版本对外的上线标准是什么?测试⽤例全部跑完并且bug都已经关闭,然后业务验收后可以上线。15.开发⼈员⽼是犯⼀些低级错误怎么解决?  a.要求开发⼈员进⾏⾃测,把这些问题在开发阶段就解决好  b.通过缺陷管理系统对开发⼈员进⾏控制16.为什么尽量不要让时间富裕的员⼯去做⼀些测试?  a.⾮专业测试⼈员,没有组织性的测试⼯作,没有规律和针对性,会影响到测试的质量和版本更新的速度。  b.专业测试⼈员(但不是这个项⽬的测试员)这些⼈员不受测试计划的时候和任务约定,测试完毕后评估测试⼩组的⼯作质量,不利于bug管理。【进阶题】1.什么是单元测试、功能测试、集成测试?加分项:单元测试、功能测试、集成测试分别在web端、接⼝端、移动端的定义,你平时是怎么理解它们的?单元测试:是针对程序模块来进⾏正确性检验的测试⼯作;  功能测试:在单元测试的基础上,测试某⼀个功能点;  集成测试:将所有模块按照设计要求组装成为⼦系统或系统,进⾏集成测试;  web端  单元测试/功能测试:页⾯元素是否正确显⽰其有效功能,如提交的action是否正确,搜索点击是否执⾏;  集成测试:调⽤了后端接⼝的数据是否显⽰正常,能否满⾜需求;  接⼝端:模块/系统之前的调⽤,接⼝是否与设计相符,模块组合后是否满⾜需求;  单元测试:某个函数/⽅法 写的代码是否达到编写者的预期;  功能测试:为实现⼀个功能点,调⽤⼏个⽅法/函数。2.什么是兼容性测试?兼容性测试是检查软件在不同软件平台,硬件平台上是否可以正常运⾏的测试。主要查看软件在不同操作系统、浏览器、数据库中是否运⾏正常.3.⽩盒和⿊盒的区别,你是怎么运⽤的?⿊盒测试:已知产品的功能设计规格,可以进⾏测试证明每个实现了的功能是否符合要求。利⽤其检查功能是否符合需求说明书,能够正常使⽤。⽩盒测试:已知产品的内部⼯作过程,可以进⾏测试证明每种内部操作是否符合设计规格要求,所有内部成分是否经过检查。利⽤其检查程序模块的内部逻辑⾛向,主要覆盖程序内的逻辑。4.静态测试和动态测试有什么区别?静态测试:不运⾏程序,针对PRD等检查代码,审查代码,静态结构分析,分析代码质量;动态测试:运⾏程序进⾏⿊盒测试和⽩盒测试。5.您所熟悉的测试⽤例设计⽅法都有哪些?请分别以具体的例⼦来说明这些⽅法在测试⽤例设计⼯作中的应⽤。⿊盒:边界值分析法:如参数的范围0-128,输⼊128,129,0这些值,查看是否有错误等;错误推测法:导⼊功能时,表格为空表格,表格输⼊1⾏,表格输⼊10000⾏等;因果图⽅法:组合参数逻辑图;场景分析法:根据⽤户操作模拟⽤户操作。⽩盒:逻辑覆盖法,基本路径测试。6.您在以往的测试⼯作中都曾经具体从事过哪些⼯作?其中最擅长哪部分⼯作?做过web测试,⼩程序测试,H5页⾯测试,后台测试,接⼝测试。最擅长接⼝测试,⾃⼰给公司的业务流程写过⼀套⾃动化框架,⽤于回归业务流程。7.在您以往的⼯作中,⼀条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交⾼质量的软件缺陷(Bug)记录?前提条件、测试环境、操作步骤、预期结果、实际结果、严重等级、版本信息,出现概率;问题描述和操作步骤要尽可能描述详细,可以初步分析bug是客户端的问题还是服务端的问题。8.什么是内存泄漏、Http错误率、吞吐率。响应时间分别在web端和移动端是多少?哪些场景可以证明响应超时?内存泄漏(Memory Leak)是指程序中⼰动态分配的堆内存由于某种原因程序未释放或⽆法释放,造成系统内存的浪费,导致程序运⾏速度减慢甚⾄系统崩溃等严重后果。HTTP错误率(HTTP error rate) 在选定时间段内,HTTP错误数量与请求数量的⽐率。吞吐率(Throughput) 是场景运⾏过程中服务器每秒的吞吐量。其度量单位是字节,表⽰每个请求连接在任何给定的每⼀秒从服务器获得的数据量。web端当⽤户在2秒以内得到响应时,会感觉系统的响应很快;当⽤户在2-5秒之间得到响应时,会感觉系统的响应速度还可以;⽽当⽤户在超过8秒后仍然⽆法得到响应时,会感觉系统糟透了,或者认为系统已经失去响应。场景:请求超时、页⾯加载失败【⾼级题】1.什么是⾯向对象编程?⾯向对象编程就是把具有共性的事务抽象成属性和⽅法来进⾏编程。 类中的start() 和 run() ⽅法有什么区别?start()⽅法可以⽤来启动线程,调⽤该⽅法,会创建⼀个新的线程,然后内部执⾏run()⽅法;不能多次调⽤,否则会抛异常;直接调⽤run()⽅法,不会创建新的线程;可以进⾏多次调⽤。3.说下左连接和右连接⽐如有两张表 A,B。左连接是把符合条件的所有A表的内容列出来,B表如果没有内容匹配⽤NULL代替。右连接是符合条件的所有B表的内容列出来,A表如果没有内容匹配⽤NULL代替。4.介绍下什么是索引索引是由表或者视图中的⼀列或多列⽣成的键,可以加快在表或者视图中检索⾏的速度【接⼝测试相关】1.什么是接⼝测试?接⼝测试是测试系统组件间接⼝的⼀种测试。接⼝测试就是测试不同系统或模块之间资源交互是否正确。2.为什么要做接⼝测试?因为在⼤部分系统和产品中,资源数据都是核⼼,所以接⼝是需要要测试的,并且接⼝中⼤部分内容都是数据,通过数据的对⽐可以推测系统和产品的逻辑,测试接⼝就是测试逻辑。所以很必要做接⼝测试。3.什么时候做接⼝测试?  a.出现bug,通过接⼝测试,清晰找到bug的源头,是前端还是后端的bug;  b.回归测试,利⽤接⼝测试原有的接⼝是否正常,保证之前的业务流程没有受影响;  c.接⼝开发完成后,可以做接⼝测试。4.接⼝测试的⼯具有哪些soapUI、postman、jemeter、insomnia、paw。5.接⼝测试的流程是什么?  a.接⼝的通过性验证:数据正确输⼊,是否正确返回结果。测试接⼝的正常场景和异常场景;  b.边界测试:不按照你接⼝⽂档上的要求输⼊参数,测试其边界情况。⽐如说必填的参数不填,输⼊整数类型的正常,超过参数取值范围等;  c.参数组合:如果接⼝中有参数需要组合⽤的,两个参数是组合使⽤,测试其各种情况;  d.异常验证:测试幂等情况,并发情况,事务测试等异常情况;  e.接⼝安全:绕过验证,敏感信息加密等情况;  f.性能测试:响应时间、并发数、吞吐量、服务器资源利⽤率。6.请问你们公司是如何做接⼝测试的?swagger 、 接⼝⾃动化脚本。7.接⼝测试质量评估标准是什么?接⼝表现与接⼝⽂档的⼀致性;请求参数:必选和⾮必选、长度、字符类型、为空、缺失、组合、重复;返回数据:正常和异常。【⾃动化测试相关】1.如何看待⾃动化和⼿动测试?怎样的⼀个⽐例才是健康的?⾃动化适合做为回归测试的主要⽅式,新上线的功能⼀般都是⽤⼿动测试⽅式,⼀些极端和⽤户习惯操作还是⼿动测试⽐较⽅便。尽可能线上稳定的功能模块都做成⾃动化,提供效率。2.你们公司的⾃动化投⼊产出⽐怎样?效益怎样?⾃动化主要作为回归测试,减少测试时间。UI⾃动化没有弄,基本找不到bug 。3.完整运⾏⼀次⾃动化⽤例需要多久时间?主要跑的是业务流,所以跑⼀次需要半个⼩时左右。4.什么是分层⾃动化?⾦字塔结构, 最底层UnitTest,往上接⼝API/集成起来的service, 最上⾯UI⾃动化。5.你的测试数据是怎么准备的?提前准备好,在代码⾥的yaml⽂件。6.测试脚本的维护成本是怎么样的?业务不变的情况下,⼀般脚本都是不坏不动的。【性能测试相关】1.请问你们公司是如何做性能测试的?请讲诉性能测试的相关指标?  a.做性能需求分析,挑选了⽤户使⽤最频繁的功能来做性能测试,⽐如:登陆,搜索,提交订单,确定性能指标,⽐如:事务通过率为100%,90%的事务响应时间不超过5秒,并发⽤户为1000⼈,CPU和内存的使⽤率为70%以下;  b.性能测试计划,明确测试时间(通常在功能稳定后,如第⼀轮测试后进⾏)和测试环境和测试⼯具的选择;  c.编写性能测试⽤例;  d.搭建性能测试环境,准备好性能测试数据;  e.通过性能测试⽤例,编写性能测试脚本;  f.性能测试脚本进⾏调优,设置检查点、参数化、关联、集合点、事务,调整思考时间,删除冗余的脚本等;  g.设计性能测试场景,使⽤nmon⼯具监控服务器,运⾏测试场景;  h.分析性能测试结果,如果有问题(性能瓶颈),收集相关的⽇志提单给开发修改;  i.开发修改好后,回归性能测试;  j.编写性能测试报告;  相关指标:响应时间、并发数、吞吐率、资源利⽤率、TPS。2.压⼒测试和负载测试的区别负载测试是模拟实际软件系统所承受的负载条件的系统负荷,通过不断加载(如逐渐增加模拟⽤户的数量)或其它加载⽅式来观察不同负载下系统的响应时间和数据吞吐量、系统占⽤的资源(如CPU、内存)等,以检验系统的⾏为和特性,以发现系统可能存在的性能瓶颈、内存泄漏、不能实时同步等问题。压⼒测试是在⾼负载情况下对系统的稳定性进⾏测试。是在⾼负载(⼤数据量、⼤量并发⽤户等)下的测试,观察系统在峰值使⽤情况下的表现,从⽽发现系统的功能隐患。负载测试:多⽤户,⽤户数渐增,持续同时发同⼀业务请求,产出最⼤TPS;压⼒测试:多⽤户,资源使⽤饱和,持续同时发同⼀业务请求,产出系统瓶颈或使⽤极限。3.服务器中⼀般要监控哪些数据,如何监控的,怎么从监控数据中发现问题?基础监控和应⽤监控。基础监控包括机器是否死机,cpu,内存,磁盘使⽤率等;应⽤监控包括⽇志监控、端⼝监控、进程数监控等。4.假设系统A调⽤系统B,我把B的接⼝都mock了,进⾏性能测试,这样有什么好处和坏处?好处:防⽌系统B出错引起测试错误;不会因系统B的开发进度影响测试;mock后可以快速返回结果,提⾼测试效率。坏处:很多情况下⽆法完全模拟出服务器的所有可能的返回情况,另外,mock掉了关联⽅之后,整个环境的连通性可能测试的不到位。5.有⼀天早上打车⾼峰,滴滴服务端挂了⼤概30分钟,⼯程师抢修之后,马上上线,之后⼜挂了,请问有哪些原因会造成这个情况?服务器内存不够、服务器超出负载、并发量太⼤、遇到恶意攻击。【编程相关】1.请写出冒泡排序。#冒泡排序:n*ndef bubbleSort(array): maxindex = len(array)-1 maxValue = array[maxindex] k=0 while maxindex: for i in range(1,maxindex): if array[i-1]>array[i]: temp = array[i] array[i] = array[i-1] array[i-1] = temp k+=1 maxindex -=1 print(k) return array2.1~9999数列中数字3出现的次数。⽤递推⽅法解出。def count_digit(number): return len(str(number))def countThree(digit): if not isinstance(digit,int): raise TypeError('number is not int') # digit = len(str(number)) if(digit <=0): return 0 if(digit ==1): return 1 return 10*countThree(digit-1) + 10 **(digit-1)print(countThree(count_digit(9999)))3.从⼀个数组中找出前4个最⼤的数,⽤最优解。#快速排序:最快的n*logNdef qiuckSort(list): if len(list)<2: return list mid = list[0] left = [i for i in list[1:] if i <= mid] right = [i for i in list[1:] if i > mid] finallyList = qiuckSort(left)+[mid] + qiuckSort(right) return finallyListarray = [3, 0, 1, 832,23,45, 5, 5, 6,46, 9, 56, 897]print(qiuckSort(array)[-4:])4.写⼀段程序,删除字符串a中包含的字符串b,举例 输⼊a = “asdw”,b = “sd” 返回 字符串 “aw”,并且测试这个程序。def delBString(a,b): if not isinstance(a,str): raise TypeError("a is not str") if not isinstance(b,str): raise TypeError("b is not str") if len(a) < len(b): raise Exception('a length must large to b length') result = [] flag = False i=0 la = len(a) lb = len(b) while i =a[i] >= '0': res +=(ord(a[i]) -48) * mult mult = mult *10 else : return 0 return res * flagdef test_strToInt2(self): with (TypeError): StrToInt(34)测试⽤例:def test_strToInt3(self): assert StrToInt('测试赛') == 0def test_strToInt4(self): assert StrToInt('+2147689') == 2147689def test_strToInt5(self): assert StrToInt('45') == 45def test_strToInt6(self): assert StrToInt('1a33') == 0def test_strToInt7(self): assert StrToInt('-5') == -56.给定⼀个整数数组 nums 和⼀个⽬标值 target,请你在该数组中找出和为⽬标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输⼊只会对应⼀个答案。但是,你不能重复利⽤这个数组中同样的元素。⽰例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]# Pythondef TargetSum(nums,target): if len(nums) < 2: return 0 for i in range(0,len(nums)-1): for j in range (i+1,len(nums)): if nums[i] + nums[j] == target: return [i,j]# 测试⽤例def test_TargetSum1(self): assert TargetSum([1,1,3,6,0,2],2) == [0,1]def test_TargetSum2(self): assert TargetSum([1],1) == 0def test_TargetSum3(self): assert TargetSum([6,2,4,3,1,2],4) == [1,5]def test_TargetSum4(self): assert TargetSum([2, 7, 11, 15],9) == [0,1]// Javapublic int[] TargetSum(int nums[],int target){ Map map = new HashMap<>(); for(int i=0;i<;i++){ int temp = target - nums[i]; if(nsKey(temp)){ return new int[] { (temp), i }; } (nums[i],i); } return null; }7.给定⼀个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于⽬标数。函数应该返回这两个下标值 index1 和 index2,其中index1 必须⼩于 index2。‘’’说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输⼊只对应唯⼀的答案,⽽且你不可以重复使⽤相同的元素。⽰例:输⼊: numbers = [2, 7, 11, 15], target = 9输出: [1,2]解释: 2 与 7 之和等于⽬标数 9 。因此 index1 = 1, index2 = 2 。‘’’## pythonclass Solution(object): def twoSum(self, numbers, target): l=0 r=len(numbers)-1 while(l= 3): result = num1 + num2 num1 = num2 num2 = result n -=1 return result## Java ##public int setpMethod(int n){ if(n ==1 || n ==2){ return n; } int result = 0,n1 = 1,n2 = 2; while (n>=3){ result = n1 + n2; n1 = n2; n2 = result; n--; } return result; }9.给定⼀个⾮负整数数组,你最初位于数组的第⼀个位置。数组中的每个元素代表你在该位置可以跳跃的最⼤长度。判断你是否能够到达最后⼀个位置。‘’’⽰例 1:输⼊: [2,3,1,1,4]输出: true解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后⼀个位置。⽰例 2:输⼊: [3,2,1,0,4]输出: false解释: ⽆论怎样,你总会到达索引为 3 的位置。但该位置的最⼤跳跃长度是 0 , 所以你永远不可能到达最后⼀个位置。‘’’## python ##class Solution(object): def canJump(self, nums): need = 1 if(len(nums) ==1): return True if(nums[0] == 0): return False for i in range(len(nums)-2,-1,-1): if(nums[i] == 0 or nums[i] < need): need += 1 else: need = 1 if(need == 1) : return True else: return False## java ##public boolean canJump(int[] nums) { int n = 1; if( ==1){ return true; } if(nums[0] == 0){ return false; } for(int i=-2; i>=0; i--){ if(nums[i] >= n){ n=1; }else{ n++; } } if(n == 1){ return true; }else{ return false; } }10.以 Unix 风格给出⼀个⽂件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。在 Unix 风格的⽂件系统中,⼀个点(.)表⽰当前⽬录本⾝;此外,两个点 (…) 表⽰将⽬录切换到上⼀级(指向⽗⽬录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径.请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个⽬录名之间必须只有⼀个斜杠 /。最后⼀个⽬录名(如果存在)不能以 / 结尾。此外,规范路径必须是表⽰绝对路径的最短字符串。⽰例 1:输⼊:"/home/"输出:"/home"解释:注意,最后⼀个⽬录名后⾯没有斜杠。⽰例 2:输⼊:"/…/"输出:"/"解释:从根⽬录向上⼀级是不可⾏的,因为根是你可以到达的最⾼级。⽰例 3:输⼊:"/home//foo/"输出:"/home/foo"解释:在规范路径中,多个连续斜杠需要⽤⼀个斜杠替换。⽰例 4:输⼊:"/a/./b/…/…/c/"输出:"/c"⽰例 5:输⼊:"/a/…/…/b/…/c//.//"输出:"/c"⽰例 6:输⼊:"/a//bc/d//././/…"输出:"/a/b/c"##python##def simplifyPath(self, path): """ :type path: str :rtype: str """ paths = ('/') str = '' pathlist = [i for i in paths if I] result = [] for j in range(len(pathlist)): print(j) if(pathlist[j] == ".."): if(result): () elif(pathlist[j] == "."): continue else : (pathlist[j]) if not result: return '/' for k in range(len(result)): str = str + '/' + result[k] return str11.给定⼀个字符串 (s) 和⼀个字符模式 § ,实现⼀个⽀持 ‘?’ 和 ‘’ 的通配符匹配。’?’ 可以匹配任何单个字符。’’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的⼩写字母。p 可能为空,且只包含从 a-z 的⼩写字母,以及字符 ? 和 *。⽰例 1:输⼊:s = “aa”p = “a”输出: false解释: “a” ⽆法匹配 “aa” 整个字符串。⽰例 2:输⼊:s = “aa”p = ""输出: true解释: '’ 可以匹配任意字符串。⽰例 3:输⼊:s = “cb”p = “?a”输出: false解释: ‘?’ 可以匹配 ‘c’, 但第⼆个 ‘a’ ⽆法匹配 ‘b’。⽰例 4:输⼊:s = “adceb”p = “ab”输出: true解释: 第⼀个 ‘’ 可以匹配空字符串, 第⼆个 '’ 可以匹配字符串 “dce”.⽰例 5:输⼊:s = “acdcb”p = “a*c?b”输⼊: false##python##def isMatch(self, s, p): si, pi, pj, sj = 0, 0, -1, -1 while si < len(s): if pi < len(p) and p[pi] == '*': pi += 1 pj = pi sj = si elif pi < len(p) and (p[pi] == '?' or p[pi] == s[si]): pi += 1 si += 1 elif pj != -1: pi = pj sj += 1 si = sj else: return False while (pi < len(p) and p[pi] == '*'): pi += 1 return pi == len(p)12.给出两个 ⾮空 的链表⽤来表⽰两个⾮负的整数。其中,它们各⾃的位数是按照 逆序 的⽅式存储的,并且它们的每个节点只能存储 ⼀位数字。如果,我们将这两个数相加起来,则会返回⼀个新的链表来表⽰它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。⽰例:输⼊:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807## python ##class Solution(object): def addTwoNumbers(self, l1, l2): n = + l3 = ListNode(n%10) = ListNode(n//10) p1 = p2 = p3 = l3 while True: if p1 and p2: sum = + + = sum % 10 = ListNode(sum//10) p1 = p2 = p3 = elif p1 and not p2: sum = + = sum %10 = ListNode(sum // 10) p1 = p3 = elif not p1 and p2: sum = + = sum % 10 = ListNode(sum // 10) p2 = p3 = else : if == 0: = None break return l3最后: 可以在公众号:软件测试⼩dao ! 免费领取⼀份216页软件测试⼯程师⾯试宝典⽂档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联⽹程序原理、Mysql数据库、抓包⼯具专题、接⼝测试⼯具、测试进阶-Python编程、Web⾃动化测试、APP⾃动化测试、接⼝⾃动化测试、测试⾼级持续集成、测试架构开发测试框架、性能测试、安全测试等。这些测试资料,对于做【软件测试】的朋友来说应该是最全⾯最完整的备战仓库,这个仓库也陪伴我⾛过了最艰难的路程,希望也能帮助到你!敲字不易,如果此⽂章对你有帮助的话,点个赞收个藏,给作者⼀个⿎励。也⽅便你下次能够快速查找。好⽂分享

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687931164a58282.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信