问题 Visual Studio Online中的时间跟踪


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


4768
2017-12-09 12:48


起源

有关Team Foundation Server和Visual Studio Online的时间跟踪选项的讨论很好: visualstudio.uservoice.com/forums/121579-visual-studio/... - Ed Blankenship


答案:


当你创建一个 Task 与...相关联 Backlog item 或者a Bug, 场 Remaining work 实际上是几个小时。因此,您可以将其设置为具有时间跟踪。

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


5
2017-12-09 13:06



没有,因为系统无法真正知道用户在做什么。您走在正确的轨道上,他们可以检查与特定任务/错误/问题相关的工作,因此报告是有意义的。 - Jason
@Jason当你设置任务时 Done 可能会有像这样的领域 Actual work 用户可以设置设置任务所用的实际小时数。 - Gimly
有一个实际的工作设置(至少有cmmi配置文件)。估计,剩余,实际。这并没有解决我认为OP要求的确切时间,因为工人可以在那里放任何东西。 - Jason
谢谢!我一定会尝试这种方法。我需要将所有东西放在一个地方,因此双重证据不会有任何错误或遗漏。当然,作为PM,我也对测量(例如估算与实现特征所花费的实际时间)感兴趣,因此我们可以从这些糟糕的估计中学习并确定团队的速度。 - Diana TM
无法将TFS用作时间跟踪工具。 - MrHinsh - Martin Hinshelwood


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

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

对课程粒度任务进行单独的时间跟踪。专注于计费而非时间跟踪。我想知道要收费的客户或项目以及capex vs opex ...除此之外,数据几乎没有价值。我使用Freshbooks并成功使用了Harvest。

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


3
2017-12-09 14:27



我很困惑。目前我们使用fogbugz并为我们所做的所有工作创建案例 - 我的意思是错误案例,新功能案例,新项目所有功能的案例,以及公司开发任务等。这样我们就知道如何我们正在花时间并且确实记录了我们如何花时间为客户开账单(我们的很多账单都是按时完成工作,所以这很重要)。允许我们在VSO中记录时间的功能将允许我们从fogbugz切换到VSO,我不明白为什么这么多人反对它? - tomRedox
tom_redox,这根本不是我公司的工作流程。我们根本没有追踪时间,因为它没有任何价值。如果我为我的客户做了一天工作,我会为他们开账单一天。如果我做了两个小时,我会给它们开2小时。您遇到这种观点,因为任何形式的时间跟踪,而不是计费,都没有价值。如果您的客户要求每小时逐项列出您所做的工作,那么他们就不信任您。如果他们不相信你,他们真的是适合你的客户吗? - MrHinsh - Martin Hinshelwood
好吧,很酷,没有推进我们在这里的任何理解,你反复声明这是一个坏主意没有任何真正的推理,我可能没有完全传达我们的情景。这可能是讨论的错误地方,评论的短格式性质限制了我们。感谢您抽出宝贵时间做出回应,让我们留在那里。 - tomRedox
很高兴你给我发电子邮件,我们可以详细讨论! - MrHinsh - Martin Hinshelwood
很抱歉要考虑一个老话题,但这对我很感兴趣。我有兴趣跟踪我们的开发人员在工作上花费的时间,但不是因为我想向客户收费(我们开发内部使用的应用程序),但是因为我想知道我们的表现与我们的估算相比如何。如果一个开发人员给我一个35小时的工作估计,我想知道它完成了多长时间。我想报告这个问题,以全面了解我们的评估情况。我很失望VSO中没有这样的设施。 - Philip Stratford


我过去使用过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撰写。


1
2018-04-20 00:10