【高频出现】测试工程师技能面试题目和答案

一、sql相关

1.mysql存储过程与普通的sql语句区别

存储过程就是多条sql语句的集合,由于它是在数据库端得sql语句,所有执行起来很快

2.sql的常用语句:

1.新增: insert into 表名 values(值1, 值2...)

2.修改:update 表名 set 字段名 = 新值 where 字段名 = 旧值

3.删除:delet from 表名 where 字段名 = 值 删表:drop 清空表中数据:truncate

4.排序:select 字段1,字段2 from 表名 order by 字段1 《asc升序;desc降序》

5.规定返回数目:select * from 表名 limit 数量

6.去重:select distinct * from table(表名) where (条件)

7.联表查询:selec * from a,b (as A) left join c,d (as B) on A.a(主键)=B.c(主键) 左连接(以左表为主)、右连接(以右表为主)、内连接(两表重合部分)、外连接(两表加上重合部分)

8.where和having的区别:where是一个约束声明,使用where来约束来自数据库的数据,where是在结果返回之前起作用的,where中不能使用聚合函数;having是一个过滤声明,在查询返回结果集以后,对查询结果进行的过滤操作,在having中可以使用聚合函数。where和having的执行顺序:where 早于 group by 早于 having。

9.聚合函数和group by:聚合函数就是例如SUM, COUNT, MAX, AVG等;对一组(多条)数据操作的函数,需要配合group by 来使用。(select sum from 表名 group by XX )

3.索引

因为索引是一种优化查询的数据结构,比如MySQL中的索引是B+树实现的,而B+树就是一种数据结构,可以优化查询速度,可以利用索引快速查找数据,所以能优化查询。常见数据结构有哈希表、完全平衡二叉搜索树、B树、B+树等等

4.深拷贝与浅拷贝的区别

假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力

=============================

二、压测相关

1.Linux系统命令:

启动:nohup java -jar 包名(.jar)&(获取编号)

查看:ps -ef| grep 包名

终止:kill -9 进程号

运行jmeter脚本:jmeter -n -t jmeter文件存放地址 -l hz002(缓存地址每次换一下名字) -e -o 压测报告存放地址

查看进程占用系统资源:top

查看网络流量:nload

查看磁盘IO:iostat -d -x -k 1

查看磁盘已占用资源大小:df

统计日志相关纪录数;iftop

查看日志:tail -n 10 test.log(查看最后10行日志)/head -n 10 test.log(查看前10行日志)/cat -n test.log|grep "关键字"(查询关键字日志)/cat test.log|grep "关键字" -A 10(-A:关键字前/-B:关键字后/-C:关键字前后)

查看CPU占用进程:ps -ef(查看所有进程)

显示当前工作目录:pwd

列出目录:ls -a(列出所有文件)/-d(列出目录)/-i(列出每个文件索引号)/-l(较长格式列出)

删除文件或目录:rm / rmdir(删除空目录)

创建目录:mkdir

解压缩文件:tar

拷贝文件: cp

比较文件差异: diff -r(递归比较)文件1 文件2

2.压力测试报告中查看数据:请求数、平均响应时间(包含最大、最小、90%、95%、99%)、吞吐量、上行数据量、下行数据量、报错百分比(通常为0)

QPS:每秒的响应请求数/最大吞吐能力 QPS(TPS)=并发数/平均响应时间

TPS:每秒处理事务数

PV:页面访问量

UV:独立访客

DAU:日活跃用户数量/MAU:月活跃用户数据

查看图表:响应时间、每秒请求数、每秒吞吐量、应用CPU占用率、数据库CPU占用率

=========================

三、接口相关

1.接口要点

(1)接口类型:http、rpc(web service、dubble)

(2)请求方式:get(查)、post(增)、put(改)、delete(http)

(3)http和https的区别:HTTP 是未经安全加密的协议,它的传输过程容易被攻击者监听、数据容易被窃取、发送方和接收方容易被伪造;而 HTTPS 是安全的协议,它通过 密钥交换算法 - 签名算法 - 对称加密算法 - 摘要算法 能够解决上面这些问题。

(4)http请求体类型:text/html: HTML格式;text/plain:纯文本格式;image/jpeg:jpg图片格式;application/json: JSON数据格式

(5)post和get的区别

1、传送方式:get通过地址栏传输,post通过报文传输。

2、传送长度:get参数有长度限制(受限于url长度),而post无限制

3、GET产生一个TCP数据包;POST产生两个TCP数据包

2.完整的http请求

域名解析

发起TCP3次握手

建立TCP连接后发起http请求

服务器响应请求,返回结果

浏览器得到html标签代码

浏览器解析html代码中的资源,例如js,css,img等

浏览器对页面进行渲染并呈现给用户

3.cookie 和session的区别

