RallyRestAPI(C#)查询story&defect的指定字段

Rally是软开行业,大概最贵,最庞大的敏捷流程管理工具了。
为什么我一个自动化测试人员,跑去做了一个Rally相关的小工具呢?故事背景是这样的,我们公司有audit 和 metrics(大公司,管的就是多…),要求每个迭代结束后,所有的story&defect得是accepted的状态,并且assign back to PO.所有defect的某些字段(比如Test Pass Fail,Test 1st Pass,Root Casue等)不能为空,还有某些字段(比如Product,不能为空,不同项目组,必须选择对应的产品),必须等于某个固定值(不同项目组,这个值是不同的)。

以往,每个迭代结束时,leader就喊话,大家各自去检查自己的story & defect。其实Rally有RestAPI,大家手工检查的功夫,我写个小工具,30秒之内就出结果了。。。

说做就做,我用C#写了一个small console tool,工具构成如下:

  1. RallyRestAPI dll,我在Rally开发者官网上并未找到现成的dll,但是他们把源码放到github上了。那就非常简单了,从github上下载源码,编译,dll就生成出来了
  2. 配置文件。配置文件包含以下内容:
    2.1. 我们项目组的rally workspace OID 和 rally project OID。这两个参数是必须的,否则它定位不到我们项目的东西。将这两个参数写到配置文件里的另一个原因是,如果将来另外一个项目想要用我的工具,只用改下这两个参数即可;
    2.2. PO names,这个为了检查所有的story & defect最后是否assign back to PO
    2.3. 非空字段
    2.4. 固定值字段名,及其它的值
  3. C#代码编译成的exe文件
  4. .bat引导程序,它作为整个工具的入口,用户调用这个.bat 并给一个迭代号作为参数,.bat会调用exe,并将这参数传给exe
  5. 工具检查完某迭代所有story&defect后,将不符合标准的输出到一个同级目录下的ouput.txt。文件采取追加的方式写入,每次写入前判断文件大小,超过3Mb的话就清空。

接下来,介绍下Rally Rest API的简单用法。

首先,用自己的rally帐号,去生成RallyAPIKey,做法十分简单,Rally开发者中心有详细步骤。
用这个APIKey去做授权,比用自己的帐号密码要好很多,因为这个KEY只要帐号还在,就不会过期。而帐号密码,是要定期要更改的。
同时,初始化一个检查标准的实例,将所有检查条件存到这个实例里去

RallyRestApi restApi = new RallyRestApi();           restApi.AuthenticateWithApiKey("APIKey");
CheckCriteria checkCriteria = new CheckCriteria(@".\Config.xml");

然后,检查story时,request string必须填写”HierarchicalRequirement”。接下来set workspace OID和project OID,如上文所述,它们全部被定义在配置文件里。
requestStory.Fetch定义的是我们要取哪些字段,不得不说,这里有个天坑,rally页面展示的字段名,跟后台字段名,很多时候不是一样的,尤其是custom区域加的自定义字段。所以千万别想当然用页面上展示的字段。怎么能知道story或者defect所有的字段值呢?我把全网google了个底朝天也没找到办法。最后自己想了办法,不去设置requestStory.Fetch,它默认会把所有的字段取出来。然后去里面挑出自己要检查的字段。哇哈哈,真是费了一番心思。为了后续方便用户,我将所有后台字段名写入reference文件里(Story和Defect字段是不一样的,所以写了两份reference文件),供用户参考。
接下来就是query去查询了,查询条件就是迭代名,来自.bat的输入参数。然后轮询各个result,检查它的字段值。有时候某个字段为空,直接取它的值会抛空指针异常,所以取值前必须判断它是否为空。

Request requestStory = new Request("HierarchicalRequirement");
requestStory.Workspace = checkCriteria.GetWorkspaceOid();
requestStory.Project = checkCriteria.GetPorjectOid();
requestStory.Fetch = new List<string>() { "Owner", "Project", "FlowState", "FormattedID" };
requestStory.Query = new Query("Iteration.Name", Query.Operator.Contains, iteration);
QueryResult queryStoryResult = restApi.Query(requestStory);
foreach (var result in queryStoryResult.Results)
{
string owner = result["Owner"] == null ? "Null" : result["Owner"]["_refObjectName"];
}

接下来,检查defect,检查defect时,我就是取了所有的字段。

Request requestDefect = new Request("Defect");
requestDefect.Workspace = checkCriteria.GetWorkspaceOid();
requestDefect.Project = checkCriteria.GetPorjectOid();
requestDefect.Query = new Query("Iteration.Name", Query.Operator.Contains, iteration);
QueryResult queryDefectResult = restApi.Query(requestDefect);

将结果输出到文件时,采取string format的方法,让每个列占固定长度,这样的结果很工整,看着很舒服。


后记: 其实Rally提供了非常丰富的API。我这个工具仅仅只是查询。我们自动化组还做了自动提defect的工具,并将它与自动化回归测试整合在一起,当某个自动化回归用例失败了,就根据用例类型,去获取相应的error log/msg,然后自动提bug。酷的很~~
生命不息,自动化不止。不仅要去自动化测试,还需要多去思考,如何自动化手工重复劳动,来提升效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章