[TOC]
自动化测试面试题
自动化测试基础面试
1. 开展自动化工作的主要流程是怎样的?
- 1.项目评估和用例的筛选
- 2.选择合适的自动化测试工具
- 3.制定自动化测试的计划
- 4.自动化框架的搭建
- 5.自动化脚本开发
- 6.自动化持续集成迭代执行
- 7.自动化脚本迭代开发
2. 自动化测试覆盖率是多少,应该如何计算?
- 用已实现用例的自动化个数/总的用例个数,就得到了覆盖率
- 接口自动化覆盖率:比如我的接口用例总数是3000条,已实现其中的自动化是2000条,那么覆盖率是67%,一般情况下,接口自动化的覆盖率高达95%
- UI自动化主要覆盖的是正向及反向的业务流程,最终达到30%-40%就是一个不错的覆盖率
3. 如何保证自动化测试的稳定性?
- 自动化测试稳定性主要表现在两个方面:
- 1.元素定位的问题,可以采用智能等待的方式尽可能的避免
- 2.用例之间的依赖问题,可以解耦用例之间的关系,让每条用例都从一个共同的页面开始执行,比如首页,这就需要在测试框架中采用后置处理的方式使每条用例执行完成后都回到首页
4. 自动化测试框架都包含哪些模块?
- 自动化测试框架模块包含:
- 基础方法、数据驱动、PO模式分层、自定义异常、工具包、配置文件、测试报告、日志手机、关键字驱动、接口分层、接口数据管理等模块
- 以上模块骏需要集成相关的工具进行二次封装
5. 在你做自动化过程中,遇到了什么问题吗?举例下
- 这个问题,不管是自动化还是任何工作,都会被问到。主要想知道你是如何解决问题的,从而推断你问题分析和解决的能力
- 当然有遇到问题和挑战,主要有以下几点:
- 频繁的变更UI,经常要修改页面对象里面的代码
- 运行用例报错和处理,例如元素不可见、元素找不到这样异常
- 测试脚本复用,尽可能多代码复用
- 一些新框架产生的页面元素定位问题
6. 在自动化测试过程中,选择的是哪一种数据驱动形式?
- 数据驱动:通过文件存放数据管理的形式,在执行自动化时,直接导入文件中的数据,来实现整个自动化测试业务。提升代码的可维护性,代码与数据分离,更好地对自动化测试执行以及测试数据进行管理和维护
- 常用数据驱动形式包括:
- Excel数据驱动:实现简单,容易上手。但是数据较为死板,管理相对麻烦
- yaml数据驱动:数据直观,可灵活优化,方便管理。但实现对于技术要求更高
- 其他数据驱动:TXT/CSV/XML等
7. 什么是PO模式?
- 页面对象模型(PageObject)是自动化测试框架设计模式中专用于UI自动化的一种设计模型
- 在PO中,关注的核心是页面,而不是操作行为
- 基于页面,将复杂的业务流程进行切片,把完整的业务流程切割成一个又一个的独立页面,最终再将页面以业务所需的顺序进行组装,最终实现业务流程的运行
- 优点是:极大提升了代码的维护性,所有的内容基于页面来进行管理,每一个页面的单独维护都可以对测试用例的执行进行同步维护,降低维护成本
- 更好地满足单一系统的自动化测试覆盖
8.什么是POM?
- pom(PageObjet Model):页面对象模型,是一种设计思想
- 把每个页面当做对象类来进行分层管理,一个页面对应一个类,这个类里面包含了该页面的元素定位以及元素之间的操作方法,也就是页面对象的属性和行为。
- 包含三层模型:
- Base基础页面层:抽取每个页面的相同方法、相同属性(即公共方法、公共属性)到一个基础类BasePage
- PO页面层:每个页面又定义其自己的PageObject类,定义该页面独有的方法
- 测试用例层:用例操作流程,用例数据
9. 如何让自动化测试框架满足多环境的测试执行?
- 在多环境的情况下,可以通过配置好不同的环境,然后基于配置项的读取,通过参数的改变就可以实现到环境的切换
10. 日志模块在自动化测试中的用途是什么?
- 整体过程的行为记录:我们可以通过日志文件快速的去看到我们当前所运行的自动化测试,它到底执行了哪些内容,可以知道执行的步骤或者代码运行的逻辑是否是按照我们预期的业务流程去执行的
- 异常记录:能够将运行过程中产生的问题记录下来
- 分析与调优:通过记录去分析我们在运行过程中产生的这些问题,是因为我们代码本身的逻辑设计有问题还是因为我们被测试的系统它出现了功能的异常,导致了我们出现了这个bug。通过这样的分析之后就可以知道当下的测试框架是否需要进行调整。
11. 如何把自动化测试在公司中实施并推广起来?
- 1.项目组调研选择自动化工具并开会演示demo案例,如selenium和pytest或者Airtest
- 2.搭建自动化测试框架,在项目中逐步开展自动化
- 3.把该项目的自动化流程、框架固定成文档
- 4.推广到公司的其它项目组应用
- 5.还可以使用一些开源的低代码自动化测试平台
12. 自动化测试中用例依赖的数据如何构造?
- 不管是接口自动化还是UI自动化都会存在自动化case依赖数据如何构造的问题,可以从三个方面去考虑:
- 1.在测试前采用接口去构造需要的数据
- 2.使用初始化sql去初始化数据
- 3.提前准备好一套数据,并且将该数据对应的数据库进行备份,在之后每次执行测试前先备份当前数据库数据,再导入之前的测试数据,再执行测试,测试执行完后再恢复原有的数据
13. 自动化测试如何处理验证码?
- 1.在产品没有上线前,可以找开发把验证码先注释掉
- 2.让开发预留一个万能验证码,只要输入这个万能验证码就能登录成功
- 3.有的系统页面可以勾选保存用户名、密码,可以通过cookie来跳过登录验证码,使用抓包工具抓cookie就行了
- 4.使用验证码识别技术ocr,比如python里就是tesserocr库,不过这种识别成功率比较低
14. 自动化测试中如何处理app不定时弹框?
- 1.启动一个线程监听弹框上的元素,比如确定,确认,是,否,取消等等,每隔0.5秒去查找弹框上的元素,如果有就点掉,如果没有就继续
- 2.在所有的操作之前,去增加弹框的识别
接口自动化测试题
1. 如何设计接口自动化测试用例?
- 单接口用例设计:使用excel表格,设计的时候会考虑到业务场景的覆盖,以及边界值、等价类等等一系列用例设计方法。不同的场景定义不同的数据内容,在excel中详细的列出(接口请求地址,路径,请求方法,请求头,参数,参数类型,校验字段,预期结果),通过代码的调用读取excel文本,基于excel获取到的数据来做前期的测试数据,发送请求到服务端对应的单接口并获取到响应结果,对响应结果来进行校验判断。判断完成之后,再将通过或者失败的结果写入到测试用例当中
- 接口关联业务用例设计:在测试用例文件中,定义好接口关联中的全局变量(比如获取到的用户token信息,userid),然后在测试用例的执行过程中去获取这些数据保存下来,同步执行到对应的一些操作行为(如从用户登录--商品搜索--商品下单--最终支付)。一个Py文件就是一个业务流程,这些业务流程对应的数据分别存放在不同的yaml文件里
2. 接口自动化如何校验接口的正确性?
- 校验接口的正确性:就是预期结果和实际结果的对比,在自动化里面叫断言机制
- pytest里面使用assert关键字
- 将接口请求之后获取的响应结果挑选出核心关键点来进行断言(不会基于code响应状态码进行断言)
3. 接口自动化测试数据如何存放?
- 1.对于账号密码,这种管全局的参数,可以用命令行参数单独抽出来,写在配置文件里(如ini)
- 2.对于一些一次性消耗的数据比如注册,每次注册不一样的数,可以用随机函数生成
- 3.对于一个接口有多组测试的参数,可以参数化,数据放在yaml,text,json,excel都可以
- 4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后清理
- 5.对于邮箱配置的一些参数,可以用Ini配置文件
- 6.对于全部是独立的接口项目,可以用数据驱动方式,用excel/csv管理测试的接口数据
- 7.对于少量的静态数据,比如一个接口的测试数据,也就2-3组,可以写到py脚本的开头
4. 对于接口自动化测试中产生的垃圾数据如何清理?
- 垃圾数据清理:在需要测试数据的时候能够自动生成,在测试完成后能清除测试过程中产生的垃圾数据
- 对于垃圾数据的清理,可以调用相关接口(比如删除订单接口)或直接链接数据库进行数据删除。在自动化测试中使用后置操作,teardown做数据清理。在生产环境,如果不想造成数据污染也可以切换影子数据库或者使用mock服务,不真实生成数据
5. 接口自动化测试中,如果某些接口调用长时间没有返回,如何保证流程顺利进行?
- 1.我们可以为每个接口设置一个超时时间,比如3秒。如果一个接口超过3秒还没有返回,就定义为异常
- 2.在失败后可以重试几次,很多单元测试框架都可以添加用例失败重跑机制,如果失败几次后还是超时,就定义为异常
- 3.当一个接口用例,重试N次依然失败或者超时,就需要将该问题记录到系统日志中并最终显示在测试报告中,有必要时要捕获异常对象
6. 你们是怎么做接口自动化的?
- 我们接口自动化是用Python+request+pytest执行。接口自动化其实主要就是接口测试的基础上添加了断言、参数化、动态关联、做接口自动化之前,我们也会划分模块:报告、公共的模块、测试数据、测试报告,主要的目的是为了方便后期的维护
- 测试数据,一般我们用的就是接口测试用例
- 公共的模块,主要是里面的一些公共的操作,比如说用例excel数据的读取,数据库的连接、还有我们封装的每个接口请求
- 断言 主要是获取访问接口的值判断,用的是assert
- 参数化 主要用的比较多的是excel表格,就是测试用例的数据
- 还有需要调用登录后的cookies跟token的时候,我们就会用到关联
- 比如说我们写的一个申请退款的接口
- 首先我们会
$\color{#FF0000}{编写测试用例}$
,把每个$\color{#FF3030}{用例数据保存到excel}$
中,再建立一个申请退款的模块 - 这个时候我们去
$\color{#FF3030}{调用申请退款}$
的功能模块,里面的参数我们是保存在excel表格中,我们建立$\color{#FF3030}{发送请求}$
,通过$\color{#FF3030}{参数化}$
,去$\color{#FF3030}{读写excel表格中的数据,获取到返回数据}$
,通过assert去断言返回的数据跟用例中异常的数据,这个时候也会做$\color{#FF3030}{数据库断言}$
,去连接数据库进行查询,如果返回结果是json数据格式,还会转化下格式后再去断言。 - 这个申请退款模块,也会用到登录的cookie和token,我们先建立一个登录的请求,提取返回的cookie值和toke。Excel表格有多个用例的话,就用到循环去运行,读取excel中用例总的条数。如果excel表格数据是str,就需要
$\color{#FF3030}{eval转化成字典格式}$
,把每个接口封装好以后,我们就会$\color{#FF3030}{调用pytest框架}$
去原先所有的测试用例。
- 首先我们会
7. pytest单元框架中,前置条件怎么处理?
- 1.使用setup
- 函数级的(setup_function/teardown_function)只对函数用例生肖,而且不在类中使用
- 类级的(setup_class/teatdown_class)在类中使用,类执行之前运行一次,类执行之后运行一次
- 类中方法级的(setup_method/teardown_method)在每一个方法之前执行一次,在每一个方法之后执行一次
- 模块级的(setup_module/teardown_module)
- 2.使用conftest
- @pytest.fixture(scope= 'module')
- scope参数的可选范围:
- function:每一个函数货方法都会调用
- class:每一类调用一次,一个类中可以有多个方法
- module:每一个.py文件调用一次
- session:是多个文件调用一次,可以跨.py文件调用
8. pytest参数化怎么实现?
- 使用@pytest.mark.parametrize 装饰器
-
范例:
@pytest.mark.parametrize('字符串形式接收参数名',[(参数1-1,'参数2-1'),(参数1-2,'参数2-2')],ids = ['第1条参数对应的用例名','第2条参数对应的用例名'])
@pytest.mark.parametrize('goods_id,stock,exp',[(12,1,'缺失规格'),('商品编号',1,'商品不存在或已删除'),ids= ['不填写规格参数加购','商品编号为异常值']
9. pytest里如何进行case的组装?
- 1.默认使用检查以test_.py或**test.py命名的文件名,在文件内部查找以test开头的方法或函数,并执行
- 2.可以使用自定义marker(标签),比如pytest运行时就只运行带有该marker的测试用例,比如下面的@pytest.mark.PO
- 3.在命令行使用指定文件
- 4.参数:-k args 模糊匹配case(关键字args:可以是Py文件名,也可以是函数名)
10. 说说pytest里的钩子函数?
- 几个常用的钩子:
- pytest_configure(config):添加自定义的标签等
- pytest_collection_mondifyitems(items):在case收集后调用,可以对项目顺序或其他功能进行自定义
- pytest_addoption(parser):为命令行添加自定义参数
UI自动化测试题
1.web自动化中有哪些场景需要特殊处理?
- 1.iframe元素,当要操作的元素在iframe中是需要先将driver切换至该iframe才能操作,切换方式有四种,通过id/name/索引/iframe元素对象,并且在多iframe切换时还需要进行各种转换
- 2.新窗口打开,当要操作的元素在一个新窗口打开的页面上时,就需要先将driver切换至新窗口上才能进行操作
- 3.时间控价,通常时间控价只能选择无法输入,那么可以采用Js的方式修改时间控价的只读属性然后再进行输入,或者用js直接修改时间控价的value值
- 4.元素不在当前视野需要滚动才会出现,可以采用js的方式滚动,但是有时候界面中有多个滚动条js就会无效,则需要先将光标置入到滚动条区域然后模拟键盘的上下左右键来操作
2. 自动化中显示等待和隐式等待的区别?
- 显示等待 WebDriverWait():就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到就一直等,除非在规定的时间之内都没等到,那么就会跳出Exception异常
- 隐式等待 implicitly_wait():就是在创建dirver时,为浏览器对象创建一个等待时间,在等待时间内不断的去定位元素,得不到某个元素就等待一段时间,直到拿到某个元素为止。定位元素时,需要等待页面全部元素加载完成,才会执行下一个语句
- 相同点:都是智能等待,在一定时间范围内不断查找元素,一旦找到立刻结束查找继续执行代码,没找到才会一直找到超时为止
- 不同点:不同点是隐式等待是全局性设置,并且可以随时更改,在更改后对之后的findxxx方法生效,对点击、输入、滑动之类的操作不起作用
- 显示等待仅仅针对单一元素或一组生效,并且不仅仅是针对查找,还可以针对弹框或者frame等特殊情况起作用,也可以针对元素的某些属性进行自定义判断
3. 自动化测试中如何去定位元素(定位元素的时候找不到是什么原因)?
- 1.元素的加载需要时间,那么可以设置隐式等待,显示等待以及强制等待 等方式,等元素加载出来之后,再去做一个定位
- 2.可能这个元素在frame,就是它在其他页面当中,你肯定会定位不到,这个时候就需要去切换页面元素进行定位
- 3.这个页面元素属于动态元素,我们可以直接使用模糊匹配的方式来定位该元素
- 4.已经识别到这个元素,但是因为某种情况下,这个元素不能被点击,那么我们可以采用js这种前置的方式,先把需要执行的这些动作执行完成
4. UI自动化定位不到元素的原因有哪些?
- 自动化定位不到元素的原因有:
- 定位器选择错误、定位字符串错误、元素嵌套在iframe中、页面元素没有及时加载、元素在新窗口中、脚本流程与实际不符、元素不在当前页
5. 如何提高selenium脚本自动化执行效率?
- 1.优化测试用例,尽可能不使用强制等待
- 2.减少不必要的操作步骤,与业务流程无关的操作步骤或者可简化的操作步骤,例如经过三到四步才能访问到要测试的页面,可以直接通过访问url来操作,简化操作步骤
- 3.设置合理的页面加载策略,如果页面加载内容过多,可检查具体加载内容是哪些,基于实际情况,在不影响测试的前提下,配置不同的加载策略,提升执行过程中的运行速度
- 合理设计与封装测试框架结构,简化人为介入的操作过程,降低自动化测试代码的维护难度
6. UI自动化下的断言如何开展?
- 分析点:断言机制的介入点
- ui自动化的断言都是对于流程运行结果来做断言,就是在我们所有的执行内容全部都结束以后再去考虑,在最后的结果的呈现上面做一次断言校验,以确保到我们整个流程是成功还是失败
- 在流程结束的末尾,选择一个可具有代表性,标志性,意味着流程结束的并且有成功或失败可以去评判的这样的一个点来进行断言,它可以是一个文本,也可以是一个元素等
7. 在selenium中如何处理多窗口?
- 这个多窗口之间跳转处理,在实际selenium自动化测试经常遇到。比如点击一个链接,这个链接会在一个新的tab打开,然后接下来要查找元素在新tab打开的页面,需要先将driver切换到window,然后再定位
- 步骤如下:
- 1.先获取当前的windowhandle
- 2.操作打开新界面后,获取所有的windowhandles
- 3.遍历windowhandles,判断和当前的widowhandle不一样,则切换至该windowhandle
- 4.window太多则可以按照title/url等其它信息进行判断切换
8. 你查找元素遇到过在iframe里面吗?你是如何处理iframe里面元素定位的?
- 有时候我们知道元素定位表达式没有问题,但是还是提示no such element,那我们就需要考虑这个元素是否在iframe中,通过F12查看元素,如果有iframe,需要先将driver切换到iframe中,可以通过iframe的name和id以及索引三种方法来定位iframe,或者先找到iframe的元素,然后把这个元素传递进去也可以
9. web自动化中,如何处理js alert弹窗呢?
- 使用浏览器的开发者选项,看不到弹窗的任何信息时,那么它就是一个js alert的弹窗,这时候需要特殊处理才能操作
- 可以使用driver.switch.alert得到alert对象,然后进行点击、取消、输入文字等操作
- 更好的是使用显示等待,得到alert对象,这样可以避免alert弹窗出现时间的不确定性导致的异常
10. selenium*中的定位方式有哪些?
- driver.find_element_by_id('id'):通过id来获取元素,返回单个元素,id值一般是唯一的
- driver.find_element_by_name('name'):根据页面的name属性定位
- driver.find_element_by_tag_name('tag_name'):通过页面的标签名定位
- driver.find_element_by_class_name('class_name'):通过元素的样式class值定位
- driver.find_element_by_link_text('link_text'):根据超链接的文本值定位
- driver.find_element_by_partial_link_text('partial_link_text'):根据超链接的部分文本值定位
- driver.find_element_by_css_selector('css_selector'):根据CSS选择器来定位
- driver.find_element_by_xpath('xpath'):通过元素的路径来定位
- 优先级最高:ID
- 优先级其次:name
- 优先级再次:CSS selector
- 优先级再次:Xpath
11. xpath和CSS定位都比较强大,那他们之间有什么区别?
- 1.CSS selector比xapth速度快,因为css是配合html来工作,它实现的原理是匹配对象。而xpath 是配合xml工作的,它实现的原理是遍历
- 2.对于class属性Css能直接匹配部分,而xpath对于class跟普通属性一致
- xpath可匹配祖先元素,css不可以
- 查找兄弟元素,Css只能查找元素后面(弟弟妹妹)的元素,不能向前找(哥哥姐姐)
12. selenium中如何保证操作元素的成功率(如何保证我点击的元素一定是可以点击的)?
- 1.添加元素智能等待时间:driver.implicitly_wait(30)
- 2.添加强制等待时间 time.sleep()
- 3.try方式进行id,name,class,xpath,css等不同方式进行定位,如果第一种失败可以自动尝试第二种
13. Webdriver中关闭浏览器的quit和close有什么区别?
- 简单来说,两个都可以实现退出浏览器session功能
- close是关闭当前聚焦的tab页面
- quit是关闭全部浏览器tab页面,并退出浏览器session
- quit一般用在结束全部测试之前的操作
- clsoe用在执行用例过程中关闭某一个页面的操作
14. 如何定位动态元素?
- 动态元素有 2 种情况,一个是属性动态,比如 id 是动态的,定位时候,那就不要用 id 定位就是了;
- 还有一种情况动态的,那就是这个元素一会在页面上方,一会在下方,飘忽不定的动态元素,定位方法也是一样,按 f12,根据元素属性定位(元素的 tag、name的步伐属性是不会变的,动的只是 class 属性和 styles 属性);
15. 如何判断一个页面上元素是否存在?
- 方法一:用 try…except…
- 方法二:用 elements 定义一组元素方法,判断元素是否存在,存在返回 True,不存返回 False
- 方法三:结合WebDriverWait和expected_conditions 判断(推荐)
16. Selenium 中隐藏元素如何定位?
- 如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了(这个很多面试官也搞不清楚);
- 元素的属性隐藏和显示,主要是 type="hidden" 和 style="display: none;" 属性来控制的,接下来在元素属性里面让它隐藏,隐藏元素可以正常定位到,只是不能操作(定位元素和操作元素是两码事,很多初学者傻傻分不清楚),操作元素是 click,clear,send_keys 这些方法;
- JS 操作隐藏元素;
- THE END -
最后修改:2025年8月1日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.qian777.cn/67.html
共有 0 条评论