A: 需要了解完整的系统架构,例如了解前端代理服务器是什么,应用服务器是什么,后端依赖有哪些,最好可以整理出一份线上的部署架构,或者即将上线的产品部署架构,画出完整的拓扑图,并且询问清楚线上服务器的配置以及机器个数等信息。
A: 我们希望性能测试环境的配置最好和线上一致,或者线上配置的子集,如果是云主机环境的话,希望单台服务器的配置和线上一致,即如果线上是4 * 4ecu的机器,性能测试的应用服务器也应该是4 * 4ecu的。对于后端依赖服务器,比如数据库DDB、搜索服务NCS等,这些配置需要DBA确认是否可以压测,能否支撑一定的并发压力,要保证性能瓶颈点不出现在依赖服务上。
A:
A: 这是个比较难做的事情
A: 测试数据分为两部分:铺底数据和测试数据,也可以从数据库中的数据以及测试脚本需要的参数数据这个角度划分。不同的测试数据对性能有一定的影响,比如说一些索引问题,我们在数据量充足的情况很容易发现,而不同的参数数据也有一定的影响,多人购买一件商品的性能和购买多件商品的性能就有较大的差异。
A:
A:
A: 测试数据准备不完善,可能会导致隐藏的性能问题发现不了,例如索引问题,未覆盖到的代码行隐藏的性能问题等,完善的测试数据,提升性能测试代码覆盖率,发现更多潜在的性能问题。
A: 一般测试哪些东西都是由提测人员决定的,但是在对一个新产品做系统的性能测试的时候,也是有些原则需要参考的:
一般测试哪些东西和我们的提测目标息息相关,在测试之前需要产品方明确,我的测试目标有哪些?
不同的测试目标,对应不同的测试内容和测试类型:
A: 针对单接口来说,提取原则如下:
A:
通常情况下,系统的业务逻辑是比较复杂的,业务和业务之间存在先后顺序、或某种关系,或串行或并行。所以,组合场景是针对具有一定先后顺序或逻辑关系的业务进行特定场景的覆盖。
组合场景测试目标:在较复杂的业务逻辑或场景下,暴露出应用层性能问题或数据库问题等。
案例:
某购物类产品,用户典型的组合场景是,用户浏览产品、加入购物车、下单、付款。
线上系统的用户类型、操作分布、请求达到率都是实时变动的,如果进行精确的建模模拟将是一个非常复杂且困难的事情。因此,混合场景是尝试对系统进行特定切面的覆盖。基于线上用户操作进行数据统计,为被测系统建立测试模型,进一步接近真实的来模拟线上实际情况。
混合场景的设计可以分为两种:
一种是简单的朴素模型,一般用来进行稳定性,方法:基于线上一个星期或一天的日志进行分析统计,获取典型业务和业务配比,进行测试模拟,测试接口来源于我们单接口、组合接口测试时的脚本
案例: 博客产品:85%的用户在查看博客,1.5%的用户在写博客,0.5%在发表评论,5%在获取博文列表,4%在获取动态信息,4%在查看消息中心 电商类产品:80%在查看首页、商品详情页、活动页,2%在进行加入购物车、购物车商品变更、购物车支付等,3%在进行单个商品的下单、支付,15%在查看我的订单、订单详情、我的优惠券等。
一种以容量测试为目标的模型:该模型基于真实的统计数据,需要知道几种典型的用户业务流,同时在线的UV数以及不同页面的跳出比例等,设计出如下的用户模型:
A: 如果发送的post请求后,返回内容错误,且后端错误提示没有参数过去,请检查是否配置请求Header:Content-Type,包含如下类型:
A:
python代码如下:
import codecs
file = "keywords.txt"
infile = codecs.open(file,encoding='utf-8')
keywords = []
for line in infile.readlines():
keywords.append(line.strip())
infile.close()
A: 不要在test.wrap的方法中做太多的事情,包含请求参数的准备和返回数据的复杂验证等。最好的情况是test中wrap的方法仅有一个http request请求。
A: 正常200的请求,需要验证返回码是否是200,以及返回的内容是否包含异常信息或者是否包含想要的相关信息。
示例代码:
result = request806.POST(url, param,(NVPair('Cookie', session),))
#获取返回数据,前提是为使用gzip压缩
data = result.getText().encode('utf-8')
if(result.getStatusCode() != 200 or data.find('error') >= 0):
#如此设置,grinder为认为该请求是失败请求
grinder.getStatistics().getForCurrentTest().setSuccess(False)
logger.error(data)
A: 获取response中的header信息进行验证
示例代码:
result = request808.POST(url8, params)
if(result.getStatusCode() != 302 or result.getHeader('Location').find('pay_success_n') == -1 ):
grinder.getStatistics().getForCurrentTest().setSuccess(False)
infos = 'wyb_callback : ' + params + ' : ' + data
logger.error(infos.encode('utf-8'))
A: 首先判读请求header中是否设置:NVPair('Accept-Encoding','gzip, deflate'),然后确认下nginx和tomcat端是否配置gzip压缩;同样可以通过返回的response header中判断返回内容是否有gzip压缩,可以通过下面的代码获取返回数据。
示例代码:
from java.io import BufferedReader,InputStreamReader
from java.util.zip import GZIPInputStream
def getData(self,result):
acceptEncoding=str(result.getHeader('Content-Encoding'));
data = ''
if (acceptEncoding.lower().find('gzip') > -1):
reader = BufferedReader(InputStreamReader(GZIPInputStream(result.getInputStream())))
for chunk in iter(lambda:reader.readLine(),None):
data += chunk
else:
reader = BufferedReader(InputStreamReader(result.getInputStream()))
for chunk in iter(lambda:reader.readLine(),None):
data += chunk
return data
网易云新用户大礼包:https://www.163yun.com/gift
本文来自网易实践者社区,经作者侯本文授权发布。