Visual Studio Team Foundation Service 敏捷 Bug 记录器
这是一个简单的桌面应用程序,它使用 Visual Studio online API 在您的 AGILE 工作流程中创建和添加缺陷。
引言
我们已经开始使用 Visual Studio Team Foundation Services 来管理我们的 Agile 工作负载,但我希望确保测试人员有一个简单快捷的缺陷/功能报告方式。
在调查中,有很多基于 Web 的应用程序,专注于网站日志记录。我们开发桌面应用程序,这些解决方案对我们的需求来说不够好。
因此,我创建了一个新的简单桌面应用程序,它使用 Visual Studio Team Foundation Services APIs 来创建缺陷、添加附件和备注。
这让我很好地了解了如何使用 Visual Studio Team Foundation Services APIs,我想分享我所学到的知识。
Using the Code
该解决方案使用 HTTPClient 和 JsonConvert.SerializeObject 来进行 JSON 调用。
将数据类对象从 Data 类转换为 HTTPContent,然后可以由 JSON 使用。
  public static System.Net.Http.HttpContent ConvertDataClassToJason(object dataClass)
        {
            string wiPostDataString = JsonConvert.SerializeObject(dataClass);
            return  new System.Net.Http.StringContent
               (wiPostDataString, Encoding.UTF8, "application/json-patch+json");
        }
下面的方法使用 HTTPClient 进行 Post 或 Patch 调用,并使用 APIs 获取结果。
Post 示例
public static async void Post(string url, System.Net.Http.HttpContent wiPostDataContent, 
     string returnType, JSONReturnCallBack callBack)
        {
           string responseString = String.Empty;
           try
           {
                using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient())
                {
                    client.DefaultRequestHeaders.Accept.Add
                    (new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
 
                  
                    client.DefaultRequestHeaders.Authorization = 
                                 new AuthenticationHeaderValue
                                 ("Basic",Convert.ToBase64String
                                 (System.Text.ASCIIEncoding.ASCII.GetBytes
                                 (string.Format("{0}:{1}", username, password))));
                      using (System.Net.Http.HttpResponseMessage response = 
                      client.PostAsync(url, wiPostDataContent).Result)
                      {
                            response.EnsureSuccessStatusCode();
                            string ResponseContent = await response.Content.ReadAsStringAsync();
                            responseString = ResponseContent;
                      }
                }
            }
            catch(Exception ex)
            {
                            Console.WriteLine(ex.ToString());
                            Console.ReadLine();
            }
           callBack(responseString,returnType);
        }
Patch 调用
这需要在您的 Visual Studio 中添加一个库。您可以使用 NuGet 来执行此操作。
https://nuget.net.cn/packages/Microsoft.VisualStudio.Services.Client
Code snippet to be added
创建工作项
下面的示例将引导您完成以下步骤
- 添加新的工作项
- 附加文件- 上传文件
- 附加到工作项
 
创建新项目
这将向您展示如何在您的 VSO 帐户的项目中创建简单的项目。
创建参数
创建项目时,您需要标题、描述和标签。
   private static void createInitailItemPostObject()
        {                                           
            AddUpdateProp("/fields/System.Title", newTaskItem.Title);
            AddUpdateProp("/fields/System.Tags", newTaskItem.Tags);
            AddUpdateProp("/fields/System.Description", newTaskItem.Description);             
        }
        private static void AddUpdateProp( string field, string value)
        {            
            DataObjectsProject.VSOJasonWorkItemPostData wiPostData = new DataObjectsProject.VSOJasonWorkItemPostData();
            wiPostData.op = "add";
            wiPostData.path = field;
            wiPostData.value = value;
            wiPostDataArr.Add(wiPostData);           
        }
用于保存参数的数据类
   public class VSOJasonWorkItemPostData
    {
        public string op;
        public string path;
        public string value;
    }
