软件测试知识点和面试题--性能测试篇

软件测试知识点和面试题--手工测试篇(功能测试)

软件测试知识点和面试题--app测试篇

接口规范

接口测试流程

测试用例的思路和方法

pymysql操作数据库

#导入pymysql
	import pymysql
#建立连接
	conn = pymysql.connect(host='ip', port=3306,user='账号', password='密码',database='数据库名',arset='utf8')
#获取游标
	cursor = conn.cursor()
	
#执行查询语句
	cursor.execute('select version();') #返回受影响行数
#查看查询结果
	resp = cursor.fetchall()
	resp = cursor.fetchone()
	resp = cursor.fetchmany(6)
#关闭游标和连接对象
	cursor.close()
	conn.close()

#执行dml语句
try:
    n = cursor.execute('delete from table where id = '1';')
except Exception as e:
    # 有异常,回滚事务
    logging.info(e)
    conn.rollback()
else:
    # 没有异常,提交事务
    conn.commit()
finally:
    # 关闭游标和连接对象
    cursor.close()
    conn.close()

读取JSON方法

import json
import logging
​
def param_data(cls, path):
    '''
    用于参数化,解析json文件
    :param path: json文件路径
    :return:返回元组型列表[(),(),...]
    '''
    with open(path, 'r', encoding='utf-8') as f:
    json_data = json.load(f)
​
    json_list = []
    for i in json_data:
        json_list.append(tuple(i.values()))
    return json_list

读取XLSX方法

import json
from openpyxl import load_workbook
​
def read_xlsx(cls, file_path, sheet_name):
    '''
    :param file_path: xlsx文件路径
    :param sheet_name: xlsx底部的工作表名称
    :return: [(),(),(),...]
    '''
    
    wb = load_workbook(file_path)
    sheet = wb.get_sheet_by_name(sheet_name)
​
    case_data = []
    i = 2
    while i <= sheet.max_row:
        # C表格中【标题】的列名,K表格中【请求参数】的列名,L表格中【状态码】的列名,M表格中【预期结果】的列名
        tuple_data = sheet[f'C{i}'].value, json.loads(sheet[f'K{i}'].value), sheet[f'L{i}'].value,                          json.loads(sheet[f'M{i}'].value)
        case_data.append(tuple_data)
        i += 1
    return case_data

Requests使用

导库
    import requests
    
发送请求
    resp = requests.请求方式(url,params=查询参数,data=表单请求体,json=json请求体,headers=请求头,cookies=cookies的信息)
    multiply表单的请求方式:
    resp = requests.请求方式(url,data=表单请求体,files={'x': 'y'})
    
响应内容获取
    状态码
        resp.status_code
    查看响应头部字符编码
        resp.encoding
    请求头信息
        resp.headers 
    cookie信息
        resp.cookies
    请求url
        resp.url
    返回内容为网页
        resp.text
    返回内容为json
        resp.json()
    字节形式的响应内容
        resp.content
        resp.content.decode('utf-8')
token机制

token机制
    获取token后带入请求头内
    headers_data={
        'Authorization': token值
    }
    requests.请求方式(url,json=json请求体,headers=请求头)
Session+cookes机制

方式一:
    cookie带入请求内,发送请求后获取cookies
        response.cookies
    将cookies放入请求参数内
        requests.请求方式(url,cookies=cookies信息)
​
方式二:Session对象发送请求
    1.创建Session实例对象
        session=requests.Session()
    2.多个请求使用session发送
        resp = session.post('xxx')
    3.关闭session
        session.close()

日志初始化配置

日志级别

只显示大于等于设置的级别信息
DEBUG
INFO
WARNING
ERROR
CRITICAL

内部实现原理

创建日志器对象
    logger = logging.getLogger()
设置日志打印级别
    logger.setLevel(logging.INFO)
创建处理器对象
    输出到控制台
    st = logging.StreamHandler()
    输出到日志文件
    fh = logging.handlers.TimedRotatingFileHandler('a.log',when='midnight',interval=1,
    backupCount=7,encoding='utf-8')
创建格式化器
    fmt = "%(asctime)s %(levelname)s [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s"
给处理器设置格式化器
    st.setFormatter(formatter)
    fh.setFormatter(formatter)
给日志器添加处理器
    logger.addHandler(st)
    logger.addHandler(fh)

日志调用

logging.debug('debug')

Dubbo接口测试

概念

RPC协议

Dubbo架构

Dubbo是什么
	Dubbo是一款高性能、 轻量级、 基于Java的开源RPC框架
为什么使用Dubbo
    开源,使用的人比较多
    把核心业务抽离出来,通过内部接口通信,提高业务的灵活性
    通过分布式提高并发