cookie数据保存在客户端浏览器,session数据保存在服务器端;cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session ;session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使COOKIE;单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K;所以将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中。

4.WebService接口是如何测试的:webService接口用SoapUI

模拟弱网测试:fiddler和charles都可以模拟弱网测试,平常说的模拟丢包,也是模拟弱网测试

5.BeanShell的内置变量和语法规则

1)log打印日志

用法:log.info<打印所有日志>/log.error<打印错误日志>

System.out.prinbtIn<这是在JAVA控制台打印>

2)vars标识JmeterVariables,操作Jmeter变量(用户定义变量、正则表达式、JSON提取器、定义变量),只可用于当前线程组。

获取变量值:log.info(vars.get("mashang"));/log.info(vars.get("access_token"));/vars.put("www","yyy");<设置变量,可相互取用>

3)props用于获取jmeter的全局静态变量(可跨线程组)

用法:log.info(props.get("jmeter.save.saveservice.output_format"));/props.put("xxx","yyy");

4)prov获取到前面一个取样器返回的信息

用法:log.info(prev.getResponseCode());<获取响应码>/log.info(prev.getResponseDataAsString());<获取响应date>

5)ctx上下文

用法:System.out.println(ctx.getProperties());<获取上下文所有的变量>

=======================

四、java与python

1.java

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等

2.Python和java区别

python是全动态性的,可以在运行时自己修改自己的代码,java只能通过变通方法实现;python虚拟机没有java强,java虚拟机是java的核心;python有很多程序用的是面向过程设计方法,很多概念是从c语言过来的,而java是为了实现没有指针的c++,主要采用面向对象的设计方法等

3.python列表和元祖的区别

列表是动态数组,它们可变且可以重设长度(改变其内部元素的个数);元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变。元组缓存于Python运行时环境,这意味着我们每次使用元组时无须访问内核去分配内存。

4.python的内置模块

sys模块:系统文件模块

time模块:包含各种提供日期、时间功能的类和函数

datetime模块:时间处理模块

random模块:随机

OS模块:系统操作

json某块:数据结构转化

re模块:正则匹配

loggin模块:日志处理

requests模块:接口访问

unittest模块:单元测试

hashlib模块:字符加密功能模块

hmac模块:密钥相关的哈希运算消息认证码

===========================

五、安全测试

1.API接口的安全性流程:

1、客户端通过用户名密码登录服务器并获取Token

2、客户端生成时间戳timestamp,并将timestamp作为其中一个参数

3、客户端将所有的参数,包括Token和timestamp按照自己的算法进行排序加密得到签名sign

4、将token、timestamp和sign作为请求时必须携带的参数加在每个请求的URL后边(http://url/request?token=123×tamp=123&sign=123123123)

5、服务端写一个过滤器对token、timestamp和sign进行验证,只有三个参数都正确且在规定时间内,本次请求才有效

2.加密方法:

1,对称加密:AES,3DES,DES等,适合做大量数据或数据文件的加解密。

2,非对称加密:如RSA,Rabin。公钥加密,私钥解密。对大数据量进行加解密时性能较低。

3.加密算法:对称加密、非对称加密、哈希算法、数字签名

4. HTTP 传输面临的风险有:

1) 窃听风险:黑客可以获知通信内容。

2) 篡改风险:黑客可以修改通信内容。

3) 冒充风险:黑客可以冒充他人身份参与通信。

5.HTTPS 缺点:

1)SSL 证书费用很高,以及其在服务器上的部署、更新维护非常繁琐

2)HTTPS 降低用户访问速度(多次握手)

3)网站改用HTTPS 以后,由HTTP 跳转到 HTTPS 的方式增加了用户访问耗时(多数网站采用302跳转)

4)HTTPS 涉及到的安全算法会消耗 CPU 资源,需要增加大量机器(https访问过程需要加解密)

6.安全测试方法

1)web安全测试:登录安全性验证、口令要求、用户权限、敏感数据加密与数据存储安全性的验证、cookies 和 Session 的有效期验证等多种机制的验证、验证系统的日志文件是否得到保护、sql注入

2)认证测试:登录验证码、密码的一次性、校验码的随机性

3)会话管理测试:用户登录后,身份信息不再由客户端提交,而不是以服务器会话信息中保存的身份信息为准;URL中不能携带SessionID信息;登陆后的页面有明确的“退出”或“注销”按钮,注销时会话信息要清除

4)权限管理测试:横向和纵向越权

文件和目录测试:禁止获取敏感目录或者文件信息、所有对目录的访问均不能打印处文件列表、禁止访问和下载文档的备份、不能越权获取到不该获取的文件

===========================

六、自动化测试

1.selenim测试框架分层设计:

框架层:配置文件、日志、页面元素数据、测试数据等

用例层:测试用例集和测试用例

