接口测试 我工作中的 API 测试 (TestNG,Oauth)

喵喵 · January 18, 2017 · 2113 hits

单位的手机端应用由于时间有限,一直没有完善接口测试,工作中我使用TestNG来进行测试(因为熟悉了) ,用例依然是保存在本地excel中,跟以前我写的 我的自动化测试历程 (Selenium+TestNG+Java+ReportNG+Jenkins)的框架差不多,如下图:

接口必须通过Oauth验证,才能进行下一步操作,这些操作我是跟研发同事那里要的,开始只知道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)认证服务器确认无误后,向客户端提供访问令牌。

实际工作中用的是密码模式,对其他的模式没有啥研究,有兴趣的可以研究下。

核心方法解释

同步请求API方法

在OauthUtil包中,

requestAPI(String url, HttpMethodType requestType,List<BasicNameValuePair> params)  `   

参数解释

url:请求地址;

RequestType:请求方法(POST/GET)

params:BasicNameValuePair类数组,成对保存键和键值

根据请求方法去执行post或get请求。

发送post请求

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表中的用例

这个就参考以前的文章吧 我的自动化测试历程之读取 excel 表格

问题

以上就是大概流程啦,过程中遇到很多问题

问题1:工程报错(Stub!)

原因: java工程试用了android包,如:android.os.Handler

解决:研发同事提供的请求类中,包含异步请求的部分,里面包括Handler的相关使用,实际上对于测试接口来说,同步请求就够了,将这些用到安卓包的代码去掉。

问题2:API传什么参数?

解决: 这个必须得问研发了,不能自攥。。。

问题3:登录状态如何保存?

思路: 开始以为是因为cookie,后来是因为accesstoken。

解决:accesstoken需要在登录后保存,以后提交请求带着。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 0 条回复 时间 点赞
喵喵 我工作中的 API 测试 (JMeter,oauth) 中提及了此贴 10 Mar 17:12
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up