telnet调用Dubbo接口

连接服务
	telnet IP 端口
查看服务列表
	ls
显示指定服务中包含的方法
	ls -l 服务名
调用服务接口
	invoke 服务名.方法(参数)

Python调用Dubbo接口

创建telnet 实例对象
    import telnetlib
    telnet = telnetlib.Telnet(host, port)
调用接口
	telnet.write('invoke 服务名.方法名(参数列表)'.encode())
读取响应数据
	telnet.read_until("dubbo>".encode())

第三方接口测试

接口Mock

定义:
	跟开发一样去编写一个接口(虚拟一个接口)
接口Mock测试
	使用场景:当针对业务流程进行接口测试时,其中某一个接口无法被获取,为了确保流程能够执行完成,将无法实现的接口进行Mock
项目组常出现无法获取接口的原因:
    1. 开发没有完成
    2. 第三方接口(测试环境)
会针对Mock的接口,进行专门的单接口测试嘛?
        不会

代码实现Mock服务

工具:flask
安装:pip install flask
确认安装:pip show flask
代码实现Mock服务步骤
1. 导包 flask
2. 调用flask,创建应用对象
3. 定义接口的请求方法和请求路径
4. 定义接口返回的响应体数据
5. 启动WEB服务(启动应用对象)
代码实现-Mock(ihrm登录接口)
from flask import Flask, json

# 创建应用对象
app = Flask(__name__)

# 设置Mock接口的请求数据(请求方法,和路径)
@app.route("/login", methods=['get', 'post'])

# 在函数中实现接口的业务逻辑,函数的返回结果(return),为Mock接口的响应体数据
def login():
	data = {"success": True, "code": 10000, "message": "操作成功!", "data":"1233333333"}
	return json.jsonify(data)

# 调用app配置对象,使用run方法,启动编写的Mock接口
if __name__ == '__main__':
	app.run()

Postman支持的请求体数据类型

1.form-data

multipart/form-data,它将表单的数据组织成Key-Value形式;
当上传的字段是文件时,会有content-type来说明文件类型;content-disposition,用来说明字段的一些信息;
由于有boundary隔离,所以multipart/form-data 既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。

2.x-www-form-urlencoded

application/x-www-from-urlencoded,将表单内的数据转换为Key-Value,只能上传键值对,不能用于文件上传。

3.raw

传输txt,JavaScript,json,xml,html的数据

4.binary

表示只可以上传二进制数据,用来上传文件,一次只能上传1个数据

Jmeter请求体支持的数据类型

1.表单-键值对

2.XML、JSON

3.文件

Postman执行接口测试

变量优先级

Data ---- > Local ---- > Enviroment ---- > Global

断言

状态码断言
	pm.test("Status code is 200", function () {
   		pm.response.to.have.status(200);
});
包含指定字符串
	pm.test("Body matches 成功", function () {
    	pm.expect(pm.response.text()).to.include("成功");
});
JSON数据断言
	pm.test("response json value check", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData.success).to.eql(true);
        pm.expect(jsonData.code).to.eql(10000);
    	//大于 pm.expect(jsonData.items.length).to.above(4);
    	//小于 pm.expect(jsonData.items.length).to.below(6);
    	//不等于 pm.expect(jsonData.items.length).to.not.eql(6);
});

关联

1.在后置脚本里设置环境变量或全局变量
	var jsonData = pm.response.json();
	pm.environment.set("token", jsonData.token);
2.非代码区域,使用{{变量名}}
	{"token":"{{token}}"}

批量执行测试用例

在用例集合执行RUN

参数化

意义:测试数据和测试脚本分离,提高接口测试效率
数据文件
    csv:不支持布尔值和复杂数据类型,数据组织格式简单
    json:支持布尔值和复杂数据类型,数据组织格式复杂
引用数据文件
    请求参数中获取 {{key}}
    代码中(pm内置data对象) data.key
注意
	只能通过用例集合RUN,选择数据文件后执行

生成测试报告

1.导出用例集
2.执行命令:newman run 测试脚本文件 -e 环境变量文件 -d 测试数据文件 -r html --reporter-html-export report.html	 

Jmeter执行接口测试

初始化设置

setUP线程组:在所有普通线程组之前执行
数据库连接配置:连接项目的数据库
HTTP请求默认值:统一管理项目的域名,端口号,编码格式
HTTP Cookie管理器:在线程组中,自动传递接口之间的cookie
用户定义的变量:统一管理,项目中的测试数据
HTTP信息头管理器:统一管理项目中接口的请求头数据
tearDown:在所有普通线程组之后执行

实现接口测试

