单位的手机端应用由于时间有限,一直没有完善接口测试,工作中我使用 TestNG 来进行测试 (因为熟悉了) ,用例依然是保存在本地 excel 中,跟以前我写的 我的自动化测试历程 (Selenium+TestNG+Java+ReportNG+Jenkins)的框架差不多,如下图:
接口必须通过 Oauth 验证,才能进行下一步操作,这些操作我是跟研发同事那里要的,开始只知道 Oauth 是个身份验证,以为不用了解太多。。。但是发现不够用啊,不够用,结果又各种百度。。。。一下是百度内容,看过应该是大概能理解了。
"客户端"登录授权层以后,"服务提供商"根据令牌的权限范围和有效期,向"客户端"开放用户储存的资料
(1)用户打开客户端以后,客户端要求用户给予授权。
(2)用户同意给予客户端授权。
(3)客户端使用上一步获得的授权,向认证服务器申请令牌。
(4)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(5)客户端使用令牌,向资源服务器申请获取资源。
(6)资源服务器确认令牌无误,同意向客户端开放资源。
客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0 定义了四种授权方式。
(1) 授权码模式(authorization code)
(2) 简化模式(implicit)
(3) 密码模式(resource owner password credentials)
(4) 客户端模式(client credentials)
授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。
步骤:
(1)用户访问客户端,后者将前者导向认证服务器。
(2)用户选择是否给予客户端授权。
(3)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向 URI"(redirection URI),同时附上一个授权码。
(4)客户端收到授权码,附上早先的"重定向 URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
(5)认证服务器核对了授权码和重定向 URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。
简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。
步骤:
(1)客户端将用户导向认证服务器。
(2)用户决定是否给于客户端授权。
(3)假设用户给予授权,认证服务器将用户导向客户端指定的"重定向 URI",并在 URI 的 Hash 部分包含了访问令牌。
(4)浏览器向资源服务器发出请求,其中不包括上一步收到的 Hash 值。
(5)资源服务器返回一个网页,其中包含的代码可以获取 Hash 值中的令牌。
(6)浏览器执行上一步获得的脚本,提取出令牌。
(7)浏览器将令牌发给客户端。
密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。
步骤:
(A)用户向客户端提供用户名和密码。
(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。
(C)认证服务器确认无误后,向客户端提供访问令牌。
客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。
步骤:
(1)客户端向认证服务器进行身份认证,并要求一个访问令牌。
(2)认证服务器确认无误后,向客户端提供访问令牌。
实际工作中用的是密码模式,对其他的模式没有啥研究,有兴趣的可以研究下。
在 OauthUtil 包中,
requestAPI(String url, HttpMethodType requestType,List<BasicNameValuePair> params) `
参数解释
url:请求地址;
RequestType:请求方法(POST/GET)
params:BasicNameValuePair 类数组,成对保存键和键值
根据请求方法去执行 post 或 get 请求。
HttpConnectionBase 包中 post() 方法。
思路:
1.创建 httpResponse
HttpResponse httpResponse;
2.创建参数队列
List<BasicNameValuePair> postData;
这里列表可以传进来。
3.挂载参数
MultipartEntity localMultipartEntity;
localMultipartEntity.addPart("loginname", new StringBody("xx"));
4.设置 post 请求类
HttpPost localHttpPost = new HttpPost(url);
//将参数列表放进post请求类中
localHttpPost.setEntity(localMultipartEntity);
5.执行
httpResponse = httpClient.execute(localHttpPost);
在 CommontUtil 包中的 login 方法
OauthUtil oauthService = new OauthUtil(Consumer, AccessToken, AccessSecret));
//创建parameter,放参数
List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
//参数赋值
parameters.add(new BasicNameValuePair("username", username));
//加密密码
parameters.add(new BasicNameValuePair("password", encodebymd5.encodbymd5(password)));
parameters.add(new BasicNameValuePair("callback", ConsumerKey));
parameters.add(new BasicNameValuePair("consumerkey", ConsumerKey));
// 提交请求,返回jsonobject类型用于后续断言
jsonobj=oauthService.requestAPI(Urls.PhoneSignInUrl, HttpMethodType.POST,parameters);
这个就参考以前的文章吧 我的自动化测试历程之读取 excel 表格
以上就是大概流程啦,过程中遇到很多问题
问题 1:工程报错(Stub!)
原因: java 工程试用了 android 包,如:android.os.Handler
解决:研发同事提供的请求类中,包含异步请求的部分,里面包括 Handler 的相关使用,实际上对于测试接口来说,同步请求就够了,将这些用到安卓包的代码去掉。
问题 2:API 传什么参数?
解决: 这个必须得问研发了,不能自攥。。。
问题 3:登录状态如何保存?
思路: 开始以为是因为 cookie,后来是因为 accesstoken。
解决:accesstoken 需要在登录后保存,以后提交请求带着。