2024最新软件测试【测试理论+ UI 自动化】面试题(内附答案)

3.13 界面中的乱码可以是哪里导致的?

(1)数据库中的编码设置 (2)前端页面编码 (3)后台代码也会编码

3.14 bug 的级别有哪些,级别如何判断

1、致命:对业务有至关重要的影响,业务系统完全丧失业务功能,无法再继续进行, 或业务系统丢失了业务数据且无法恢复,影响公司运营的重要业务数据出错。 2、严重:对业务有严重的影响,业务系统已经丧失可部分的重要的业务功能,或业务系统 丢失了业务数据且可以恢复,一般业务数据出错。 3、一般:对业务有较小的影响,业务系统丧失了较少的业务功能, 例如:界面错误,打印或显示格式错误。 4、提示:对业务没有影响,不影响业务过程正常进行, 例如:辅助说明描述不清楚,提示不明确的错误提示。

3.15 测试中,如何判断是前端的 bug 还是后端的 bug 呢?

通常可以利用抓包工具来进行分析。可以从三个方面进行分析:请求接口、传参数、响应。 1)请求接口 un 是否正确如果请求的接口 ur 错误,为前端的 bug 2)传参是否正确如果传参不正确,为前端的 bug 3)请求接口 u 和传参都正确,查看响应是否正确如果响应内容不正确,为后端 bug 4)也可以在浏览器控制台输入 js 代码调试进行分析

3.16 项目上线后发现 bug,测试人员应该怎么办

看严重级别:严重还是不严重 严重的:紧急变更上线  不严重:修复好后跟下个版本一起上线 用户会通过运维反馈到项目组这边,项目经理会根据功能模块的负责人,分给对应的开发与测试。 测试人员:编写对应的测试用例、测试环境中重现 bug、提交 bug、 交给开发进行修复、修复完成 bug、进行 bug 的复测。 如果测试环境无法重现,可以导入生产环境的包到测试环境中测试, 还是不能复现,查看生产环境的日志去定位问题。

3.17 如何保证质量

(1)需求要吃透,多问,多去了解。 (2)严格按照测试流程去执行:多考虑用户测试场景,使用测试用例设计方法,多评审。 (3)要有良好的测试执行:要求用例执行率达到 100%,多轮测试,进行探索性测试, 需要测试之间交叉测试,用工具来管理我们的测试工作(禅道, testlink, excel,tapd) (4)不断的反思与提升。

3.18 产品是怎么上线的?

一般我们会选择晚上上线,开发测试还有产品全部到场,进行上线测试。 首先,开发将代码打包到生产环境的服务器中,如果数据表有变化,就会运行 sql 文件, 对表的一些操作,接着,我们测试就开始先测试主体业务功能以及新增的功能模块; 测试通过之后,我们会在界面上把上线测试的数据删除,正常上线。 如果发现 bug,开发人员当场修复 bug,修复成功之后我们测试再复测,通过就可以正常上线 如果发现了 bug 开发人员在上线规定时间之前都还没有修复好的话,就看问题的严重性, 如果严重就延期上线,如果我们是迭代版本的话我们还需要版本回滚。 如果不严重,产品跟客户觉得可以上线,就正常上线。

二、 UI 自动化

11.1 ui 自动化怎么测试