线程组:一个线程=一条测试用例
HTTP请求:发送接口请求
查看结果树:查看响应/请求数据

实现接口自动化

断言:JSON断言、响应断言
关联:正则表达式提取器、JSON提取器
参数化:CSV数据文件设置

测试数据的初始化/清洗

setup/teardown线程组

测试报告

jmeter -n -t xxx.jmx -l result.jtl -e -o ./report

Pytest

功能和特点

1.非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考。 
2.能够支持简单的单元测试和复杂的功能测试。 
3.支持参数化。 
4.能够执行全部测试用例,也可以挑选部分测试用例执行,并能重复执行失败的用例。 
5.支持并发执行,还能运行由nose, unittest编写的测试用例。
6.方便、简单的断言方式。
7.能够生成标准的Junit XML格式的测试结果。 
8.具有很多第三方插件,并且可以自定义扩展。 方便的和持续集成工具集成。

用例运行规则

所有的包(package)必项要有__init__.py 文件
文件名以test开头或_test结尾
函数以test_开头
测试类以Test开头,不能包含 __init__ 方法
测试方法以test_开头

Fixture

调用方式

@pytest.fixture(scope = "function",params=None,autouse=False,ids=None,name=None)

scope

用于控制Fixture的作用范围
作用类似于Pytest的setup/teardown
默认取值为function(函数级别),控制范围的排序为:session > module > class > function

取值范围说明
function函数级只要测试方法调用到就会执行
class类级别从调用的测试方法开始,每个测试类只运行一次
module模块级只从.py文件开始引用fixture的位置生效,每一个.py文件调用一次
session会话级每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法

params

1.用于参数化,Fixture的可选形参列表,支持列表传入
2.默认None,每个param的值 
3.fixture都会去调用执行一次,类似for循环 
4.可与参数ids一起使用,作为每个参数的标识
@pytest.fixture(params=[1,2,{1,2},(3,2)])
def demo(request):
    return request.param		#固定写法

ids

用例标识ID 与params配合使用,一对一关系

autouse

默认False 若为True,刚每个测试函数都会自动调用该fixture,无需传入fixture函数名

name

fixture的重命名 通常来说使用 fixture 的测试函数会将 fixture 的函数名作为参数传递,但是 pytest 也允许将fixture重命名 如果使用了name,那只能将name传如,函数名不再生效 调用方法:@pytest.mark.usefixtures(‘fixture1’,‘fixture2’)

前后置

方式一:

def setup_class(self):
    pass

def teardown_class(self):
	pass
	
def setup(self):
	pass

def teardown(self):
	pass
方式二:

@pytest.fixture(scope='范围值')
    def setup_func(self):
    	print('setup')
    	yield
    	print('teardonw')

1.多个测试模块公用相同的前后置时,可以把前后置方法写入,项目根目录的conftest.py文件中;
2.前后置以yield分隔开
3.前后置的级别通过scope值定

参数化

方式一:
	@pytest.mark.parametrize("title,body,expected", [(),(),()...])
方式二:
    @pytest.fixture(params=[('标题1',{'r':1},{'code':200}),('标题2',{'r':1.1},{'code':200})], ids=['1','2'])
    def params_data(request):
        return request.param

    def test_01(params_data):
        print(params_data)

重复执行

1.安装pytest-repeat插件
	pip ptyest-repeat
	
2.mark标注
@pytest.mark.repeat(5)  # test_a用例执行5次
def test_demo():
	pass

跳过执行

@pytest.mark.skip('skip')
def test_skip(self):
	pass

version = 20
@pytest.mark.skipif(version > 20)
def test_skip(self):
	pass

断言失败继续执行

1.安装pytest-assume插件
2.断言用pytest.assume(判断)
def test_01():
    print('---用例01---')
    pytest.assume(1==2)
    pytest.assume(1<2)
    print('执行完成!')

执行顺序

方式一:
	测试方法标上数字 test01_demo test02_demo
方式二:
	插件:pytest-ordering,数字越小优先级越高,正数比负数优先级高
	@pytest.mark.run(order=1)
	def test_demo():
		pass

打标签执行

通过自定义标签,可以执行某一类标签的用例
1.在pytest.ini配置marker
markers=
        smoke:冒烟测试
        
2.给用例打标记
@pytest.mark.smoke
def test_mark_1(self):
	print('test_mark_1')
	
3.执行命令:如果标签有逻辑运算时,一定要用双引号,"标签1 and 标签2 or 标签3"
pytest -m "标签名"

pytest执行

pytest		
	# 全量执行
	# run all tests below current dir
	
pytest test_mod.py 	
	# 指定文件执行
	# run tests in module file test_mod.py
	