发送项目
将项目发送到 VSO 以创建工作项。此方法将返回一个 ID 以及其他一些字段。
string NewWorkItem = 
"https://[Account].visualstudio.com/DefaultCollection/[Project]/_apis/wit/workitems/$Task?api-version=1.0";
 Models.Helpers.JASONHelper.Post(newWorkItem, Models.Helpers.JASONHelper.ConvertDataClassToJason
 (wiPostDataArr), "createtask", new Models.Helpers.JASONHelper.JSONReturnCallBack(jsonReturn));         
JSON 调用返回一个字符串,下面将把字符串转换为可用的对象。
  public static VSOJasonWorkItemReturnData ConvertDataClassToWorkItemReturnDataObject(string jasonString)
        {
            var wiPostDataString = 
            JsonConvert.DeserializeObject<VSOJasonWorkItemReturnData>(jasonString);
            return wiPostDataString;
           
       }
使用的数据对象类
    public class VSOJasonWorkItemReturnData
    {
        [JsonProperty(PropertyName = "id")]
        public int Id { get; set; }
        [JsonProperty(PropertyName = "rev")]
        public int Rev { get; set; }
        [JsonProperty(PropertyName = "fields")]
        public JsonArrayAttribute  Fields { get; set; }
        [JsonProperty(PropertyName = "links")]
        public JsonArrayAttribute Links { get; set; }
        
    }
发送附件
您首先需要将附件上传到您的 Visual Studio Team Foundation Services 帐户。
 string responseString = String.Empty;
            try
            {
                using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient())
                {
                    client.DefaultRequestHeaders.Authorization =
                                 new AuthenticationHeaderValue("Basic",
                                 Convert.ToBase64String
                                 (System.Text.ASCIIEncoding.ASCII.GetBytes(getConnectionDetails())));
                    FileStream files = new FileStream(filepath, FileMode.Open);
                    StreamContent streamcontent = new StreamContent(files);
                    using (System.Net.Http.HttpResponseMessage response = 
                                    client.PostAsync(SetURL(url),streamcontent).Result)
                    {
                        response.EnsureSuccessStatusCode();
                        responseString = await response.Content.ReadAsStringAsync();
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                Console.ReadLine();
            }
附加附件
发送附件后,您需要将附件附加到所需的工作项。
 try
            {
                using (HttpClient client = new System.Net.Http.HttpClient())
                {
  StringBuilder msg = new StringBuilder();
            msg.Append("[{");
            msg.Append("\"op\": \"add\",");
            msg.Append("\"path\": \"/relations/-\",");
            msg.Append("\"value\": {");
            msg.Append("\"rel\": \"AttachedFile\",");
            msg.Append(String.Format("\"url\": \"{0}\",", attachmentUploadReturnObject.URL));
            msg.Append("\"attributes\": {");
            msg.Append(String.Format("\"comment\": \"{0}\"", comment));
            msg.Append("}");
            msg.Append("}");
            msg.Append("}]");
            wiPostDataContent = new System.Net.Http.StringContent(msg.ToString(), 
                             Encoding.UTF8, "application/json-patch+json");
                    client.DefaultRequestHeaders.Accept.Add
                           (new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue
                           ("application/json-patch+json"));
                    client.DefaultRequestHeaders.Authorization =
                                 new AuthenticationHeaderValue("Basic", Convert.ToBase64String
                                 (System.Text.ASCIIEncoding.ASCII.GetBytes(getConnectionDetails())));
                  
                    using (System.Net.Http.HttpResponseMessage response = 
                           client.PatchAsync(SetURL(url), wiPostDataContent).Result)
                    {
                        response.EnsureSuccessStatusCode();
                        string ResponseContent = await response.Content.ReadAsStringAsync();
                        responseString = ResponseContent;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                Console.ReadLine();
            }
关注点
您可以更详细地查看该应用程序
- 在线网站发布的版本
- 查看可下载文件中的代码
- 查看 GitHub 仓库中的代码
已发布应用程序:http://bugs.coopsmill.com
GitHub:https://github.com/chriscooper01/VSODesktop.git
API 文档:https://www.visualstudio.com/en-us/docs/integrate/api/overview
历史
- 2016 年 6 月 28 日:初始版本




