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。酷的很~~
生命不息,自動化不止。不僅要去自動化測試,還需要多去思考,如何自動化手工重複勞動,來提升效率。

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