pytest somepath
	# 指定路径执行
	# run all tests below somepath like ./tests/
	
pytest -k stringexpr 
	# 模糊查询执行
	# only run tests with names that match the
    # the "string expression", e.g. "MyClass and not method"
    # will select TestMyClass.test_something
    # but not TestMyClass.test_method_simple
    
pytest test_mod.py::test_func
	# 显式指定函数名
	# only run tests that match the "node ID",
	# e.g "test_mod.py::test_func" will be selected
	# only run test_func in test_mod.py

计算pytest覆盖率

插件:pytest-cov
pytest --cov-report=html --cov=./ test_code_target_dir

测试报告

方式一:
插件:pytest-html

pytest.ini配置:
addopts = --html=./report/report.html
          --self-contained-html

方式二:
配合jenkins+Allure使用

jenkins的构建命令:
call pytest case --alluredir ${WORKSPACE}\report\allure_report
exit 0

分布式测试

插件:pytest-xdist

BeautifulSoup

用于解析HTML的内容,使用步骤:
1.创建BeautifulSoup对象 from bs4 import BeautifulSoup bs = BeautifulSoup(data, 'html.parser') 
2.常用方法 
bs.标签名 #返回整个标签内容
bs.标签名.string #返回标签的值 
bs.标签名.get_text() #返回标签的值 
bs.标签名.get(属性名称) #返回属性值 
bs.find_all(标签名) #返回列表

GIT操作

git 将代码上传到github上 git add –all git commit ‘注释’ git push
git 将github上的代码拉下来 git clone ‘github的项目地址’

jenkin持续集成

基本操作

1.新建Item;
2.码源管理,关联项目的GITEE地址; 
3.设置触发器 H 8 ***; 
4.输入构建命令; 
5.构建后操作,选择HTML报告-Pbulish HTML reports 
6.执行构建;

邮箱设置

1.获取发件人邮箱的授权码,并开启POP3/SMTP服务; 
2.进入Jenkins系统配置界面 
3.配置系统管理员的邮箱地址 
4.配置扩展邮件通知( Extended E-mail Notification )tab邮箱地址 
5.配置邮件通知tab邮箱地址 
6.检查发件人邮箱地址配置是否成功 
7.保存设置

配置自动发邮件

1.打开之前配置jenkins的项目; 
2.构建后操作,选择Editable Email Notification; 
3.修改构建触发时的收件人,以及邮件样式等; 
4.Build Now; 
5.检验收件人邮箱是否成功收到邮件

面试题

什么时候开展接口测试?

接口用例设计:API文档设计完成之后,开始接口用例设计
测试执行:后端先开发完成(一般完成一部分功能,就测试一部分),使用Postman等工具或代码来完成接口测试,接口测试结束,如果还有时间,则编写接口自动化脚本

在你的项目中是如何实施接口测试?

说明:实施接口测试的方式有很多,对于不同的项目,不同团队工作模式都有不同,
下面的答案仅仅作为参考在我之前的项目中,走的敏捷开发模式。
版本不断的迭代过程中,有时候在开发整体提交SIT测试前,测试人员会有比较充裕的时间。在这种情况下,我们会尽量测试左移,提前介入测试,寻求接口文档,基于本次版本迭代的核心功能接口使用Postman的工具进行接口测试。
第二由于公司的项目的特性,也会有一些历史功能版本,同时在项目任务比较空闲的期间,也会使用代码形式来对于单接口以及接口流程编写接口自动化测试脚本,使用的是:python+requests库+git+jenkins框架,一般的情况下原有的核心接口所实现的内容一般不会发生变化,这种接口脚本库,可以用例对于后台接口的代码进行回归测试,对于项目质量也会多一重保障。

介绍下接口自动化框架的搭建

为了降低api接口变更的维护成本,先是对接口进行封装,会创建api目录;
接着调用封装的api接口,实现接口测试用例,获取响应结果和断言,涉及到case目录;
为了方便对测试数据的维护,以及减少测试方法的数量,实行参数化使测试数据和测试脚本分离,涉及到data目录;
另外把公共方法或工具类放在commom目录中,有日志log目录,以及生成测试报告的report目录;
后期为了接口回归测试会进行持续化集成,会使用到jenkins集成工具; 

基于代码的接口测试框架是如何封装的

核心思想:代码分层
    1.将接口请求封装为方法
    2.调用封装的接口请求的方法,实现接口测试用例
    3.将测试数据实现参数化
接口封装
	作用:当接口信息变更时,减少脚本维护成本
实现思路
    1.参数:动态变化的请求数据,设置为封装方法的参数
    2.返回结果:response对象
    3.接口有Cookie依赖时,使用Session实例化对象,不能在封装的类和方法中创建,只能外部传入

