请选择行业
请选择职位
请选择省份
请选择城市

最全的软件测试面试题(下)

时间: 2023-11-08 13:53   作者: 你遗憾吗   点击次数: 
 
  Jmeter
  1.熟练使用Jmeter做接口性能测试
  一:性能测试流程
  首先拿到接口文档,梳理业务(登录–搜索商品–添加购物车–支付),将业务中的接口填充在jmeter的 http请求中,然后增加并发量,关注性能指标是否符合要求
  二:性能指标
  聚合报告:并发量,响应时间(2/5/原则),吞吐量,错误率(0.05%) 服务器:cpu和内存
  三:吞吐量
  系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间 TPS:单位时间内处理事务的能力 QPS:每秒查询率 TPS=并发数/响应时间 吞吐量一般设置在100左右
  四.性能测试
  1. 右键——添加——线程——线程组——设置线程数——用时——循环次数
  2. 右键线程组——添加——取样器——HTTP请求, 设置协议——服务器名称或IP端口号,请求方式,路径,内容编码
  3. 右键线程组——添加——监听器——查看结果树和聚合报告
  4. 运行, 查看结果
  五.接口关联/依赖
  第一种方式:json提取器 在第一个接口右键添加后置处理器中的json提取器,在json提取器中设置变量名和json表达式提取的 值,在第二个接口中通过${变量名}引用。
  第二种方式:正则表达式 在第一个接口右键添加后置处理器中的正则表达式,在正则表达式中设置变量名和正则表达式,在第二个 接口中通过${变量名}引用。
  六.常见的断言
  第一种:响应断言(适用返回文本是json类型或者是xml类型)。
  第二种:json断言(只适用返回文本是json类型的)。
  第三种:xpah断言(适用html界面)。
  七.接口是否有问题
  在聚合报告中查看error(错误率) 在察看结果树中的响应数据中查看报错信息 在察看结果树中的导入本地文件,打印错误信息。
  八.如何操作秒杀
  在秒杀的接口中添加定时器中的集合点(SynChronizing Timer),实现在规定的时间点上去一次性执行所有请求。
  九.参数化/批量
  第一种方式:csv文件读取 将测试的数据保存在本地的文件中,在该接口中添加CSV数据文件设置,指定本地文件;设置变量 名,如果文件中有多个接口,需要在变量名中使用英文逗号;在该接口中使用${变量名};接着在该接口中设置 断言,验证预期结果和实际结果。
  第二种方式:函数助手 将测试的数据保存在本地的文件中,点击选项中的函数注释对话框,选中jmeter中内置方法 _CsvRead,填写本地文件的路径和对应对的索引值生成对应的函数值,在该接口中使用${变量名};接着在该 接口中设置断言,验证预期结果和实际结果。
  Python
  1、Python的数据类型
  数字、字符串、列表、字典、元祖、集合。
  2、字符串的常见操作
  1)根据下标索引取值,从0开始
  2)切片  语法:[起始下标:结束:步长],左闭右开区间    反转字符串[::-1]
  常见操作:
   str.find()  查找,没有返回-1
      str.index() 查找,没有报错
      str.Count()  计数
      str.replace()  替换
      str.split()   对其进行切片 ,以。。。分割
      str.startwith()  以...开头
      str.endswith()  以...结尾
      str.join()   构造出一个新的字符串
  3.列表的常见操作
  循环遍历   for i in 列表:
  根据下标索引取值
  相关操作:
  增 list.append() 列表尾部添加元素   append添加的是一个整体
     list.extend() 将另一个集合中的元素逐一添加到列表中  extend将元素逐一添加
     list.Insert(index,object) 在指定位置index前插入元素object  没有索引报错
  删 del:根据下标进行删除  不加下标,整体删除,会报未定义
     pop:默认珊瑚最后一个元素,也可以根据下标
     remove:根据元素的值进行删除
  改  根据下标直接修改
  查   in  在...里
    not in
      index(”元素”,起始,结束)左闭右开区间
      Count  计数
  常见操作: 排序 sort方法是将list按特定顺序重新排列,默认由小到大,参数reverse=True可改为倒序
    反转 reverse 将list逆置
  列表的嵌套   根据下标:如[-1][0]
  可变   根据id内置方法查看
  4.元祖的常见操作
  不可变,元素不能修改
  内置函数 index和Count
  5.字典的常见操作
  {”key”:”value”}
  查  根据键取值,没有这个键就会报错
   dict,get(”键”,”自己的描述”)    没有回报None,或者根据自己的描述
      dict.keys    取出所有键(元祖)
      dict.values   取出所有值(元祖)
      dict.items    取出所有键值对(元祖)
  改: 通过键直接赋值
  增   变量名[”键”] = 数据  没有直接添加,有就修改
   多条修改(增)  info.Update({”name”:”laoliu”,”age”:”20”})
  删    del 删除指定的元素(删除后不能访问,否则会报错)
     clear  清空,返回{}
        pop(”键”)
  len()    查看键值对的个数
  6.集合的常见操作
  例:{2,6,5}
  特性:无序、唯一、可变set()
  创建空集合必须使用set()
  增:  add
      Update  把要传入的元素拆分,作为个体传入到集合中
  删   remove  使用remove删除集合中的元素  如果有 直接删除 如果没有 程序报错
    pop     使用pop删除是随机删除集合中的元素 如果没有元素程序报错
       discard  如果元素存在 直接删除 如果元素不存在 不做任何操作
  交集  & 或者s.intersection()
  并集  | 或者s.union()
  差集  - 或者s1.difference(s2)   将集合s1里去掉和s2交集的部分
  补集  ^ 或者s.synmetric_difference() 并集里去掉交集的部分
  7.变量
  type  查看变量的类型
  命名规则  1.只能由字母、数字、下划线”_”组成
        2.不能以数字开头
           3.不能使用python中的关键字
           4.见名知意
  格式化输出 % %s匹配字符串
      %d有符号十进制整数
             %f浮点数
           format  
  8.输入输出
  输入:input
  输出:print
  9.运算符
  算数运算符 : +(加)-(减)*(乘) /(除) //(取模) **(幂)
  赋值运算符: = 
  复合赋值运算符: += -= *= /= **=
  比较关系运算符: == != 
  逻辑运算符:an d or not
  10.熟练使用单元测试脚本unittest,pytest
  unittest:它是python中自带的单元测试模块,用来做单元测试,它里面封装好了一些校验返回结果方法(断言)和一些用例执行前的初始化操作。
  unittest中最核心的部分是:TestFixture、TestCase、TestSuite、TestRunner
  TestFixture:用于测试环境的准备,销毁,还原。 主要方法:setUp(),tearDown(),setUpClass(),tearDownClass()
  TestCase: 测试用例
  TestSuite:组件,测试用例的集合
  TestRunner:执行测试用例
  pytest
  1.pytest的命名规则
  pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开头的类和方法,比unittest更加严谨。
  pytest的模块命名必须以test_开头或者结尾,否则不能找到该模块的测试用例。
  2.pytest与unittest的相同点
  unittest :Setup>> setupclass , teardown >> teardownclass
  Pytest: setup, setup_class和teardown, teardown_class函数(和unittest执行效果一样)
  运行于测试方法的始末,即:运行一次测试函数会运行一次setup和teardown
  运行于测试方法的始末,但是不管有多少测试函数都只执行一次setup_class和 teardown_class
  11.熟练使用selenium+unittest实现PO模型。
  PO模型是Page Object Model的简写, 页面对象模型。
  PO模型又叫PO设计模式,是selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装,将页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,在实际测试中只需要关注业务流程,从而提高可维护性。
  PO模型简单来说:就是通过面向对象的方式,封装页面定位和页面动作操作。与测试的逻辑分开。
  通俗解释一下就是每个页面当成一个对象,给这些页面写一个类,每一个page class维护着该web页的标签元素集和操作这些元素的方法;至于测试脚本则单独写,需要什么就去这些页面类去调用即可。这样的好处就是如果页面元素发生变化,你去维护页面类即可,测试类你基本不用管。
  po 是一种设计思想,不同的人根据这个思想写出来的代码是不一样的。(重点看如何封装)
  总结:PO模型实现过程是:通过面向对象的方式,对页面定位和页面操作进行分离封装(解耦合,方便后续维护)。
  优点:
  提高代码的可读性
  减少了代码的重复
  提高代码的可维护性, 特别是针对UI界面频繁变动的项目.
  (也就是面向对象的优点)
  缺点:
  造成项目结构比较复杂(因为是根据流程进行了模块化处理)
  PO模型一般首先抽象封装一个BasePage类,这个基类拥有一些指向Webdriver实例的属性,然后每一个Page继承基类BasePage,可以通过driver管理每一个Page中的元素,而且在Page中将这些操作封装为一个一个的方法。在测试用例中使用这些page类,进行组织测试步骤的工作。
  这样做的好处,就是有元素变化,只需要维护每一个Page就行了,测试步骤变化,只需要维护TestCase即可。
  如何使用selenium进行web自动化测试
  首先我需要下载selenium,如果是在火狐浏览器上需要下载pip install
  selenium==2.48.0,其次下载与浏览器相近的驱动,接着进行三方库的导入 from selenium
  inport webdriver,紧接着需要创建一个浏览器对象,进行浏览器尺寸、位置的相关设置,如
  窗口最大化maximize_window(),然后获取对应的网址,并结合xpath、css对元素进行定位,
  还会使用switch_to_window(han dles[n])句柄做多窗口之间的切换,就比如我最近一个项目
  标识解析服务这个模块,然后这个里面有一个点击首页标识解析服务跳转的功会跳转至另一个窗口,
  这个时候就需要切换句柄,然后通过定位这个页面里的元素,。还有利用switch_to.frame(变量)
  进行多表单之间的切换,就比如我上个项目的模式训练模块吧,这个里面有一个添加训练这个功能,
  当我点击进去进行定位,然后这个里面有一个“选择训练集”按钮,当点击他的时候又会跳出一个表单,
  如果想要对这个里面进行元素定位,就得使用多表单切换进行操作了。当然还会有一些其他的操作,
  比如鼠标和键盘的操作,弹框操作,设置浏览器等待等等啦  
  结合ant生成测试报告
  .首先配置ANT,Tomcat、Jenkins,配置相应的环境变量
  进?性能需求分析、?案编写、性能脚本编写、执?和维护
  使?Charles进?抓包分析数据并进?修改
  使用ant -v进行验证
  配置库文件:将jmeter extras目录下的ant-jmeter-1.1.1.jar文件拷贝到ant安装目录下的lib文件夹中
  配置ant的编译文件build.xml
  将下图中的build.xml拷贝到Text下的TestAuto目录下的pc目录中
  修改build.xml文件中的数据
  配置jmeter.propertise文档
  在build.xml目录下输入cmd,并执行ant
  在本地查看测试报告
  11.2appium+unittest实现po模型
  首先创建文件
  第一层:basepage层:描述每个页面相同的属性及行为
  第二层:pageobject层(每个的独有特征及独有的行为)
  第三层:testcase层(用例层,描述项目业务流程)
  然后basepage页面封装公共的属性和行为,pageobject业务代码页导入封装的公共方法实例化里面的方法下载pip install Appium-Python-Client==1.3.0导入然后在testcase测试层导入要测试的page页实例化里面的方法调用即可然后导入htmltestRunnt生成测试报告
  requests是怎么做的自动化测试
  我主要是利用requests做接口测试的,首先我需要下载pip install requests,还是以读取
  csv文件为例吧,需要在pycharm里面创建读取文件代码的目录、存放单元测试代码的目录、存
  放csv文件的目录以及生成测试报告的目录,先读取这个csv文件,然后利用requests请求接口
  返回状态码,通常使用get和post方法,在根据pytest断言设置,结合allure生成测试报告
  12.掌握移动端测试ADB命令,Monkey测试,testin云测
  查看移动端设备
  adb devices
  1.开启服务
  adb start-server
  2.关闭服务 
  adb kill-server
  安装软件
  3.adb install apk路径
  覆盖安装
  4.adb install -r apk路径(-r 代表如果apk已安装,重新安装apk并保留数据和缓存文件)
  :查看(系统)包名
  5.系统应用:adb shell pm list packages –s
  查看(第三方)包名
  6.第三方应用:adb shell pm list packages -3
  7查看(全部)包名
  全部包名:adb shell pm list packages
  8卸载软件
  adb uninstall 软件包名
  9将电脑文件传输到移动端
  adb push 电脑路径 移动端路径
  10将移动端文件传输到电脑
  adb pull 移动端路径 电脑路径
  11截屏
  adb shell screencap -p 截图文件路径  四古音卡普
  12查看手机CPU情况
  adb shell dumpsys cpuinfo  当朴塞斯 
  13查看应用内存使用情况
  adb shell dumpsys meminfo +包名:应用的内存使用情况
  14显示磁盘使用信息
  adb shell dumpsys diskstats  地撕开死
  15查看电池状态
  adb shell dumpsys battery  白催
  查询当前应用程序的包名和启动项
  adb shell dumpsys window  |findstr / |findstr name=
  adb shell dumpsys window | findstr mCurrentFocus
  16查看手机日志
  adb logcat
  指定 logcat 的日志输出格式 : -- "-v"选项 : 使用adb logcat -v time 命令, 可以查看日志的输出时间;
  将手机日志输出到本地文件中:adb logcat -v time > C:/log/aa.txt
  17adb shell monkey 100 执行monkey测试100次 针对rom测试或者
  18monkey将只允许系统启动指定的app
  adb shell monkey -p 包名 100
  19显示日志详细程度
  adb shell monkey -p 包名 -v 30 
  20将log信息写到本地
  adb shell monkey 100 >路径
  随机数种子
  adb shell monkey –s 10 100
  事件间隔
  adb shell monkey -p com.example.login --throttle 300 100  服软拉
  --pct-touch 触摸事件
  adb shell monkey --pct-touch 67 -v 10
  调整手势事件motion事件百分比。  
  adb shell monkey --pct-motion 67 -v 10
  正常操作,忽略异常
  --ignore-crashes 银鸽no沃  可挖谁死
  忽略超时
  --ignore-timeouts(ANR)
   Null指针异常
  空指针异常主要是有NullPointerException异常提示,在Monkey测试过程中,该信息一般记录在plog.log (locat中也有该信息)中。
   debug异常
  debug异常主要是由于应用程序本身的错误导致的异常。在Monkey测试过程中,该信息同样记录在plog.log (locat中也有该信息)中。一般情况下,出现的该问题,很可能在手动测试时也可以测试到
  低内存异常
  低内存异常一般情况下,主要表现在出现OutOfMemoryError异常或者提示Out of memory,其后果同样表现为抛出OutOfMemoryError异常或者是通过kill process 来杀掉部分进程以释放内存空间,当然如果被kill点关键的进程的话,也就可能导致部分应用会自动的退出。出现该情况时,主要是在进行频繁的进行大量的操作导致的,所以使用手动的方式也是可能进行重现的
  操作无响应异常
  操作无响应的问题,主要表现在Monkey运行过程中,出现某功能无响应,提示是否“强制关闭“或“等待“,同时会打印出相应的log信息
  常见其他面试题
  项目相关
  一.印象最深的bug
  1.maplocal本地存储出现html5页面,在我确定我的操作步骤没有任何问题的时候,已经向jmeter客服反馈。
  2.之前做开发的时候前端登录的时候必须要验证本地的ip是否在范围内,只有在范围内才可以登录,然后前端在页面加载之前就对ip进行了验证,导致输入网址的时候如果ip不在范围内就会出现白屏。
  3.之前在测试检索的时候,会对检索进行过滤,就是不符合要求的内容是不能检索出的。但是就会出现检索过于绝对,比如说:“镰刀”是要过滤掉的,但是“镰刀会”不能过滤掉,这就会导致镰刀会也会过滤掉。
  二.测试认为是bug,开发认为不是bug
  问题评估确认——明确开发不修改的原因——具体问题具体分析——沟通记录44
  1.找到需求文档或者是原型图进行匹配
  2.尝试多种测试环境和多种测试方法来确认是否为bug
  3.整理bug的复现的步骤和出现的频率
  4.开发坚持不认为是bug的时候找项目经理测试经理进行沟通来确认是否为bug
  5.将客户经理 测试 测试经理和项目经理进行确认会来判定是否为bug
  6.测试人员需要将bug整理并写入测试总结中
  三.遇到bug不能定位如何解决
  A.首先考虑环境问题,看是否能够还原原来的环境
  B.遇到问题就要提,不能放过任何一个Bug,在提交的Bug描述中加上一句话,那就是复现概率,尝试20次,出现一次或尝试10次,交给开发,开发会根据Bug的复现概率,调整改Bug的优先级。
  C.尽量回想发生问题时的复现步骤,不要漏掉任何一个细节,按照步骤的组合尝试复现
  D.与开发人员配合,让开发人员对相应的代码检查,看是否通过代码层面检查出问题
  E.保留发生bug时的log,附加到提交的Bug中,希望可以通过log中找到一些蛛丝马迹。
  F.查看代码,也许是代码变更,引起的Bug
  四.bug定位
  首先————日志,返回码,异常值
  然后————各种观察工具(request,chalars,jmeter等)
  最后————单元测试(代码查)
  五.测试过程中突然需求添加一个需求,你怎么做
  1.确认需求的准确性。
  找项目经理确认
  2.找开发进行沟通,给出项目的预计完成时间
  3.判断项目周期是否需要延期处理,找项目经理协商。
  4.编码,编写测试用例,测试
  5.测试新需求是否会给之前带来新的问题。
  六.响应码
  1xx(临时响应)
  101(切换协议) 请求者已要求服务器切换协议,服务器已确认并准备进行切换。
  2xx(成功)
  200:正确的请求返回正确的结果,如果不想细分正确的请求结果都可以直接返回200。
  3xx(已重定向)
  300:请求成功,但结果有多种选择。
  301:永久重定向
  302:临时重定向
  4xx(请求错误)
  400:请求出现错误,比如请求头不对等。
  401:没有提供认证信息。请求的时候没有带上 Token 等。
  403:请求的资源不允许访问。就是说没有权限。
  404:请求的内容不存在。
  5xx(服务器错误)
  500:服务器错误。
  501:请求还没有被实现。
  502:网关错误。
  503:服务暂时不可用。服务器正好在更新代码重启。
  七.公司专业名称
  RD: Research an d Development engineer,研发工程师,对某种不存在的事物进行系统的研究和开发
  并具有一定经验的专业工作者(开发)
  PM: Product Manager,产品经理,又称品牌经理。举凡产品从创意到上市,所有相关的研发、调研、生
  产、编预算、广告、促销活动等等,都由产品经理掌控。
  QA: Quality Assurance,品质保证。QA的主要职责就是质量保证工作(测试)
  OP: Operator,操作员,管理员
  case:测试用例  
  八.给你一个新产品,你需要从那些方面考虑
  1.查看需求文档
  2.向开发要详细概要
  3.测试用例
  4.参考类似的产品
  九.云测平台
  1. 登录Testin云测平台
  2.选择标准兼容测试并点击开始测试
  3.上传要测的apk文件
  4.选择待测应用、补充测试选项、提交测试
  5.查看测试任务状态
  6.查看报告
  7.下载报告并查看里面的信息
  8. 报告里面都有哪些内容
  手机型号(通过的、未通过的)、分辨率、CPU、内存、兼容性、日志信息、安装、启动、卸载

打印本页 | 加入收藏

上一篇:2023年软件测试工程师怎样跳槽,才能越     下一篇:工作十年以上的测试工程师应该具备什么能力

关闭  
主要城市: 北京 上海 杭州 广州 南京 武汉 长沙
全部城市: