软件测试面试题之自动化测试题大合集(下)

文章末尾给大家准备了大量福利

前言

今天这篇文章是昨天那篇文章的下半部哟,喜欢的小伙伴可以收藏哟。

软件测试面试题之自动化测试题大合集(下)_第1张图片

1.分别说出web和app元素定位方法

  • Web:id、xpath、name、class_name、tag_name、link_text、partial_link_text、css_selector
  • app: id、classname、xpath

2. get和post不同点

  • GET - 从指定的资源请求数据。请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接
  • POST - 向指定的资源提交要被处理的数据。POST请求会把请求的数据放置在HTTP请求包的包体中

3. http和https不同点

1、HTTPS 协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(以前的网易官网是http,而网易邮箱是 https 。)

2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。

3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

4.selenium原理

  • 当使用 Selenium 2.0 启动浏览器时,后台会同时启动基于 WebDriver Wire 协议的 Web Service 作为 Selenium 的 Remote Server,并与浏览器绑定。之后Remote Server 就开始监听 Client 端的操作请求;
  • 执行测试时,测试用例会作为 Client 端,将需要执行的页面操作请求以 Http Request 的方式发送给 Remote Server 。该 Http Request 的 body,是以 WebDriver Wire 协议规定的 JSON 格式来描述需要浏览器执行的具体操作;
  • Remote Server 接收到请求后,会对请求进行解析,并将解析结果发给 WebDriver,由WebDriver 实际执行浏览器的操作;
  • WebDriver 可以看做是直接操作浏览器的原生组件(Native Component),所以搭建测试环境时,通常都需要先下载浏览器对应的 WebDriver。

5. appium原理

  • 开源、跨平台的UI自动化测试工具,支持多种语言编写的测试脚本
  • 原理:

 test scripts(测试脚本发送一个请求到appium server)

appium server接收到请求后进行解析并把请求转发给 bootstrap.jar。

jar接收到appium的命令,调用UIAutomator命令实现操作

最终结果由bootstrap.jar返回给Appium server。

6.自动化测试用到的模块

  • requests+unittest+ddt+httptestrunner+pymysql+openpyxl+logging 接口自动化
  • selenium+pytest+allure web自动化
  • appium+selenium+pytest+allure+yaml app自动化

7. OSI七层模型

物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

8.cookie、session、token各自区别

  • cookie:在客户端存储在客户端用于存储会话信息的
  • session:在服务器端,记录用户的请求状态,一般默认时间30min
  • session_id会存在cookie中,每次请求cookie中所有信息都会传递给服务器,服务器通过 session_id来识别是否是同一个用户请求,不是同一个用户的话,就会要求重新登录
  • token:访问权限
  • 鉴权:访问的接口是否正常,是否非法访问绕过前端。防止跳过页面直接访问接口。token
  • 授权:是否具有访问接口的权限。 唯一全局动态的 。key

9.常用状态码

  • 100系列:请求已收到继续处理;
  • 200系列:表示成功
  • 200:正常,服务器正确响应了请求
  • 300系列:资源重定向;
  • 301:永久重定向;请求的网页已永久移动到新位置
  • 302:2临时重定向;被请求文档已经临时移至别处,此文档新的url在location响应头中给出
  • 303:浏览器对于POST的响应进行重定向至新的url
  • 307:浏览器对于GET的响应重定向至新的url
  • 400系列:客户端错误:
  • 400:错误请求;服务器不理解请求的语法。
  • 401:未授权;如请求参数、方法、格式等
  • 403:拒绝访问;服务器理解客户的请求,但拒绝处理它(没有权限)
  • 404:请求资源不存在
  • 500系列:服务器端出错
  • 500:服务器内部错误
  • 501:尚未实施;服务器不具备完成请求的功能
  • 502:服务器网关错误
  • 503:服务器由于维护或者负载过重未能应答
  • 504请求超时

10. 手写adb命令

  • adb 帮助:adb --help
  • 启动adb 服务:adb start-server
  • 关闭adb 服务:adb kill-server
  • 获取设备号:adb devices
  • 获取系统版本:adb shell getprop ro.build.version.release
  • 发送文件到手机:adb push 电脑端⽂件路径/需要发送的文件 手机端存储的路径
  • adb push C:\Users\win\Desktop\xx.png /sdcard
  • 从手机拉取文件: adb pull 手机端的路径/拉取文件名 电脑端存储文件路径
  • adb pull /sdcard/xx.png C:\Users\win\Desktop
  • 查看手机运行日志: adb logcat
  • 进入到手机终端: adb shell
  • 安装app到手机: adb install 路径/xxx.apk
  • 卸载手机app : adb uninstall app
  • 获取app启动包名和启动名(⚠手机需要先打开对应app)
  • Mac/Linux: adb shell dumpsys window windows | grep mFocusedApp
  • 在 Windows 终端运⾏: adb shell dumpsys window windows | findstr mCurrent
  • 获取app启动时间: adb shell am start -W 包名/.启动名
  • 查看设备ip地址:
  • adb shell ifconfig wlan0
  • adb shell netcfg
  • 查看设备cpu信息: adb shell cat /proc/cpuinfo
  • 查看设备内存信息: adb shell cat /proc/meminfo

11. http请求头和响应头

  • http请求及其结构:
  • 请求信息包含:请求行(request) 请求头部header 、空行和请求数据组成
  • 响应及其结构
  • 响应组成:状态行、响应头报头、空行和响应正文

12.鼠标操作常用函数

  • context_click() 右击 --> 此方法模拟鼠标右键点击效果
  • double_click() 双击 --> 此方法模拟双标双击效果
  • drag_and_drop() 拖动 --> 此方法模拟双标拖动效果
  • move_to_element() 悬停 --> 此方法模拟鼠标悬停效果
  • perform() 执行 --> 此方法用来执行以上所有鼠标方法

13.键盘操作常用函数

  • send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
  • send_keys(Keys.SPACE) 空格键(Space)
  • send_keys(Keys.TAB) 制表键(Tab)
  • send_keys(Keys.ESCAPE) 回退键(Esc)
  • send_keys(Keys.ENTER) 回车键(Enter)
  • send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
  • send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
  • send_keys(Keys.CONTROL,'v') 全选(Ctrl+V)
  • send_keys(Keys.CONTROL,'x') 复制(Ctrl+X)

14.解决手动造数据问题

  • 参数化
  • 手机号:

excel里边存放初始手机号 每次执行完,回写新的手机号(原来号码+1)

每次从数据库里查询最大手机号,在这个基础上加1

  • 变量替换: 数据库依赖关系 ${mobile} ${regtime} ${memberid} ${loanid}
  • 最关键:用例设计、用例参数之间依赖关系

15.你写框架多长时间?

初步模型:1-2周,一个月时间

16. TestCase使用

导入unittest模块、被测文件或其中的类

创建一个测试类,并继承unitest.TestCase

定义测试函数,函数名已test_开头,测试用例

调用unittest.main()方法运行测试用例

17.Selenium 中如何保证操作元素的成功率?也就是说如何保证我点击的元素一 定是可以点击的?

1.添加元素智能等待时间 driver.implicitly_wait(30)

2.添加强制等待时间 time.sleep()

3.try 方式进行id,name,clas,x path, css selector不同方式进行定位,如 果第一种失败可以自动尝试第二种

18. 你的自动化用例的执行策略是什么?

  • 利用自动化测试工具,经过测试需求分 析;
  • 设计出自动化测试用例;
  • 从而搭建自动化测试的框架,设计与编写自动化脚 本;
  • 验证测试脚本的正确性,最终完成自动化测试测试脚本(即主要功能为测试的应用软件)
  • 输出测试结果

19. 常见的 POST 提交数据方式

主要有四种方式:

  • application/x-www-form-urlencoded;
  • multipart/form-data;
  • application/json;
  • text/xml

20. 目前主流的APP自动化测试框架,各个自动化适合的语言

appium macaca、robotium、UiAutomator

21.Selenium有哪几种定位方式?用的最多的是哪种?

8种单元素定位方法,8种对应的多元素定位方法;所有方法都是基于driver.find_element()和driver.find_elements()方法,如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.find_element_by_id('id')  # 通过元素id属性定位元素
driver.find_element_by_name('name')  # 通过元素名字属性定位元素
driver.find_element_by_tag_name('tag_name')  # 通过元素的标签名称定位元素
driver.find_element_by_class_name('class_name')  # 通过元素的类名称定位元素
driver.find_element_by_link_text('link_text')  # 通过链接元素的完整显示文字定位元素
driver.find_element_by_partial_link_text('partial_link_text')  # 通过链接元素的部分显示文字定位元素
driver.find_element_by_xpath('xpath')  # 通过xpath表达式定位元素
driver.find_element_by_css_selector('css_selector')  # 通过css表达式定位元素
driver.find_elements_by_id('id')  # find_elements_by_xxx系列也有8种,可以定位多个满足条件的元素
driver.find_element(By.ID, 'id')  # 每一个find_element_by_xxx方法都是基于find_element方法的
driver.find_elements(By.ID, 'id')  # find_element()方法的复数形式,可以定位多个满足条件的元素

为了保证代码的统一性,使用的最多的是driver.find_element_by_xpath()这个方法,传入定位器,即使我们使用id作为定位器,仍然写成基于id的xpath定位器表达式,如下:

baidu_yi_xia_locator = ‘//input[@id="su"]’  # 百度一下按钮的定位器,写成了xpath,但基于的是id这个属性
baidu_yi_xia = driver.find_element_by_xpath(baidu_yi_xia_locator)  #定位元素,并返回给变量
baidu_yi_xia.click()  # 点击百度一下

22. UI自动化能发现多少Bug

UI自动化的目的不是为了发现多少Bug,主要是为了减轻重复的基础操作和线上监控的作用

23.monkey属于自动化吗?

monkey不属于严格意义上的自动化,monkey是生成用户或系统的伪随机事件,在屏幕上触发随机点击事件

24. 你们一般对什么case会进行自动化,自动化一般在哪个阶段进行

主要是主流程中比较容易实现的进行自动化,一般在集成阶段进行该版本的自动化监控,平常的话会一直跑线上监控的

25.app自动化你们一般用什么工具定位元素?

Uiautomatorview和appium的客户端

26.您需要一台服务器机器来运行Appium上的测试吗?

不需要服务器机器在Appium上运行测试。 Appium促进了一个2层架构,其中测试机连接到运行Appium的测试服务器并自动化整个事情。您可以在运行测试的同一台机器上运行Appium。

27.使用Appium可能遇到的错误是什么?

错误1:需要以下所需的功能,但不提供:设备名称,platformName

错误2:找不到adb。请使用Android SDK根目录路径设置ANDROID_HOME环境变量

错误3:openqa.selenium.SessionNotCreatedException:无法创建新的会话

错误4:如何在移动应用程序中查找DOM元素或XPath?

28. 简述Appium的原理?

  • Appium是使用Node.js平台编写的“HTTP Server”,并使用Webdriver JSON线协议驱动iOS和Android会话。
  • 在初始化Appium Server之前,必须在系统上预先安装Node.js 当Appium被下载并安装时,在我们的机器上设置一个暴露REST API的服务器
  • 它从客户端接收连接和命令请求,并在移动设备(Android / iOS)上执行该命令,它响应HTTP响应。
  • 再次,为了执行此请求,它使用移动测试自动化框架来驱动应用程序的用户界面。 框架像Apple Instruments for iOS(仅适用于Xcode 3.0或更高版本的OS X v10.5及更高版本)适用于Android API的Google UIAutomator 16级或更高版本Selendroid for Android API等级在15以下。

29.如何提高selenium脚本的执行速度?

  • 如网速、操作步骤的繁琐程度、页面加载的速度、在脚本中设置的等待时间、运行脚本的线程数等。所以不能单方面追求运行速度的,要确保稳定性,能稳定地实现回归测试才是关键。
  • 减少操作步骤,如经过三四步才能打开我们要测试的页面的话,我们就可以直接通过网址来打开,减少不必要的操作。
  • 中断页面加载,如果页面加载的内容过多,我们可以查看一下加载慢的原因,如果加载的内容不影响我们测试,就设置超时时间,中断页面加载。
  • 在设置等待时间的时候,可以sleep固定的时间,也可以检测某个元素出现后中断等待也可以提高速度。
  • 配置testNG实现多线程。在编写测试用例的时候,一定要实现松耦合,然后在服务器允许的情况下,尽量设置多线程运行,提高执行速度。

30. 什么是持续集成?

持续集成源于极限编程(XP),是一种软件实践,软件开发过程中集成步骤是一个漫长并且无法预测的过程。集成过程中可能会爆发大量的问题,因此集成过程需要尽可能小而多,实际上持续集成讲的是不断的去做软件的集成工作。持续集成,最简单的形式是包括一个监控版本控制(SVN等等)变化的工具。当变化被发觉时,这个工具可以自动的编译并测试你的应用

31.什么是page object设计模式?

通过分离测试对象和测试脚本的抽象来实现的

32. 你觉得自动化测试最大的缺陷是什么?

  • 不稳定
  • 可靠性
  • 不易维护
  • 成本与收益

33.Selenium是否支持桌面应用软件的自动化测试。

Selenium不支持桌面软件的自动化测试,Selenium是根据网页元素的属性才定位元素,而其他桌面软件自动化测试工具是根据桌面元素的位置来定位元素,当然现在也有根据桌面元素的属性来定位的。

34. BDD是什么?你了解多少?TDD是什么?

  • BDD:行为驱动开发(Behavior Driven Development)
  • TDD:测试驱动开发(Test-Driven Development)

35. selenium是否可以直接读取Excel表中测试用例,来执行相关测试

可以的,需要借助第三方库

36.Selenium有哪些组件?

最早的有Selenium IDE,IDE只支持安装在fiefox上一个插件,支持录制自动化脚本。还有

remote RC、Grid 、webdriver。我们一般最重要的就是使用webdriver。

37. 如果元素定位中遇到iFrame内嵌框架,你是如何定位的?如果没有遇到id属性和name属性为空的情况,又是如何处理的?

第一个问题:遇到iFrame内嵌框架里的任何元素,和以往一样写出定位器就可以了,只是在执行脚本的时候,定位器是正确的,但是仍然脚本执行失败,报错“无法找到元素”。原因就是因为这个元素被嵌在了iFrame内嵌框架中(我们也叫子框架),所以需要在定位元素前,先写以下代码,作用是从当前的主框架切换到内嵌框架中,有多种方式:

# 切入frame有3种方式
# (1) 通过frame的id属性或name属性
driver.switch_to.frame('layui-layer-iframe1')
# (2) 通过frame的自然序号,从0开始(第1个iframe)
driver.switch_to.frame(0)
# (3) 通过定位器,配合find_element()方法,定位到框架元素后,再把这个定位到的框架元素入参iframe_loc = '//iframe[@id="layui-layer-iframe1"]'
driver.switch_to.frame(driver.find_element_by_xpath(iframe_loc))

第二个问题:没有id或者name属性,只需要用xpath写出表达式,表达式中利用元素的其他单个或多个属性的组合,只要能够保证元素的唯一性即可,如下例子:

//input[@value="百度一下"]

38.明明自己定位的元素是对的,执行自动化测试脚本时却报错,这时你有几种方法解决此问题?请写出你的解决方法。

(1)元素在iFrame里:先切入iFrame

(2)元素在打开的新窗口里:先切入新窗口

(3)元素在新跳转的页面里,但是因为各种原因,新页面跳转很慢,已经超过了Selenium中对于元素定位的最大等待时间:增加隐式等待时间或对这个元素进行智能等待

隐式等待的代码如下:

from selenium import webdriver
driver = webdriver.Chrome()
# 设置全局等待(即:隐式等待),注意只需要设置一次
driver.implicitly_wait(60)  # 延长到60秒
显示等待(智能等待)的代码如下:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
mobile_phone_loc = (By.XPATH, '//input[@name="mobilephone"]')
elem = WebDriverWait(driver, 60).until(EC.element_to_be_clickable(mobile_phone_loc))
elem.send_keys('13812345678')

39. 简单说出如何用自动化测试脚本实现遍历复选框点击功能(要求全部勾上)。