接口用例实现
    1.调用封装的接口请求的方法,获取响应数据(response对象)
    2.调用unittest提供的断言方法,校验响应数据是否与预期一致
    
测试数据的参数化
作用:
    1.针对单接口测试,减少编写测试方法的数量,提供用例实现的效率
    2.实现测试数据与代码的分离,方便单独对测试数据进行维护
实现思路:
    1.分析需要参数化的测试数据(动态变化的请求数据和预期结果)
    2.将测试数据写入到外部文件中,文件类型为Json
    3.调用封装的读取测试数据的方法,获取外部文件中的测试数据
    4.使用parameterized插件,完成测试数据从外部文件到测试方法的传递

保证脚本的稳定性
	测试数据的初始化和数据清洗

持续集成
	概念:使用工具自动去执行脚本,并生成测试报告,将测试报告已邮件的方式发送给相关人员;
	目的
		自动执行接口自动化脚本
		自动生成测试报告
		自动发送测试报告邮件
	流程
		1.完成接口自动化脚本
		2.将代码上传到托管平台
		3.Jenkins创建任务,关联代码托管平台
	
涉及Python模块
	requests,unittest/pytest,pymysql,parameterized,HTMLTestReporter,jsonschema

没有接口文档你怎么实施接口测试?

在我之前的公司,一般每次版本都会有接口文档,因为前后端需要进行联调。
部分历史接口缺失会遗失掉接口文档,站在业务的角度,我会先找出核心功能,使用F12的方式或者Fiddler抓包的方式,获取到接口地址以及请求相关信息,如有部分字段具体含义不太清楚的话,则会找对应功能模块的开发人员进行确认,然后完善自己所记录接口相关信息。

你是如何设计接口测试用例的?

在之前的项目中,对于接口测试用例设计层面包含两个方面:一个是基于单功能接口,一个是从业务场景出发进行设计。

基于单功能接口会考虑多参、少参、权限、错参等情况,
	如下单的接口:就会考虑各种前置,如使用优惠券下订单、使用积分抵扣下订单、基于库存商品下订单等等
基于业务功能场景:会站在用户角度考虑各种功能流程
	如之前系统中实现的:
		普通会员登录-搜索商品-加入购物车-提交订单-mock支付-确认收货流程;
		普通会员-选择抢购商品-加入购物车-使用优惠券-提交订单流程等
		
最终确认后使用的jmeter or python+requests+unittest框架进行实现。

接口测试核心校验点有哪些?依据是什么?

第一个:站在系统或版本的层面,核心校验点:单接口,以及业务流程
第二个:基于单接口而言,会验证正向和反向,反向会考虑到多参、少参、错参等情况,同时还会考虑请求头用户权限等

依据现有的接口文档,以及需求文档。接口应该返回什么数据,都是根据需求文档的业务规则来的,和手工测试验证的结果没有区别,只是一个看的是界面,一个是看的json或者html的代码形式数据。

测试的数据你放在哪?

1对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,写的配置文件里(如ini)
2对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函数生成
3.对于一个接口有多组测试的参数,可以参数化,数据放yaml,text,json,excel都可以
4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后再清理
5.对于邮箱配置的一些参数,可以用ini配置文件
6.对于全部是独立的接口项目,可以用数据驱动方式,用excel/csv管理测试的接口数据
7.对于少量的静态数据,比如一个接口的测试数据,也就2-3组,可以写到py脚本的开头,十年八年都不会变更的
总之不同的测试数据,可以用不同的文件管理

什么是数据驱动,如何做参数化?

使用装饰器,ddt,data,unpack ddt装饰测试类,data装饰测试方法,unpack 拆包,将需要修改的数据进行参数化,方便后期数据的操作

参数化的思想是代码用例写好了后,不需要改代码,只需维护测试数据就可以了,并且根据不同的测试数据生成多个用例

下个接口请求参数依赖上个接口的返回数据?

1.不同的接口封装成不同的函数或方法,需要的数据return出来,用一中间变量a去接受,后面的接口传a就可以了
2.使用反射机制,将上一个接口返回的数据 作为一个入参 传到下一个接口中。setattr,将返回的数据存到一个变量中

依赖于登录的接口如何处理?

1.登录接口依赖token的,可以先登录后,token存到一个yaml或者json,或者ini的配置文件里面,后面所有的请求去拿这个数据就可以全局使用了
2.如果是cookies的参数,可以用session自动关联 s=requires.session() 然后根据get/post方法,进行调用(s.get())自动关联session

依赖第三方的接口如何处理?

使用mock机制,去搭建一个mock服务,模拟接口返回数据

