Visual Studio Online 中的时间跟踪



有没有办法衡量Visual Studio Online中花在用例或任务上的时间?我想将所有内容保存在一个地方(Visual Studio Online就是这种情况),并从那里能够生成报告,例如每个用户的月度时间跟踪报告和每日报告,这些报告将反映在特定用例/任务上工作的实际时间与估计时间。

创建链接到积压工作项Bug 的任务时,"剩余工时"字段实际上以小时为单位。因此,您可以将其设置为具有时间跟踪功能。

不幸的是,据

我所知,没有办法设置任务完成后的实际时间。

不,在 VSO 或 TFS 上无法开箱即用。这种方法不利于有效和有价值的交付。事实上,研究表明,这可能不利于为客户提供价值。

虽然有第三方工具插入 VSO 并提供此功能,但我建议采用不同的方法。

对课程粒度任务进行单独的时间跟踪。专注于计费而不是时间跟踪。我想知道要向哪个客户或项目收费,以及资本支出与运营支出...除此之外,数据几乎没有价值。我使用Freshbooks,并且过去曾成功使用Harvest。

更新:如果您是咨询公司,则显然需要跟踪计费时间。这应该在与 TFS 不同的系统中完成。

我过去使用过 Jira,并且喜欢记录工作时间的方式。

我们使用注释列表在 VSTS 中创建了一个解决方法。它不优雅,但它有效。一个在注释中添加一个数值,该值计为工作小时数。您可以使用正则表达式对此进行更精细的处理,但我所包含的代码假设其中存在浮点数或整数。

URL_PREFACE =  "https://yourproject.visualstudio.com/defaultcollection/"
def getTicketComments(ticketID):
    """ Gets a list of the comments (in order from oldest to newest) for a given ticket """
    url = URL_PREFACE + "_apis/wit/workitems/" + str(ticketID) + "/comments?api-version=3.0-preview&order=asc"
    jsonDict = readURL(url)
    return jsonDict["comments"]

然后我们对找到的值求和:

def getHoursSum(ticketID):
    """ For the given ticket, gets their comments, and calculates the hours
    """
    commentList = getTicketComments(ticketID)
    hourSum = 0
    for comment in commentList:
        try:
            hourSum += float(comment["text"]) # Will break if it's not a number
        except:
            pass
return hourSum

最后,我们存储CompletedWork字段中的工作小时数:

def updateHours(ticketID, completedHours):
    headers = {"Content-Type": "application/json-patch+json"}
    url = URL_PREFACE + "_apis/wit/workitems/" + str(ticketID) + "?api-version=1.0"
    body = """[
        {
            "op": "replace",
            "path": "/fields/Microsoft.VSTS.Scheduling.CompletedWork",
            "value": """ + str(completedHours) + """
        }
    ]"""
    username = 'username'  # Doesn't matter
    password = TOKEN
    # TO GET TOKEN:
    #   Log into https://yourproject.visualstudio.com/
    #   Click on your name -> My Profile
    #   In the left-hand sidebar, click on "Security"
    #   Under "Personal Accesss Tokens," click "Add"
    #   Under "Description" give your token a name (doesn't matter)
    #   Choose an expiration for your token (recommend: 1 yr)
    #   "Authorized Scopes" = "All Scopes"
    #   Click "Save"
    #   Copy the token it gives you into token field below (paste between quotes)
    session = requests.Session()
    request = requests.Request(method="PATCH", headers=headers, auth=(username, password),
                               url=url,  data=body)
    prepped = request.prepare()
    response = session.send(prepped)
    return response

(我只是复制并粘贴了一些简化的代码 - 您需要集成它。

代码是由我最优秀的同事@Elliptica编写的。

相关内容

  • 没有找到相关文章

最新更新