(1)我们做 U 自动化测试使用 Python+ seleniun+ unittest 工具  主要对自动化进行规划,把数据、代码、资源、公共方法进行分离,方便后续维护; 具体是通过元素定位、断言、参数化和封装来实现; 其中元素定位的方法,主要是 css 定位,也会用一些 xpath 定位,还有 id、name、 class 等 断言,主要是用 Assert 来判断实际结果是否与预期结果相符; 参数化,可以用列表、字典、导入 excel 表格库(xlrd)对数据进行参数化; 对于封装,一般我会对元素还有公共的模块进行封装。 比方说:原来我们有一个申请借款的功能模块 首先我们先进行自动化框架分类,分成测试数据、需要定位的元素、公共方法(比如说,一些数据的 操作、excel 操作,我们会封装成一个公共方法)。先采用 css 定位,把申请借款所对应的元素定位 出来,里面有很多内嵌页面,还有下拉框元素的定位操作,对应申请借款的数据,我们都会保存在 excel 表中,从 excel 表格中去获取数据。申请完成以后,我们会设置一个断言,还有进行数据库的 检查。我们会把元素封装到资源库,还有就是模块的封装,申请借款会用到登录模块,我们首先会封 装好登录功能。借款申请完成后,会从数据库中删除相关的数据实现数据闭环,再关闭界面。 运行自动化脚本,我们是用 unittest 框架去运行,编写测试集,一般我们是编写 unittest 脚本, 去执行所有测试用例。 我觉得自动化中最难的在于元素的定位、内嵌界面、时间控件,这些需要一些 js 操作去除元素属性, 进行操作。 自动化中发现的问题: 在申请借款中,开发人员写了调试代码的弹出框,没有删除,导致我们自动化脚本跑不通 充值过程中, 添加新的支付方式,开发修改了代码,导致原有充值失败,这些都是我们原来自动化发现的问题。原 来也用了一些 Robotframework 的自动化测试框架,这个比较简单一些,因为部分关键字、框架已经 封装好了,只需要调用就行,但是不好的地方,就是扩展性会差一些。 编写完成以后,可以用 Jenkins 持续集成去定时跑自动化测试用例,再去查看运行日志。 总的来说 RF( Robot Framework)比较简单方便上手比较快,如果公司对自动化要求不高的话可以选 择 RF 框架来做,如果比较高的话就选用 unittest 框架来做。 (2)原来我们自动化测试主要是用的 python+ selenium+ pytest 框架做的 主要对自动化进行规划,把数据、代码、资源、公共方法进行分离,方便后续维护; 自动化测试其实主要通过几个方面元素定位,参数化,断言,模块的封装,数据闭环等来实现的 其中元素定位主要是 cs 定位也会用一些 xpath,id,name,classname,ink 等等定位,还有 js 定位 和 jQuery 定位都会用到;   参数化主要是用列表、字典、以及导入 excel 表格库(xlrd)对数据进行参数化; 断言:主要是用 assert 断言来判断实际结果是否与预期结果相符; 对于封装,我主要会对界面上的元素,一些公共方法(数据库操作,读取 excel 数据公共方法等),还 有测试数据(变量,字典,列表 exce 表等)和一些元素操作,测试用例等等进行封装; 最后闭环的话,就是都要把新增的数据删除,打开的界面都要关闭,就比如原来我们做的自动化测试, 有一个申请借款的功能模块, 首先,我们先进行自动化框架模块的分类划分,分成需要定位的元素 page_element,公共模块 common(比如说数据库操作,读取 excel 数据的操作,都会封装成一个公共模块的)、测试数据 data、 测试用例、元素操作 element_action、执行用例以及报告文件等等这些模块。 先导入 selenium 包,采用 css 定位,把申请借款所对应的元素定位出来,里面有一些内嵌界面,需 要先进入内嵌界面 --driver.switch_to.frame(),还有下拉框元素的定位操作(定位下拉框的话首先 要导入 select 包,通过 index,value,visible_text 进行 选取值: Select(变量). Select_by_value(‘’)把定位到的所有界面元素封装到 page_element 模 块里面,方便后期维护。 对于申请借款的数据,申请借款的一些标题,利率等等,我们都会保存在 excel 表中,对于 excel 表格操作,导入 xlrd 包把读取数据公共方法,保存到公共模块 common 中,方便以后从 exell 表中 获取数据,申请借款成功以后,我们会添加一个断言,获取界面 title 值,去判断界面的提示,当然 也可以获取提示申请成功 text 内容去判断,也会做数据库断言,检查数据库数据,导入数据库操作 包 pymysql,把数据操作,封装到公共方法, 去调用(数据库操作步骤:1 打开数据库连接,2 建立游标,3 执行游标(sql),4 返回获取的数据) 申请借款模块需要调用到登录模块,我们先把登录模块封装好,放到元素操作 element_action 模块 中,方便维护,借款申请完成后,我们会从数据库中删除相关数据实现闭环,减低后续维护,再关闭 所有打开的界面。 我们运行自动化脚本的时候是用的 pytest 框架进行 导入 patent,导入 yamail 包 定义一个主函数 if _name_=“_main_”,pytest.main()所有的用例脚本,定义生成对应的 HTML 报告 到 report 目录下,最后通过 yagma 定义发送邮件 定义发送邮箱的登录信息-定义邮件主题,内容,附件位置–发送邮件到测试人员邮箱中 当后续出现错误用例,也会调用 pytest–if 来运行失败的测试用例 我觉得自动化中最难的在于 元素的定位、内嵌界面、时间插件,这些需要一些 js 操作,去除元素属性,进行操作自动化中发现的问题: 在申请借款中,开发人员写了调试代码的弹出框,没有删除,导致我们自动化脚本跑不通; 充值过程中,添加新的支付方式,开发修改了代码,导致原有充值失败

11.2 什么是自动化测试?

把一些简单,重复的工作,用自动化去实现,减少成本原来手工完成事情,通过自动化脚本去替代

11.3 什么样的项目合适做自动化(至少三个)

功能需求,需求稳定,界面稳定,不会频繁变动,才可以做 版本迭代次数比较多,做出来才有意义 项目周期比较长(大项目)意义

11.4 自动化测试流程是什么?

1、前期项目组会评估项目是否合适做自动化测试,例外就是看下哪些模块需要做自动化,适合做 2、人员安排,分工 3、确定测试框架 4、各自领取自己负责模块(根据功能来进行划分,功能测试的模块) 整理功能模块的用例,把能做自动化的用例提炼出,规整成自动化用例文档, 准备数据,整理数据,管理 资源,环境的准备 5、搭建测试环境 6、脚本开发

11.5 自动化实现的比例,1-2 年。

2 年以内,把原来手工做的事情 15-30%用自动化脚本去替代 2 年以上,实现 40-70%

11.6 自动化测试用例的来源

手工编写测试用例 把原来手工的测试用例,当成自动化测试用例

11.7 自动化测试的优点与缺点

优点: 1、对程序的回归测试更方便  2、可以运行更多更繁琐的测试 3、提高测试效率和准确性,节约时间成本 4、可以执行一些手工测试困难或不可能进行的测试(例如,对于大量用户的测试,可以通过自动化测 试模拟同时有许多用户,从而达到测试的目的) 5、自动化测试不存在执行过程中的疏忽和错误,从而增加软件信任度 缺点: 1、不能取代手工测试 2、手工测试比自动测试发现的缺陷更多 3、对测试质量的依赖性极大 4、由于自动测试比手动测试更胞弱,所以维护会受到制,从而会制约软件的开发 5、工具本身无想像力

11.8 你们自动化覆盖率有多少?

2 年以内,把原来手工做的事情 30%用自动化脚本去替代 2 年以上,实现 40-70% 当时覆盖的确实也不是很多,差不多 30-40%的样式吧

11.9 自动化测试环境的搭建是怎样的?

1、首先要安装 Python 2、然后安装编写代码工具 pycharm 3、导入 selenium 库(pip install seleniun 在 pycharm 安装 selenium3 下载源码包 4、下载浏览器驱动(谷歌.火狐等),把驱动程序发到 Python 根目录下

11.10 seleniun 的原理是什么?

我们用的 selenium3x 以上的版本,对于 selenium2x 以上的版本原理是这样的: Selenium2.0 则是把 selenium1.0 中 selenium RC 替换为了 WebDriver WebDriver 利用浏览器原生的 API,封装成一套更加面向对象的 SeleniumWeb Driver API 直接操作浏览器页面里的元素,甚至操作浏器本身(截屏,回口大小,启动,关闭,安装插件,配置 证书之类的),由于使用的是浏览器原生的 API 速度大大提高,而且调用的稳定性交给了浏览器厂商 本身,显然是更加科学,然而带来的一些副作用就是,不同的浏器厂商,对 Web 元素的操作和呈现多 少会有一些差异,这就直接导致了 SeleniumWebDriver 要分浏览器厂商不同,而提供不同的实现, 例如 Firefox 就有专门的 FirefoxDriver, Chrome 就有专门的 ChromeDriver 等等

11.11 Selenium2 与 Selenium1 的区别是什么?

Selenium1.0 使用的是 Javascript 注入技术与浏览器打交道,需要 Selenium 启动一个 Server,将 操作 Web 元素的 AP 调用转化为一段段 Javascript,在 Selenium 内核启动浏览器之后注入这段 Javascript,开发过 Web 应用的人都知道, Javascript 可以获取并调用页面的任何元素,自如的进 行操作,由此才实现了 Selenium 的目的:自动化 Web 操作,这种 Javascript 注入技术的缺点是速 度不理想,而且稳定性大大依赖于 Selenium 内核,对 API 翻译成的 Javascript 质量高低 Selenium2.0 则是把 selenium1.0 中 selenium RC 替换为了 Web Driver WebDriver 利用浏览器原生的 API,封装成一套更加面向对象的 SeleniumWebDriverAPI 直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装播件,配 置证书之类的),由于使用的是浏览器原生的 AP,速度大大提高,而且调用的稳定性交给了浏览器厂 商本身,显然是更加科学,然而带来的一些副作用就是,不同的浏览器厂商,对 Web 元素的操作和呈 现多少会有一些差异,这就直接导致了 SeleniumWebDriver 要分浏览器厂商不同,而提供不同的实 现例 Firefox 就有专门的 Firefox Driver, Chrome 就有专门的 ChromeDriver 等等

11.12定位元素的 8 个方法是什么?

1、通过 id 定位 find_element_by_id() 2、通过 name 定位 find_element_by_name() 3、通过 class name 定位 find_element_by_class_name() 4、通过 css 定位 find_element_by_css_selector() 5、通过 link 定位 find_element_by_link_text(‘文本’)没有空格一般 a 链接 6、通过 partial_link 定位 find_element_by_partial_link_text(部分文本)–般有空格 a 链接 7、通过 xpath 定位 find_element_by_xpath() 8、通过 tag_name 定位 find_element_by_tag_name()

11.13 定位不到元素,你碰到过哪些?

怎么解决的? 1、像页面加载延迟的问题,这个需要通过等待延迟的方式来处理。 2、不过有时候,页面加载完成,但是元素暂时还不可见,导致定位不成功 这个可以选择使用显示等待来处理,这里需要用到 WebDriverWait 类来实现 3、还有就是像内嵌网页的问题,需要使用 driver.switch_to.frame(name/index)这个函数来跳转到 处理。 4、还有要注意多窗口问题,动态 id 问题等的问题,对于多窗口处理,可以使用 driver.switch_to.window()的方式来进行处理,而对于动态 id 的问题,需要注意的是有些 id 跟数 字有关,可能会动态变化,可以使用 xpath 也可以使用 css_select 属性定位或者样 式定位,或者可以通过父元素来找元素,或者通过兄弟节点来找对应的元素。等等 5、还有要特别注意滚动条的问题,这里通过调用 js 代码来实现的,driver.execute_script(js) 6、再这就是有时候会碰到某些元素的是不可见的,比如 display 属性为 none 这就需要通过 java Script 修改 display 的值。 js ='document. querySelectorAll(“select”)[1]. style. display=“block”; driver.execute_script(js)

11.14 元素定位,有时候定位得到,有时候定位不到,可能是什么原因,你会怎么处理?

1、可能是网络问题,导致页面加载延迟,这个可以做延迟等待,一般选择隐式等待,在脚本前面加 上 driver.implicitly_wait(20)。 2、也有可能是页面结构发生变化导致的,这个时候最好选择通过 xpath 或 css 结合属性进行或者样 式定位可能会好点,或者采用 JQuery 定位的方式来进行定位元素

11.15 对于不可见/隐藏的元素,你如何定位,如何处理?

我们可以通过 javaScript 修改 display 的值,来实现 #修改元素的属性 #我们需要通过 javaScript 修改 display 的值。 js='document.querySelectorAll(‘select’)[1].style.display=“block”;’ driver.execute_script(js)

11.16 如果元素经常变动你怎么做?

1,少用绝对路径,多用 css 或者 jQuery 定位 2,单个元素属性进行封装

11.17 自动化如何破解验证码

1,开发去掉验证码 2,开发设定一个万能验证码 3,python 导入 pillow 和 OCR 模块 pytesseract

11.18 数据驱动有没有了解过,具体怎么做的?

1、其实就是把数据与脚本分离,好处就是方便维护管理,后期数据有变动,只要改 excel 表的数据就可以,脚本不用动 2、封装一个读取 excel 表格的函数方法,调用这个函数来读取数据。 3、然后利用 ddt 模型,使用 dt 内部装饰器来实现数据引用 我们当时就是这么做的。

11.19 参数化的类型有哪些?

自动化脚本如何实现数据的参数化? 把测试数据,通过变量或者文件进行保存,通过修改文件或者变量,达到数据参数化目的 测试过程,减低数据维护成本 1、像测试用例数据这块,我们都是放在 excel 表格中的 2、常用的变化比较小的配置数据,比如数据库连接的配置,报告的路径,用例的路径等等 这些放在 config 配置文件中,利用全局变量来管理的。对于全局变量的数据,直接导入 config 某块, 调用就可以。目的是以便于测试数据改变时,直接修改变量就行了

11.20 随机数如何操作?

1.首先都要 import random 随机整数: random randint(10002000),有时需要转化成字符串类型: str(random randint(1000, 2000)) 随机字符串:“join( random.sample(‘abcdefghijk’6)),有时前面固定字母了: ‘ldh’+”.join(random sample(‘abcdefghijk’,6))

11.21 自动化中如何去操作 excel 表格?

需要用到 xlrd 库,调用这个库中的 API 函数来实现的。 1.第一步:导包 import xlrd 2.第二步:book= xrd.open_workbook(文件路径) 3.第三步:table= book.sheet_by_name 表名) 4.第四步:读某行数据一般都技行来读取  Table.row_values(x) 如果要读全部的数据,多行数据,利用循环读取就可以 List=[] for i in range(1,table.nrows): List.append(table.row_values(i)) return list