不可逆的操作,如何处理,比如删除一个订单这种接口如何测试?

考查造数据的能力,接口的请求数据,很多都是需要依赖前面一个状态的。
比如工作流这种,流向不同的人状态不一样,操作权限不一样,测试的时候,每种状态都要测到,就需要自己会造数据了。
平常手工测试造数据,直接在数据库改字段状态。那么自动化也是一样,造数据可以用python连数据库了,做增删改查的操作;
测试用例前置操作,setUp做数据准备,后置操作,tearDown做数据清理。

接口产生的垃圾数据如何清理?

造数据和数据清理,需用python连数据库了,做增删改查的操作
测试用例前置操作,setUp做数据准备,后置操作,tearDown做数据清理。

一个订单的几种状态如何全部测到,如:未处理,处理中,处理失败,处理成功

创造数据,修改数据的类型

接口之间有依赖时怎么处理

什么叫做接口之间的数据依赖?
    下一个接口的请求数据,需要从上一个接口的响应数据中获取;
	思路:1.提取;2.设置;3.获取

Postman工具:
    1.提取:在Tests标签中,编写js代码,提取接口需要关联的数据;
    2.设置:在Tests标签中,编写js代码,将关联的数据设置为全局/环境变量;
    3.获取:之后的接口中,使用两个大括号{{}},引用设置的变量名,获取关联的数据,传递到请求数据中;

python+requests代码:
    1.提取:调用上一个接口的response对象,使用json的方法,获取字典类型的响应体数据,从中提取关联数据;
    2.设置:将提取的数据,赋值给自定义的变量;
    3.获取:调用定义的变量,获取关联的数据,传入到下一个接口的请求数据中;

如何实现的接口关联?说下实现方式?

在设计接口测试用例时,会设计一些业务场景性的测试用例。如果登录后需要进行下单;那么下单时需要用户登录的身份凭证,而用户身份凭证需要从登录接口返回的信息中进行获取。

在jmeter中根据响应结果,使用Xpath提取器或者Json提取器,来获取需要关联的数据,提取到数据后会形成一个变量,该变量则可以作为后续接口请求参数。

当一个接口出现异常时候,你是如何分析异常的?

和功能测试设计思路是一致的,无非是对于各种业务场景,或各种异常数据录入角度,去验证功能在后台处理业务逻辑是否正确。
所以当接口处理异常时,关注业务处理逻辑规则错误、或数据异常、或权限限制错误等。
分析时站在需求的角度,去分析接口响应数据是否正确。
有时候也会对接口请求日志,去分析具体的错误原因。

持续集成如何做的?自动化测试多久构建一次

被测项目的持续集成
	我作为测试人员而言,使用jenkins对于开发给我的版本进行环境部署,针对项目的功能进行测试
	
自动化的项目的持续集成
	使用Jenkins,自动执行自动化的项目,将测试结果生成为测试报告,发送邮件给我。由我来进行查看,自动化测试,有哪些的测试用例没有通过
	
大概步骤
    1. 创建任务
    2. 设置触发构建的条件
    3. 构建,设置执行命令
    4. 构建后操作的一些插件,生成测试报告,发送邮件

多久构建一次
    被测项目的持续集成,开发有版本更新,就需要进行构建
    	提测构建;开发解了bug,修改了代码,又需要进行构建
    	
    自动化项目的持续集成
        工作日,每天早上XX点,自动构建一次
        开发提测了之后,手工触发构建一次。此次开发的提测,对其他的接口/功能是否有影响

接口自动化如何初始化数据?

Jmeter数据初始化(setup 线程组+JDBC数据库链接配置+JDBC数据库请求)
	1.配置好jdbc mysql driver包
	2.添加setUP Thread Group线程组
	3.添加JDBC Connection Configuration配置元件,配置数据库链接
	4.添加JDBC request Sampler,完成数据清理和数据初始化
	
Python+pymysql+参数化
	使用pymysql库,完成数据清理和数据初始化

如何判断接口测试的结果(成功或失败)?

什么叫做接口的断言?
	校验接口返回的响应数据是否与预期一致
校验的响应数据有
	响应的状态码,响应体数据
	
Postman工具:
    1.在Tests标签中,选择合适的断言片段
    常用的断言片段有:
    	断言状态码;断言响应体的字段值与预期一致;断言响应体中包含指定的字符串
    2.在自动生成的断言代码中,输入预期值
    3.再次发送接口请求,在Test Results标签中,查看断言结果,成功【Pass】、失败【Fail】
    