xPathRadio = '//input[@type="radio"]'
# radiobox复选框对象我们必须使用find_elements方法去定位多个元素(复选框就是多元素)
radioboxes = driver.find_elements_by_xpath(xPathRadio)
# 使用循环遍历的方式,逐个点击这些定位到的元素
for radiobox in radioboxes:
    radiobox.click()

40. 写一个自动化脚本,语言不限,要求每执行一次脚本随机生成一个手机号码。

import random  # 导入随机数模块

# 一开始,手机号是空的
mobile_phone = ''
# 在中国,手机号码的第一位都是1
phone_num_1 = '1'
# 把第一位生成的数字拼接到手机号
mobile_phone = mobile_phone + phone_num_1
# 根据不同的运营商,手机号码的第2位和第3位都是有固定值的,这里随便列举了几个,放入列表
phone_num_2_to_3 = ['38', '82', '88', '36', '30']
# choices方法可以随机抽取列表里的元素,从而生成第二三位手机号码,并拼接到手机号
phone_num_2_to_3 = random.choices(phone_num_2_to_3)[0]
mobile_phone = mobile_phone + phone_num_2_to_3
# 最后8个数字,循环生成
for i in range(8):
    # randint方法可以随机产生0~9的值,但是为了拼接字符串,我们用str()方法转换
    phone_num = str(random.randint(0, 9))  
    # 每一次循环都会生成一个数字,并且继续拼接到现有的电话号码里
    mobile_phone = mobile_phone + phone_num
# 打印最终生成的手机号码
print(mobile_phone)

41. 你对单元测试框架了解多少

unittest、testng、nose、pytest、

42.深拷贝和浅拷贝的区别?

  • 浅拷贝:浅拷贝是对于一个对象的顶层拷贝。简单理解:拷贝了引用,并没有拷贝内容(对象)
  • 深拷贝:对于一个对象所有层次的拷贝(递归)
  • 全都是不可变类型的数据:copy.copy、copy.deepcopy都是引用指向
  • 包含不可变类型的数据:deepcopy是深拷贝,copy.copy是指向引用
  • 不可变对象中包含可变对象:copy.copy是引用指向,deepcopy是开辟新的内存地址,即深层拷贝

43.web/app动态元素如何定位

对于属性值动态:

用xpath+模糊匹配定位方式:

  • driver.find_element_by_xpath(“//标签名[contains(@属性,‘部分片段值’)]”)
  • driver.find_element_by_xpath(“//标签名[starts-with(@属性,‘头部片段值’)]”)
  • driver.find_element_by_xpath(“//标签名[ends-with(@属性,‘尾部片段值’)]”)
  • 属性可以为 id、name、tag_name、link_text、partial_link_text等

用模糊组合定位:

driver.find_element_by_xpath(“//标签名[contains(@属性1,‘片段值’) and @属性2=‘属性值’ and …]")

位置动态:

采用兄弟节点/父子节点方式定位

//*[contains(@resource-id,"fixedWrap")]//*[@content-desc="自选"]
//android.widget.LinearLayout[contains(@resource-id,"home_item_layout_bg") and @index="1"]
//*[contains(@resource-id,"myfund_name_text_view") and @text="${fund_name}"]/../..//android.widget.LinearLayout[1]

总结

今天的文章就到这里了哟,喜欢的小伙伴记得点赞收藏评论加关注哟。

软件测试面试题之自动化测试题大合集(下)_第2张图片

 最后我给大家留下了大量的福利需要的小伙伴可以私信关键字“资料”获取哟。

项目实战

app项目,银行项目,医药项目,电商,金融

软件测试面试题之自动化测试题大合集(下)_第3张图片

​大型电商项目

软件测试面试题之自动化测试题大合集(下)_第4张图片

​全套软件测试自动化测试教学视频

软件测试面试题之自动化测试题大合集(下)_第5张图片

​300G教程资料下载【视频教程+PPT+项目源码】

软件测试面试题之自动化测试题大合集(下)_第6张图片

​全套软件测试自动化测试大厂面经

软件测试面试题之自动化测试题大合集(下)_第7张图片

​python自动化测试++全套模板+性能测试

软件测试面试题之自动化测试题大合集(下)_第8张图片

你可能感兴趣的:(软件测试,自动化测试)