11.22 如何去读取表格中一行,一列数据,具体数据

1、读取一行数据:YS.row_values(0)0 表示第一行 2、读取一列数据:YS.col_values(0)0 表示第一行 读取具体某个数据:YS.row_values(O)[0]–表示获取第一行第一列

11.23 如何读取表格中总的列数跟行数

获取总列数: YS.ncols 获取总行数: YS.nrows

11.24自动化中如何去操作数据库

需要自己封装一个函数 1、安装 pymysql: pip install pymysql 或者在 pycharm 里面安装 pymysql 2、导入 mysql: import pymysql 3、连接数据库: db_connect= pymysql.connect(host=‘ip 地址’, user=’root’,password=’’,database=’’,port=’’,charset=‘utf8’) 4、建立游标: cursor= db_connect.cursor() 5、执行游标: cursor.execute(sql) 6、获取数据 获取游标中所有数据:all= cursor.fetchall() 获取游标中多条数据:many= cursor.Fetchmany() 获取游标中第一条所有数据:one= cursor.fenchone() 7、关闭游标: cursor.close() 8、关闭数据库连接 db_connect.close()

11.25 如何获取数据库返回的所有,一行,前 5 行

获取游标中多条数据:many= cursor.fetchmany(5)  获取游标中第一条所有数据:one= cursor.fenchone() 首先已经建立好了数据库连接的函数,并且 return 了

