21.实现一个ping任意ip完成ping的结果输出?
import random,os
list1=[]
for i in range(1,5):
list1.append(str(random.randint(0,255)))
ip=".".join(list1)
get=os.popen(“ping %s”%ip)
print(get.read().decode(“gbk"))
22.当一个接口依赖于上下游接口数据时?(主要考察:依赖上下游哪部分的数据,获取该部分数据之后如何处理该数据)
a.确定该接口与其他接口之间的依赖关系(逐级依赖、多重依赖);依赖数据的来源(请求、响应(响应头、响应体)、cookie)(通过相关工具进行抓包分析当前接口的数据信息,提取数据与其他接口有什么相关联的信息) b.只需要将提取的数据设计为全局变量数据,其他所有接口可以引用该数据,使用关键字globals;(千万不要每次从excel当中读取关联的数据)
23.在接口自动化中,一个接口依赖第三方接口的数据如何实现?(主要考察:如何模拟接口测试的数据)
第三方:内部系统与外部系统(A公司做了crm系统提供一个接口
B公司做了OA系统所调用(接口去调用),此时两个系统需要集成,此时A公司要测试crm接口,B公司需要测试oa接口;两者双方的数据都不会进行提供);此时要做测试就必须要模拟双方之间的数据
自动化测试非常重要的一步:如何造出合适的数据(大量(模拟用户));数据存储在哪里?(文件?数据库中?);分析所需要数据的类型、数据的格式、此数据所需要覆盖业务流的路径等----->通过自动化代码完成
如果数据量过大,在测试过程中,不会造大量的数据,在单元测试时开发人员大多数直接使用unittest框架中的mock模块;当然还可以通过第三方工具模块进行完成数据的模拟操作(EasyMock)
24.在re模块中.和.?的区别?
.*表示的是贪婪匹配;匹配的是最后一个;最大匹配数;*表示的是0次或者多次匹配 .*?表示的是非贪婪匹配;最小匹配次数;?表示的是0次或者1次匹配
25.如何判断一个bug是前端的还是后端的?(此题考查如何定位bug)
分析:前端与后端是通过接口进行集成的;接口是可以通过发送请求和响应请求的;
发送请求的数据是否与需求设计一致(例如:需求发送的string类型数据,此时发送一个int类型,并且此时还能够发送成功)
响应的报文数据如果与需求不一致(则响应的数据不一致则说明后端处理数据有问题);通过发送请求抓包分析数据;查看应用程序的相关日志、数据日志等;如果是页面的话则还可以直接通过状态栏中的状态信息进行判断,状态栏中出现警告信息的则必然是前端的bug
26.接口测试发现哪些印象深刻的bug?(此题考查你是否真正做过接口测试?)
接口测试是可以直接突破或者跳过前台页面的限制操作;
例如:订单1000块;使用抓包分析工具抓到提交订单的接口;传递的订单的金额参数可以修改(改成1毛钱)
银行转账(转账接口)----->接口主要是为了校验后台业务是否进行逻辑判断,并且数据库是否实现逻辑校验
27.没有接口相关文档,如何测试接口?(此题考查有可能当前公司就没有接口文档,问你会如何处理和完成接口的测试工作)
首先与开发经理进行沟通,确定后续接口由开发人员进行接口的完善或者定义;部分接口可由测试人员进行抓包分析数据然后进行定义(不确定性可以进行与开发进行交互);最后得到一份完善完整的接口测试文档;
将整个接口测试的过程变成规范化,制定一套完善的接口测试流程;
并且引入相关的接口测试工具(符合公司项目)以及框架从而最后实现接口自动化测试
28.电商项目中修改发布商品,发布商品存在很多参数,此时模拟修改发布商品的接口请求时,是携带所有参数还是只携带所需要修改的部分参数?(此题主要考察后台业务逻辑的实现)
携带部分参数还是携带所有参数取决于后台业务逻辑的实现;
例如:假设现在有商品表,商品ID、商品名称、商品描述、商品价格、商品图片
update 商品表 set 商品名称=值 where username=用户名--------------->携带部分数据
update 商品表 set 商品ID=值,商品名称=值… where username=用户名--------->携带全部数据
如果此时模拟发送请求,第二条业务操作,请求只发送一个参数商品名称,那么结果会将数据库表中的对应商品名称的商品ID设置成空
当然同时也需要分析参数的必选与可选关系;
29.问接口中的Content-Type有哪些类型?
Content-Type属性既会存在于请求头中也会存在于响应头中;表示的是客户端能够解析请求的数据类型是什么,此时服务器会根据客户端所提供的数据类型进行对应的响应;其值就是互联网数据类型(MIME----------->实际在早期是应用于email邮件中,现在也应用于http请求当中);
结构:type/subtype;param
type:表示的是类型,可以是任意字符串型,如果使用则表示任意类型
subtype:表示的是子类型,也可以是任意字符串型,同样的可以使用表示
param:表示的是参数,例如:编码格式charset
例如:Content-Type:/;charset=utf-8
常用的Content—Type类型:text/html、text/css、text/javascript、image/jpg、image/png、application/json、application/x-javascript、application/x-www-form-urlencode、application/form-data等
第一种:text/html:表示的是客户端(浏览器)能够解析html页面
第二种:application/json:表示的客户端解析的json格式的数据;并且此时服务器也需要进行响应相应的json格式的数据
第三种:application/x-www-form-urlcode:表示的提交表单数据是以key=value&key1=value1&key2=value2…的形式进行传输;如果是特殊字符的话在url当中会进行转码
第四种:application/form-data:表示的是请求数据是以分割线的形式,分割多个数据块进行提交数据的数据类型格式;通常应用在提交表单时需要上传、下载文件的操作中;在文件操作的类型中其实也可以使用:application/octet-stream;通常会与Content-Disposition属性共同使用
30.Selenium有什么限制或者缺陷
除了基于web的软件和mobile的程序,selenium不支持桌面软件自动化测试。软件测试报告,和用例管理只能依赖第三方插件,例如Junit/TestNG和unittest。由于它是免费的软件,所以没有供应商去提供支持和服务,有问题,只能求助selenium社区。还有一个就是,selenium入门门槛可能有点高,需要具备一定编程语言基础的才能玩转。
31.接口测试发现哪些印象深刻的bug?(此题考查你是否真正做过接口测试?)
接口测试是可以直接突破或者跳过前台页面的限制操作;
例如:订单1000块;使用抓包分析工具抓到提交订单的接口;传递的订单的金额参数可以修改(改成1毛钱)
银行转账(转账接口)----->接口主要是为了校验后台业务是否进行逻辑判断,并且数据库是否实现逻辑校验
32.你能解释下Selenium这个框架吗?
这个问题在面试中被问到的概率还是比较高的,同样类似的问题有,selenium的原理是什么?首先不要被这个问题吓到,我们主要围绕selenium的历史版本演化和基本的组件去展开描述就好,最后回到webdriver这个组件上面,我们基本上都是在使用webdriver提供的API。所以这个题目的最好的答案就是把图画出来,然后自己解释几句就可以。
早期Selenium1.0是有Selenium Grid,Selenium RC, Selenium IDE,
Webdriver四部分组成,后来Selenium
RC和Webdriver合并之后,就是Selenium2,当然现在也已有Selenium3。
Selenium Grid:它是selenium框架的一部分,主要是专门用来把测试用例并行地在不同浏览器,不同操作系统,不同机器上运行。一般我们写脚本,调试都在单机上线性地一个测试用例接着一个测试用例执行下去。如果有人问题如何提高测试用例执行效率,告诉他Selenium
Grid可以实现。
Selenium IDE: 这个算Selenium里面最简单的一个组建,只支持在火狐浏览器上安装这个扩展程序,支持录制web ui脚本,然后导出不同语言的脚本,例如java c#等。这个功能算鸡肋,因为很多时候导出脚本debug的时间还不如自己代码重新写来的快。
Selenium RC: RC是remote control的缩写,主要的功能就是让你不管使用什么语言(Selenium支持的这几种语言之一)来写测试脚本,只要是这个浏览器支持java
script,那么写一遍测试脚本,都能在这些不同浏览器运行脚本。
Webdriver:这个是用来替代Selenium RC,就是一个网页自动化工具,支持在不同浏览器上运行测试脚本,运行速度比Selenium
RC要快很多。据说(我也记得不清楚),webdriver最早是google内部开发的一个工具,用来捐给selenium了,变成开源了。
目前,我们做的web ui的自动化测试,大部分都是在使用webdriver提供的API来模拟手动测试过程中的一系列动作和行为。基本上通过这个方式来回答这个问题,那就没问题了。
33.你写的测试脚本能在不同浏览器上运行吗,支持跨浏览器平台吗
这里出现了跨浏览器平台的概念,就是写一个测试用例,可以在主流的几个浏览器跑起来。
是的,我写的测试用例能在IE,火狐和谷歌这三种浏览器上运行。主要是在windows平台上运行脚本,所以mac的safari浏览器暂时没有写过。主要实现这个跨浏览器的思想就是,把浏览器类型写到配置文件,代码里写if语句去判断配置文件的浏览器的类型,来决定用什么浏览器去执行测试用例。
34.什么是POM,为什么要使用它
POM是Page Object
Model的简称,它是一种设计思想,而不是框架。大概的意思是,把一个一个页面,当做一个对象,页面的元素和元素之间操作方法就是页面对象的属性和行为,所以自然而然就用了类的思想来组织我们的页面。一般一个页面写一个类文件,这个类文件包含该页面的元素定位和业务操作方法。
为了我们测试用例写的简单,清晰,我们很多时候在页面对象会封装很多业务操作方法,测试脚本只需要调用相关方法就可以。
还有一个可能和这个问题相关的面试题,如果页面元素经常发生需求变化,你是如何做,答案就是采用POM思想。好处就是只要该一个页面,我就去修改这个页面对象的元素定位和相关方法,脚本不需要修改。
35.在你做自动化过程中,遇到了什么问题吗?举例下
这个问题,不管是自动化还是任何工作,都会被问到。主要想知道你是如何解决问题的,从而推断你问题分析和解决的能力。
当然有遇到问题和挑战,主要有以下几点:
频繁地变更UI,经常要修改页面对象里面代码
运行用例报错和处理,例如元素不可见,元素找不到这样异常
测试脚本复用,尽可能多代码复用
一些新框架产生的页面元素定位问题,例如ck编辑器,动态表格等
这个遇到的难点完全取决写脚本人的代码能力。回答三个左右就差不多,记得既然抛出了难点问题,一定要记得处理这个问题的方法。
36. 你查找元素遇到过在Frame里面吗?你是如何处理Frame里面元素定位的?
有时候我们知道元素定位表达式没有问题,但是还是提示no such
element,那么我们就需要考虑这个元素是否在frame中。如果在,我们就需要从topwindow,通过swithcTo.Frame()方法来切换到目标frame中,可以通过frame的name和id和索引三种方法来定位frame。
37. 怎么验证勾选框是enable/disabled/ checked/Unchecked/ displayed/ not displayed?
通过以下方法来验证元素是enable 还是disable
boolean enabled = driver.findElement(By.xpath(“元素定位表达式”)).isEnabled();
通过以下方法来验证元素是select/check
boolean checked = driver.findElement(By.xpath(“元素定位表达式”)).isSelected();
通过以下方法来验证元素是dispalyed还是not display
boolean displayed = driver.findElement(By.xpath(“元素定位表达式”)).isDisplayed();
38.在日历这种web 表单你是如何处理的?
首先要分析当前网页试用日历插件的前端代码,看看能不能通过元素定位,点击日期实现,如果不能,可能需要借助javascript。还有些日历控件一个文本输入框,可以直接sendKeys()方法来实现传入一个时间的数据。
39. 什么是页面加载超时
Selenium中有一个 Page Load
wait的方法,有时候,我们执行脚本的速度太快,但是网页程序还有一部分页面没有完全加载出来,就会遇到元素不可见或者元素找不到的异常。为了解决问题,让脚本流畅的运行,我们可以通过设置页面加载超时时间。具体代码是这个:driver.manage().timeouts().pageLoadTimeout(10,TimeUnit.SECONDS);这行作用就是,如果页面加载超过10秒还没有完成,就抛出页面加载超时的异常。
40.如何实现文件上传?
我们在web页面实现文件上传过程中,可以直接把文件在磁盘完整路径,通过sendKeys方法实现上传。如果这种方法不能实现上传,我们就可能需要借助第三方工具,我用过一个第三方工具叫autoIT.还有一个方法是利用robot类:
41.android 和 ios 测试区别?
1.Android 长按 home 键呼出应用列表和切换应用,然后右滑或者上滑则终止应用;
2.多分辨率测试,Android 端 20 多种,ios 较少;
3.手机操作系统,Android 较多,ios 较少且不能降级,只能单向升级;新的 ios系统中的资源库不能完全兼容低版本中的 ios 系统中的应用,低版本 ios 系统中的应用调用了新的资源库,会直接导致闪退(Crash);
4.操作习惯:Android,Back 键是否被重写,测试点击 Back 键后的反馈是否正确;应用数据从内存移动到 SD 卡后能否正常运行等;
5.push 测试:Android:点击 home 键,程序后台运行时,此时接收到 push,点击后唤醒应用,此时是否可以正确跳转;ios,点击 home 键关闭程序屏幕锁屏的情况(红点的显示);
6.安装卸载测试:Android 的下载和安装的平台和工具和渠道比较多(豌豆荚、360助手、应用市场等),ios 主要有 app store,iTunes 和 testflight 下载;
一般回答以上几条即可,但是如何需要额外提高面试官对你的认知,可以另外:对于测试还需要注意一下几点:
1.并发(中断)测试:闹铃弹出框提示,另一个应用的启动、视频音频的播放,来电、用户正在输入等,语音、录音等的播放时强制其他正在播放的要暂停;
2.数据来源的测试:输入,选择、复制、语音输入,安装不同输入法输入等;
3.push(推送)测试:在开关机、待机状态下执行推送,消息先死及其推送跳转的正确性;应用在开发、未打开状态、应用启动且在后台运行的情况下是 push 显示和跳转是否正确;推送消息阅读前后数字的变化是否正确;多条推送的合集的显示和跳转是否正确;
4.分享跳转:分享后的文案是否正确;分享后跳转是否正确,显示的消息来源是否正确;
5.触屏测试:同时触摸不同的位置或者同时进行不同操作,查看客户端的处理情况,是否会 crash 等
42.解释移动应用程序中如何查找DOM元素或xPath
首先,DOM(DOM—Document Object
Model)是一套Web标准。它定义了访问HTML文档对象的一套属性、方法和事件;XPath即为XML路径语言(XML Path
Language),它是一种用来确定XML文档中某部分位置的语言。然后,要找到DOM元素或者xpath,可以使用“UIAutomateviewer”或者Appium自带的“inspector”来查找Android应用程序的DOM元素或者xpath。
43.如何判断原生页面和H5页面:
原生页面是依赖操作系统平台完成的,而H5页面是依赖操作系统中的浏览器进行完成的(H5页面直接让开发可以提供服务器访问地址,直接通过浏览器访问即可);稳定性原生要比H5强,但是实现H5要比原生简单;
判断的方式:
a.打开一个页面,如果该页面存在进度条的显示方式的话,那么该页面会是H5页面
b.打开页面后,往下拉会显示页面的网址以及支撑的浏览器等信息,那么该页面是H5页面
c.如果断网的情况下,原生页面是能够正常显示的,但是H5页面会出现错误或者404页面
d.打开一个页面后,其右上角如果出现关闭叉叉的话,则说明该页面是H5页面
44.简述下载使用Appium中可能遇到的错误是什么?
错误1:需要以下所需的功能,但不提供:设备名称,platformName
错误2:找不到adb。请使用Android SDK根目录路径设置ANDROID_HOME环境变量
错误3:openqa.selenium.SessionNotCreatedException:无法创建新的会话
错误4:如何在移动应用程序中查找DOM元素或XPath?
45.简单介绍一下Android SDK中自带的几个工具/命令的功能?
ddms:Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik[虚拟机]调试监控服务。
monkey:Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。
adb:ADB的全称为Android Debug Bridge,就是起到调试桥的作用。通过ADB我们可以在Eclipse中方面通过DDMS来调试Android程序,就是debug工具。
46.列出Appium的可以完成的事情
为Native和Hybrid移动自动化提供跨平台
支持JSON协议
它不需要重新编译App
支持物理设备以及类似或仿真器的自动化测试
它不依赖于移动设备
47.Appium的设计原理?
a.脚本(即appium客户端)会基于wire协议与appium-server端创建一个session会话连接;在会话连接过程中会携带json格式的相关参数发送给appium-server端; b.Appium-Server端必须是处于启动的状态,绑定特定的端口号处于监听的状态;监听客户端所发送过来的事件操作; c.Appium-Server会发送AppiumbootStrap.jar到模拟器或者真实设备中(Appiumbootstrap.jar实际就是对应相关平台的底层框架的脚本;会在模拟器或者真实机设备上安装appium-settings),通过UiAutomator或者Uiautomation框架的脚本进行驱动模拟器或者真实机底层框架;并会通过appium-server端将事件注入到模拟器或者真实机设备,模拟器则会自动完成相应的事件操作,操作完毕后会将结果返回给appium-server端 d.最后,appium-server端会将模拟器响应的结果返回给脚本即appium客户端 注意:不同的平台不同的版本其所对应的的框架不同;IOS9.3以下版本使用的UiAutomation框架、以上的使用的是XCUITest;Android4.2以下的版本使用的是instrumentation,Android4.2以上的版本使用的是UiAutomator/Uiautomator2框架;
48.了解过android_uiautomator元素定位方式方法吗?
Android元素独有的定位方式:使用android_uiautomator进行驱动底层框架定位;其传入的参数必须是一个new
UiSelector()对象
a.单个元素使用定位方式:
如果是id定位的话,使用android_uiautomator定位的话,其表示形式必须是"new UiSelector().resourceId(对应的元素id值)"
如果是class定位的话,其表示形式必须是"new UiSelector().className(对应元素class值)"
如果是text定位的话,其表示形式为"new UiSelector().text(对应元素text文本值)"
注意:1.在java中,字符串表示必须使用双引号,单引号表示的是一个字符 2.在使用text定位时可以实现模糊定位,textContains、textStartsWith
如果是accessibility_id定位的话,其表现形式为"new UiSelector().description(对应元素的content-desc的值)"
注意:如果使用accessibility_id进行定位的话可以直接调用find_element_by_accessibility_id方法,其传入的参数是content-desc属性值(其并不代表着值唯一,如果存在重复值则也可以通过一组元素定位进行分析)
b.多个元素组合使用定位方式:通常该中方式在定位的时候会使用text、class、id三者进行组合定位;实际就是等价于类似selenium中的二次定位(但是appium中同样存在具体的二次定位方式)
c.父子元素定位方式:childSelector
d.兄弟元素定位方式:fromParent
49.如何使用无线进行连接手机设备?
除了可以通过 USB 连接设备与电脑来使用 adb,也可以通过无线连接——虽然连接过程中也有需要使用 USB
的步骤,但是连接成功之后你的设备就可以在一定范围内摆脱 USB 连接线的限制啦!
操作步骤:
1.将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
2.将设备与电脑通过 USB 线连接。应确保连接成功(可运行 adb devices 看是否能列出该设备)。
3.让设备在 5555 端口监听 TCP/IP 连接:
adb tcpip 5555
4.断开 USB 连接。
5.找到设备的 IP 地址。
一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到,也可以使用下文里 adb 命令来查看设备信息 – IP 地址 。
6.通过 IP 地址连接设备。
adb connect
这里的 就是上一步中找到的设备 IP 地址。
7.确认连接状态。
50.使用adb命令获取以下信息:android的版本、android_id、分辨率等
android版本:adb shell getprop ro.build.version.release
android_id命令:adb shell settings get secure android_id
分辨率命令:adb shell wm size