业务层:单页面方法包、多页面方法包

基础层:page包、基础封装包、查找封装包、操作封装包

2.selenium工具构成:selenium IDE、selenium RC、selenim Webdirver、 selenium Grid、FireBug(辅助工具)、FirePath(辅助工具)

3.基本的接口功能自动化测试流程为:需求分析–>用例设计–>脚本开发–>测试执行–>结果分析

4.自动化测试校验结果:断言 ,预期结果与实际结果对比;数据库校验,根据测试场景来查询数据库里的数据和请求之前的数据进行比对。

5.自动化测试定位和识别元素:谷歌浏览器开发者工具打开之后,用鼠标选中元素去识别元素信息。元素定位使用定位 api,可以根据 id/name/classname/tagname/link_text/xpath/css

6.元素无法识别原因:页面加载元素过慢,加等待时间。页面可能会有 frame 层,需要进行跳转。可能该元素是动态元素,识别方式需要优化。

可能识别了元素,但是不能操作,先把前置的操作完成。

7.元素定位方法:熟悉定位方式有:id、name、classname、link_text、xpath、css。常用 xpath 来进行定位,xpath 算是万能的,但缺点就是定位速度相比其他方式要慢。

8.遇到frame层如何处理:使用 api 函数跳转进去 frame,frame 中页面操作完成,再跳转出来。

9.pytest中函数装饰器@pytest.fixture() :如果测试函数的参数列表中包含了fixture这个名字,在执行pytest的时候,会先检测到,并且在运行测试函数之前先执行fixture,fixture会将数据返回给测试函数。fixture函数中包含了yield关键字,那么pytest会在yield处停止,转而运行测试函数,等测试函数执行完毕后再回到fixture,继续执行yield后面的代码。

============================

七、压测

1.状态码命令

100 继续发送请求 200 请求成功 202 接受请求未处理 204 处理请求未返回实体内容 301 永久移动新位置 404 请求失败 500 服务器未知错误 503 服务器过载或维护

2.接口测试中依赖登录状态的接口如何测试?

依赖登最状态的接口,本质上是在每次发送请求时需要带上存储有账户有效信息的Session或Cookie才能发送成功,在构建POST请求时添加必要的Session或Cookie

3.依赖于第三方数据的接口如何进行测试?

可以利用一些MOCK工具(如:JSON Server、Easy Mock)来模拟第三方的数据返回,最大限度的降低对第三方数据接口的依赖

4.如何从上一个接口获取相关的响应数据传递到下一个接口?

先从上一个接口中的响应数据获取对应的返回值,然后使用正则表达式or使用JSON解析来提取需要获取的值,然后存储在一个变量中,最后在下一个接口中直接引用该变量即可

5.当一个接口出现异常时,你是如何分析异常的:抓包,用fiddler工具抓包,或者浏览器上f12,app上的话,那就用fiddler设置代理,去看请求报文和返回报文了;查看后端日志,xhell连上服务器,查看日志

6.jmeter常用组件:测试计划、线程组、取样器、逻辑控制器、前置处理器、后置处理器、断言、定时器、配置元件、监听器

顺序:测试计划》线程组》配置元件》前置处理器》定时器》取样器》后置处理器》断言》监听器

7.全链路压测平台压测流程:链路整理》探针接入》探针探活》业务活动创建》脚本上传》压测场景配置》开启压测》生成报告

8.探针安装

1)虚拟机探针安装:进入opt目录》下载并解压探针包》删除压缩包》进入config目录查看文件agent.properties(确认url、压测机ip和端口)》进入scan目录改造启动文件并保存》查看进程并启动探针

2)git中选择分支》找到run.sh》放入启动文件并保存》风火轮编译并打包》进入rancher进行更新部署》项目更新完成查看日志(会显示探针包安装完成字样)

========================

八、python基础

1.字符反转 :print(“字符”[::-1])

2.删除list中发重复元素:print(list(set([列表])))

3.A、B中相同元素:print(set(A)&set(B));A、B不同元素:print(set(A)^set(B))

4.python内置的数据结构:整型 int、长整型 long、浮点型 float、复数 complex b、字符串 str、列表 list、元祖 tuple、字典 dict、集合 set

5.实现1-100之和:print(sum(range(0,101)))

6.可变类型有list、dict;不可变类型有string、number、tuple

7.is:比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象。是否指向同一个内存地址。

==:比较的两个对象的内容/值是否相等,默认会调用对象的eq()方法

8.生成公差为11的等差数列: print ([x*11 for x in range(10)])

9.列出列表中所有奇数: print([i for i in 列表 if i%2==1])

10. 计算1+2+3+4的总和:print(sum[1,2,3,4])

你可能感兴趣的:(笔记,selenium功能自动化测试,面试,数据库,职场和发展)