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

喵喵 · 2017年01月18日 · 1305 次阅读

单位的手机端应用由于时间有限,一直没有完善接口测试,工作中我使用 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) 中提及了此贴 03月10日 17:12
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册