有没有办法衡量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编写的。