11.26 数据库返回的数据格式是什么类型的格式

二维元组的格式 如果要获取具体某个值要用:cursor.fetchall[0][0]—这个表示提取游标中所有值里面的第一个元 祖里面的第一个值

11.27ui 自动化你是怎么做断言的?

断言主要检查几个点: 1.页面跳转是否正确(title,url) 2.页面数据是否正确(核心数据,页面上的关键信息,或者页面上的某个元素是否出现) 3.如果要检查数据库,需要连接数据库,查询数据,与预期结果进行对比 基本都调用 unittest 框架中提供的断言函数来实现的,用得比较多的就是 AssertEqual Assertln #扩展 1.提取元素 text 断言 User_text= driver.find_element_by_css_selector(“# j_account>a”).text#获取实际的值(展示账 户名内容) assert’ admin’ in user_text #断言 admin 在实际值里 2.提取元素属性去断言: login_button_value=driver.find_element_by_id(“lajax-login-submit”).get_attribute(“vaue”) #获取登录按钮的属性 vaue 值是登录 assert’登录’== login_button_value #断言登录是这个按钮的属性 3.提取界面 title 值去断言 assert"p2p 信贷一最大、最安全的网络借贷平台"in driver.title,"失败"或者 in 改为 not in 4.提取元素是否可用来进行断言 Assert driver.find_element_by_css_selector(“div.user_money > a : nth-child(1)”).is enabled0==True,“元素不存在。不可用” 5.数据库断言,去数据库查询结果,是否跟预期一致

11.28 断言有哪几种

(三种),常见 assert 断言 selenium 提供了三种模式的断言: assert、verify、 waitfor Assert 失败时,该测试将终止。 Verify 失败时,该测试将继续执行,并将错误记入日显示屏。也就是说允许此单个验证通过。确保 应用程序在正确的页面上。 Waitfor 用于等待某些条件变为真。可用于 AJAX 应用程序的测试 常见的 assert 断言: assertTitle(检查当前页面的 title 是否正确) assertText(检查指定元素的文本) assert Attribute(检查当前指定元素的属性的值) 如果该条件为真,他们将立即成功执行。如果该条件不为真,则将失败并暂停测试。直到超过当前所 设定的超过时间。一般跟 setTimeout 时间一起使用

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-Dgl0BZvO-1712855673608)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值