代码:
    1.调用封装的接口请求的方法,获取响应数据(response对象)
    2.调用unittest提供的断言方法,校验响应数据是否与预期一致
        self.assertEqual(预期结果, response.status_code)
        self.assertIn(预期结果, response.json().get("key"))

第三方接口你怎么测试 ?

基于第三方接口的话,一般情况下,会对接真实的第三方接口进行请求调用,获取实际响应数据进行接口测试。
部分无法直接调用的接口,例如支付,我们会使用python路由的方式来mock接口,模拟支付的各种返回情况。
也可以使用Postman来伪造接口返回数据,也可以使用 Fiddler AutoResponder功能。

什么是重定向接口?加密的接口你怎么执行测试?

请求的接口在接受到客户请求后,跳转到另外一个实际处理客户业务接口。

有接触过部分加密的接口,我之前的公司对于部分敏感的接口就有进行过加密处理,加密的方式是我们团队自己的开发实现的一套加密方式。有专门的代码函数来进行处理,在测试这些接口时,我直接找开发拿对应的加密解密的函数,对于请求信息进行加密后在调用接口请求,同时调用解密的函数来进行解密处理即可。

你测试的过程中主要测试哪些类型的接口?有什么区别?

之前的项目核心还是以HTTP接口为主,也会涉及到部分HTTPS(实际工作中还有其它类型的接口,例如webservices,总之大同小异,会就说不会就不要硬搬)

HTTP和HTTPS核心区别,HTTP协议传输的数据都是未加密的,HTTPS是加密的,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。https协议需要证书。HTTP默认端口80,HTTPS默认端口443。

常见的接口请求方式和区别

接口测试过程中,常见的请求方法get,post,put,delete

Restful风格定义了接口请求方法的功能
    get表示为查询,post表示为新增,put表示为修改,delete表示为删除
    get成功状态码为200, post和put为201,delete为204

GET和POST请求的区别

传递参数的位置
    GET:只能放在url
    POST:可以放在url,也可以放在请求体中
    
传递参数的长度
    GET:查询参数只能在url进行传递,url是有长度的限制
    POST:请求参数如果放在请求体,请求体是没有长度限制
    
安全性
    GET如果传递查询参数,只能在url进行传递,可以通过浏览器就能查看具体的参数情况
    POST传递查询参数,可以放在请求体中进行传递,浏览器无法查看,但是,通过抓包工具,还是可以查看到请求体的数据,所以也不是绝对的安全,可以使用HTTPS协议;

编码格式
	POST可以接收的编码格式要比GET丰富得多

HTTP与HTTPS区别

默认端口
    HTTP:80
    HTTPS:443

安全性
    HTTP:没有对传递的数据进行加密,安全性非常低
    HTTPS:对传递的数据进行加密,安全性非常高

数据传递效率
    HTTP:不需要对数据进行加解密,所以数据传递效率高
    HTTPS:需要对数据进行加解密,所以数据传递效率低
    
费用
    HTTP:不使用数字证书,免费
    HTTPS:使用的公钥=数字证书,需要花钱购买

了解哪些网络协议,简单描述一下区别?

在之前的测试工作中主要是测试https和http协议,当然简单了解过TCP协议:
1、https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

常见的响应状态码有哪些?分别表示什么含义?

200 (成功) 服务器已成功处理了请求
201 (已创建) 请求成功并且服务器创建了新的资源
202 (已接受) 服务器已接受请求,但尚未处理
204 (无内容) 服务器成功处理了请求,但没有返回任何内容

301 (永久移动) 请求的网页已永久移动到新位置
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求

400 (错误请求) 服务器不理解请求的语法
401 (未授权) 请求要求身份验
403 (禁止) 服务器拒绝请求
404 (未找到) 服务器找不到请求的网页
405 (方法禁用) 禁用请求中指定的方法

500 (服务器内部错误) 服务器遇到错误,无法完成请求
501 (尚未实施) 服务器不具备完成请求的功能	
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求

发送HTTP请求时,传递参数的途径有哪些?

资源路径
url里面的查询参数部分,url问号后面的部分
请求体

简单的描述下数据驱动实现的方式?数据存储在哪里?

我们之前项目数据驱动实现的方式是利用json文件和parameterized参数化插件实现的。
json文件用来组织定义测试数据,parameterized用来遍历数据,读取json数据通过定义一个函数来进行读取。

当然我还了解数据的存储方式还有其它很多种形式:可以直接去读取数据库的数据、也可以将测试数据定义到excel文件中。

接口测试过程中如果需要依赖第三方java包,该如何实现接口测试?

在实际测试过程,除了直接通过jmeter配置接口请求外,偶尔也会出现需要使用到一些外部的代码来处理数据,例如调用外部的代码来对于数据进行加密解密。再例如部分非外抛的HTTP接口的测试。

