51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 3398|回复: 1

Jira平台数据自动化获取(一)--Jira接口请求

[复制链接]

该用户从未签到

发表于 2018-4-9 16:38:33 | 显示全部楼层 |阅读模式
月末总结中每月需要从Jira平台中统计各个项目的新增、关闭以及遗留bug数,人工去对各个项目进行条件筛
选统计,耗时较长且容易出错,故计划做一个自动去筛选获取Jira平台各个项目每个月的数据

Jira请求

首先找到了Jira的API文档:https://docs.atlassian.com/jira/REST/latest/#api/2/search-search,其中的 api/2/s
earch 接口为资源搜索API,包括POST和GET,使用JQL搜索问题且排序jql参数是一个完整的jql表达式,并包
括ORDER BY子句。

试着使用http://jira.cvte.com/rest/api/2/search?jql=project = REM AND resolution = Unresolved ORDER BY
priority DESC, updated DESC
在网页端获取到返回的值,结果如下:

  1. {"expand":"schema,names","startAt":0,"maxResults":50,"total":159,"issues":
  2. [{"expand":"operations,editmeta,changelog,transitions,renderedFields",
  3. "id":"27451","self":"http://.../rest/api/2/issue/27451","key":"REM-191","fields":
  4. {"fixVersions":[],"resolution":null,"customfield_10510":null,"customfield_10500":null,
  5. "customfield_10501":null,"customfield_10502":null,"customfield_10503":null,"customfield_10504":null,
  6. "customfield_10505":null,"customfield_10506":null,"customfield_10507":null,"customfield_10508":null,
  7. "customfield_10509":null,"lastViewed":"2016-03-12T08:50:42.732+0800","customfield_10460":null,
  8. "customfield_10461":null,"priority":
  9.                    ......
复制代码


在返回值中,只需要”total”:159 这个值,用JAVA去解析获取到的json格式的值:

  1. import net.sf.json.JSONObject;
  2. public class JsonDemo {
  3.         public static void main(String[] args) {
  4.         String str = "{\"expand\":\"schema,names\",\"startAt\":0,\"maxResults\":50,\"total\":159}";
  5.         JSONObject jsonObject = JSONObject.fromObject(str);  
  6.         int total = jsonObject.getInt("total");
  7.         System.out.println("Get the total value :"+total);      
  8.     }   
  9. }
复制代码


运行后得到的结果为:
Get the total value :137

但是上面的请求是由于该网页已经记录我的Jira账号的登录信息,若没的话,返回的值为:

{"errorMessages":["'project' 字段中没有  'REM'","字段 'resolution'
不存在或这个字段不允许匿名用户查看。",
"无法对字段 'priority'进行排序"],"errors":{}}
故我们现在须先模拟登录Jira平台,先使用Fiddler清空浏览器缓存然后抓包看看登录请求

请求中Cookie包含的变量值:atlassian.xsrf.token、JSESSIONID、ca_uuid、pgv_pvi、pgv_si
尝试着使用Jmeter等工具模拟发包,返回值中无法获取Cookie中pgv_pvi、pgv_si这两个值。

现使用nodejs模拟Jira登录:
在使用前,先下载需要使用的module,如下面需要使用的’node-rest-client’和’mysql’模块,可以在http://npm
.taobao.org/ 淘宝 NPM 镜像中下载,也可以直接cmd输入npm install node-rest-client 下载node-rest-client等模块

var Client = require('node-rest-client').Client;
client = new Client();
//提供用户凭据,将用于登录到JIRA
  1. var loginArgs = {
  2.     data: {
  3.         "username": "******",
  4.         "password": "******"      },
  5.     headers: {
  6.         "Content-Type": "application/json"
  7.     }
  8. };
  9. client.post("http://.../rest/auth/1/session", loginArgs, function (data, response) {
  10.         if (response.statusCode == 200) {
  11.             console.log('succesfully logged in, session:', data.session);
  12.             var session = data.session;
  13.             //获得会话信息,并将其存储在cookie的一个header
  14.             var searchArgs = {
  15.                 headers: {
  16.                     //设置会话信息的Cookie
  17.                     cookie: session.name + '=' + session.value,
  18.                     "Content-Type": "application/json"
  19.                 },
  20.                 data: {
  21.                 xxxxxx
  22.                 }
  23.             };
  24. 将Cookie的值传给search请求,在data中提供添加JIRA搜索附加数据,加入JQL JIRA查询语句,可以进行JQ
  25. L搜索。
  26. 在Data中添加:

  27. jql: "project = REM AND resolution = Unresolved ORDER BY priority DESC, updated DESC"
  28. 1
  29. 传递头信息(包括cookie)和附加的查询JQL模块,请求返回搜索结果:

  30. client.post("http://.../rest/api/2/search", searchArgs, function (searchResult, response) {
  31.                 console.log('status code:', response.statusCode);
  32.                 console.log('searchResult:', searchResult);
  33. });
  34. 在查询的结果searchResult中,只需要获取total(即bug数)的值,故提取total的值:

  35. var bugsnum = searchResult.total;
  36. 1
  37. 现需要封装查询函数,将bugsnum的值return给JiraRequest函数:

  38. function JiraRequest(){
  39.    client.post("http://.../rest/auth/1/session",loginArgs, function (data, response) {
  40.         var bugsnum = searchResult.total;
  41.         return bugsnum
  42.    }
  43. }
  44. 此时调用JiraRequest:

  45. var requestResult = JiraRequest();
  46. 1
  47. 得到requestResult的值为undefined
  48. 这里需要用到一个回调函数:

  49. function JiraRequest(callback) {   
  50.     // 请求返回搜索结果,通过头信息,包括cookie
  51.     client.post("http://.../rest/api/2/search", searchArgs, function (searchResult, response) {
  52.        var num = searchResult.total;
  53.        callback(num);
  54.      });
  55. }

  56. 此时调用JiraRequest函数

  57. var callbackFn = function (num) {   
  58.     console.log('num:'+num);
  59. }
  60. JiraRequest(callbackFn);

  61. 也可以这样调用

  62. JiraRequest(function (num) {
  63.     console.log(num);
  64. });
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-3-29 22:44 , Processed in 0.065710 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表