电脑坏了好久,最近终于修好了,停更了好久。
近来遇到一个问题
脚本内容如下:
订单确认:订单确认后,订单状态由创建状态变成已确认状态。
录制了脚本之后,从数据库中查询导出创建状态的订单,对脚本进行订单号参数化。确认的脚本请求如下:
web_custom_request("submit",
"URL=http://127.0.0.1/goOrder/submit?",
"Method=PUT",
"TargetFrame=",
"Resource=0",
"RecContentType=application/json",
"Referer=http://127.0.0.1/#order",
"Snapshot=t7.inf",
"Mode=HTML",
"Body=[\"{订单号}\"]",
LAST);
(题外话:RESTful架构里有get、post、put、delete等method,该请求中使用了PUT,详情可谷歌百度一下RESTful)
回放脚本,查看下方的Replay Log 提示Pass,不报错,但是查询订单状态依然是创建状态,没有更新为已确认状态。
查错过程:
1、从Script模式切换到Tree+HTTP View模式,查看回放
2、查看录制时的response信息,发现头部提示200 OK,返回的信息也正常,response信息简要如下:
{
"XX1609240001" : {
"code" : "0",
"msg" : "[XX1609240001]操作成功!"
}
}
code一般是标识是否执行成功,code=0一般情况下就是成功,其它就是失败,并且会在msg里返回错误信息。
3、查看回放时的response信息,发现虽然头部提示200 OK,但是具体的返回信息却有异常。与录制的时候做确认后response的信息简要如下:
{
"code" : "000016",
"msg" : "Content type 'application/octet-stream' not supported",
"data" : null
}
这一提示信息我们可以理解为服务器不认客户端发出的Content type,即不支持application/octet-stream
4、这时候查看一下录制时的request和response的头部信息,都发现有Content type的信息,且值为application/json,而不是application/octet-stream
5、这时候再查看回放时的脚本的request和response的头部,会发现只有response含有Content type,而request并没有。这就与录制时的有异。
6、查看一下web_custom_request这个请求函数,可以在LR自带的Function Reference里查询该函数,或者在百度查函数关键词查看中文版解释,主要查看其语法:
(具体语法可自行百度)
在查看语法解释,发现有一个参数
EncType:编码类型。此参数给出一个内容类型(Content-Type),指定其做为回放脚本时“Content-Type”请求头的值,例如“text/html”。Web_custom_request函数不处理未编码的请求体。请求体参数将会使用已经指定的编码方式。因此,如果指定了不匹配HTTP请求体的“EncType”,会引发服务端的错误。通常我们建议不要手动修改录制时的“EncType”值。
任何对于“EncType”的指定都会覆盖web_add_[auto_]header函数指定的Content-Type。当指定了“EncType=”(空值)时,不会产生“Content-Type” 请求头。当省略了“EncType”时,任何一个web_add_[auto_]header函数都会起作用。如果既没有指定EncType也没有web_add_[auto_]header函且“Method=POST”,
“application/x-www-form-urlencoded”会做为默认值来使用。其他情况下,不会产生Content-Type请求头。 (太理论了/(ㄒoㄒ)/~~,我都看不下去了)
简单来说就是自己在web_custom_request这个请求函数中添加EncType,即手工添加Content-Type,值为
application/json
web_custom_request("submit",
"URL=http://glsuat.midea.com/goOrder/submit?",
"Method=PUT",
"TargetFrame=",
"Resource=0",
"EncType=application/json",
"RecContentType=application/json",
"Referer=http://glsuat.midea.com/#order",
"Snapshot=t7.inf",
"Mode=HTML",
"Body=[\"{订单号}\"]",
LAST);
7、回放脚本,在数据库中查看结果,可以发现订单状态能更新为已确认状态。
8、成功啦~不过也不造是代码问题,还是LR本身的缺陷问题,毕竟LR也不是第一次抽风~这个也是帮别人远程解决的问题,所以也没继续跟开发人员沟通。个人是比较倾向后者原因。。。回头再问问负责这项目的测试人员吧~