实现的方式:获取到jar包后,直接将包放至 jmemter扩展包目录下,然后在测试计划中,在"add directary or jar to classpath"后面点击"添加",选择对应jar包,打开,即可成功添加到jmeter中。根据需要可以使用beanshell来进行一些代码上的调用或处理。

代码形式的接口测试你是怎么实现的,和Postman/jmeter实现接口测试有什么区别?你觉得哪种形式更好?

这里我有使用过python的第三方库requests库来进行的代码形式的接口测试。对于系统接口使用request所提供的get、post等方法来进行封装。并统一在一个Factory工厂类中进行实例化对象。然后通过单元测试框架pytest来组织测试用例。利用parameterized插件来实现参数化。以及使用pytest自带的assert来进行接口测试结果断言。最后基于整体测试用例代码使用git进行管理,结合jenkins来定时持续的运行。

Postman/jmeter做接口测试本身没有什么区别,因为本身接口实现形式没有发生改变,该配置的一样要进行配置。

区别:
Postman没有提供连接数据库的方式。而jmeter可以配置jdbc驱动来连接数据库。
jmeter的工具更多的偏向于性能测试。
如单单从只实现接口测试而言那Postman更加便捷易学,如还需要基于接口实现性能的话,那明显Jmeter要强的多。

使用工具和代码实现接口测试的区别

工具
    优点:使用简单,上手快,学习的成本低
    缺点:Postman没有办法直接操作数据库,从而实现自动将响应结果与数据库查询结果进行比对校验
	对于一些比较特殊的用例,没有办法按照我们自己的要求进行实现
代码
    优点:灵活性更强一些,基本上可以满足实现各种情况的测试用例
    缺点:学习的成本太高(先学习一门编程的语言)

你怎么使用的Postman实施的接口测试?

1.之前说到一般是在开发整体提交SIT测试前,测试人员会有比较充裕的时间,会使用Postman快速的对本次测试范围的核心接口进行测试

2.使用的方式:
    第一、依据接口文档,在Postman中的用例集划分好目录结构,方便区分接口功能模块;
    第二、依据接口文档在Postman中创建好对应的Request请求用例,配置好请求方式、URL、Request Header、Body;
    第三、优化接口测试点,基于多参数、少参数、错参数进行测试点配置,利用全局变量以及参数化方式对于各种情况的数据进行测试。
    第四、添加断言,基于响应体,提取必要的响应体结果数据进行判断。通常情况下多个接口之间数据有依赖的,还会使用关联的方式来完善接口测试用例。

Jmeter和Postman测试接口,你觉得哪个比较好?两者有什么区别?

我个人觉得各有的好处,相对于做接口测试来讲,Postman更简单易学容易上手,从实现接口测试来说两者并无太大差异。Postman本身就是专门用来做接口测试的,而jmeter更多的是基于接口来测试性能

有没有测试过webservice的接口?怎么测试的?

SOAP/XML/WSDL就是构成WebService平台的三大技术

方式一:使用SoapUI工具测试Webservice
方式二:使用Postman
1.请求方式POST,URL为WebService地址,后缀带wsdl;
2.请求头的Content-Type为text/xml;charset=UTF-8;
3.请求体Body点击raw,内容是soap协议的标签,带有方法名和参数值,可以通过SOAPUI工具获取;
4.点击发送完成接口测试;

你执行接口测试的过程中有没有发现过BUG?简单举例说明一下?

有的。
例如在之前测试新增商品时,测试必选项少参的情况,期望返回对应msg提示信息,实际返回了NullPoint;
再例如基于提交订单,测试多张优惠券同时使用,错误参数,期望结果返回msg错误优惠券,实际返回了Outoffrange

项目上测了多少个接口?写了多少了用例?找了多少bug?

在公司,我主要负责人力资源管理项目的部门模块、员工模块、登录、权限管理模块的接口测试工作。一共有20个接口。共设计了测试用例三四百个,发现了BUG七八十BUG,在一定程度上推动了后端接口的质量的提升的。

在你的项目中有多少接口?实现多少接口测试?

这里需要有个基本认知,一般的情况一下一个功能对应1个或多个接口。如购物车功能就会对应:加入购物车、购物车查询、购物车信息修改等接口,那具体一个系统中有多少个接口呢,也需要和自己简历中的项目功能的多少有直接关系。

例如B2C电商可以这样回答。在我之前的项目的中接口数量的具体数目不太清楚,在500-1000的样子(可以任取区间中的数量)。只对于核心功能模块的HTTP外抛接口进行了接口测试。实现了200多个,如各种情况的下订单、加入购物车、商品查询等
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