ALM 开发人员生活中的一天:暂停工作、修复 Bug 和执行代码评审
带 Team Foundation Server 的 Visual Studio 高级专业版和 Visual Studio 旗舰版提供了强大的一键式功能,可通过此功能将工作上下文从一个工作线程切换到另一个工作线程。 此外,团队成员可以轻松将有关建议更改的消息交换为代码。 本主题阐释了这些功能,以继续这一关注虚拟敏捷团队成员的一天的教程。
Peter 忙于编写一些代码以完成积压工作 (backlog) 项任务。但是,他的同事发现了一个阻碍他们工作的 Bug,他想立即修复此 Bug。 他暂停了手中的工作并修复此 Bug。 他请求 Julia 审查修复情况,并在审查后检查修复结果并恢复其初始任务。
备注
Peter 使用的“我的工作”和“代码评审”功能仅在 Visual Studio 高级专业版和 Visual Studio 旗舰版中可用。
主题内容
挂起当前工作并开始处理 Bug
调查 Bug
请求代码评审
接受并执行(或拒绝)代码评审
接收并响应代码评审
修复测试和代码
签入修复
继续处理任务
挂起当前工作
当 Peter 处理积压工作 (backlog) 项时,Julia 过来讨论困扰她的 Bug。 这是 Peter 所熟悉的区域,因此他创建了修复 Bug 的任务,并将其分配给自己。 他决定立即开始修复工作。
在 Peter 开始处理新的 Bug 前,他想确保其当前工作保留在团队服务器上的安全位置。 在**“我的工作”页上,Peter 选择“挂起”**进行保存(在 Team Foundation Server 上):
他完成的所有工作包括对代码、测试和其他文件的更改。
打开解决方案、窗口、断点、监视窗口变量和其他 Visual Studio 状态的位。
限制已清理工作区,Peter 将新的任务从**“可用工作项”拖动到“正在进行的工作”**。 他已准备好研究和编写修复。
备注
你的工作上下文链接到在“我的工作”页中显示为“正在进行”的工作项。通过使用“挂起”和“继续”,可在不同的任务间快速切换。打开的解决方案和文件、代码更改以及 Visual Studio 布局都会一起切换。
挂起当前工作并开始执行另一项任务
**连接:**如果尚未连接到要在其中工作的团队项目,请连接到团队项目:
- 在**“团队资源管理器”中,选择 “主页”,然后选择 “我的工作”**。
挂起你的当前任务:
在**“正在进行的工作”部分中,选择“挂起”**。
在显示的框中,指定你要为此挂起的工作集提供的名称,然后选择**“挂起”**按钮。 默认名称是当前正在进行的工作项。
开始新任务、Bug 或其他工作项上的工作:
在选择工作项之前,你可能需要:
通过选择**“可用工作项”下的“新建”**,创建新任务或其他工作项;或
在**“可用工作项”**下选择不同查询。
将工作项从**“可用工作项”拖动到“正在进行的工作”**。
或者,可以从**“挂起的工作”**项下拖出之前已挂起的工作项来切换到该工作项。
提示
当前正在进行的工作项将链接到当前代码更改和 Visual Studio 状态。若要允许 Visual Studio 帮助你组织工作,请确保你在从一个任务切换到另一个任务时,相应的项处于“正在进行中”状态。
调查 Bug
Peter 打开并阅读 Bug 工作项。 根据测试团队成员编写的说明,已付款的发票有时会被错误地标记为未付款。 有一个附加到 Bug 工作项的实验室环境快照。 Peter 可以打开运行测试的虚拟机,查看错误发票和 IntelliTrace 日志。 他跟踪以下方法存在的错误:
public class LocalMath
{
public static bool EqualTo(double a, double b)
{
return a == b;
}
从 IntelliTrace 日志中,Peter 发现此方法有时会因参数存在极小的差异而返回 false。 Peter 知道此类舍入误差在浮点算法中是不可避免的,同时,利用此方法测试浮点数字的相等性也较为不妥。
增加测试以显示错误
在找到 Bug 后,就会显示单元测试数量不足或测试不符合用户的实际需求。 因此,在修复 Bug 之前,Peter 添加了一个将演示存在此错误的测试。
// Added 2012-02-02 for bug 654321:
/// <summary>
/// Make sure that number equality test allows for
/// small rounding errors.
/// </summary>
[TestMethod]
public void TestDoublesEqual()
{
// We allow a rounding error of 1 in 1000000:
TestEqual(1, 1e-7, true); // Less than allowed error
TestEqual(1, 1e-5, false); // More than allowed error
TestEqual(1000, 1e-7, true); // Less than allowed error
TestEqual(1000, 1e-5, false); // More than allowed error
}
private void TestEqual(double value, double error, bool result)
{
// Try different combinations of error and value:
Assert.IsTrue(result == LocalMath.EqualTo(value + error, value));
Assert.IsTrue(result == LocalMath.EqualTo(value, value + error));
Assert.IsTrue(result == LocalMath.EqualTo(value - error, value));
Assert.IsTrue(result == LocalMath.EqualTo(value, value - error));
}
他运行了该测试,结果如预期一样以失败告终。
让测试通过
Peter 修复代码:
public static bool EqualTo(double a, double b)
{
// Allow for rounding errors.
// For example, a == 2.0 and b = 1.99999999999
const double allowedError = 1/1000000;
return System.Math.Abs(a - b) < allowedError;
}
测试现在通过:
请求代码评审
Peter 对自己对 Bug 的修复感到满意,但是尚未签入其工作。 Peter 的团队使用代码评审来提高整体代码质量并减小因创建更多 Bug 带来的风险,因此,他使用团队资源管理器从团队同事 Julia 和 Adam 那里请求代码评审。
请求代码评审
在**“团队资源管理器”中的“我的工作”页上,选择“请求审查”**。
**“新代码审阅”**页将出现。
指定一个或多个审阅者。
指定评审的名称。
指定区域路径。
指定审阅者的注释。
选择**“提交请求”**。
审阅者将通过电子邮件接收请求通知。
你还可以请求对挂起的工作、搁置集或变更集进行代码评审。 若要查看变更集的列表,请打开**“源代码管理资源管理器”,然后选择“历史记录”**按钮。
接受或拒绝代码评审
Julia 接收并接受代码评审请求。 她评审代码,并在文件和代码块级别编写注释,然后将代码评审反馈给 Peter。 Adam 太忙,无法评审代码,因此拒绝了请求。
Julia 在其注释中指出测试是错误的。 允许的误差应为输入值的指定部分,而不是常数。 因此,测试应将错误值乘以值。
// We allow a rounding error of 1 in 1000000
// as a fraction of the value:
TestEqual(1, 1e-7, true); // Less than allowed error
TestEqual(1, 1e-5, false); // More than allowed error
TestEqual(1000, 1000*1e-7, true); // Less than allowed error
TestEqual(1000, 1000*1e-5, false); // More than allowed error
提示
请注意,团队成员会将测试用作讨论焦点。如果测试正确且足够,则代码也会如此。与代码不同,每个测试表示单独的大小写。因此,讨论测试通常比讨论代码更容易。
执行代码评审
在**“团队资源管理器”中的“我的工作”页上,转到“我的代码评审和请求”**部分并打开该请求。
在**“代码评审”**页上,你可以:
选择**“接受”或“拒绝”**以通知作者你是否将执行评审。
选择**“添加审阅者”**以将其他审阅者添加到代码审阅请求。
查看对每个已为此工作项更新的文件的更改。
展开**“注释”**以与作者和其他审阅者讨论更改。
选择**“添加总体评价”**
- 或 -
选择一个代码块,然后从快捷菜单中选择**“添加注释”**。
- 选择**“发送评论”**以使你的提交对作者和其他审阅者可见。
选择**“发送和完成”**以完成审阅,指出是否需要进一步修改代码。
响应代码评审
Peter 接收并响应了来自 Julia 的代码评审。
响应代码评审
代码的审阅者和作者可以根据需要交换注释。 作者一旦关闭评审,则评审就将结束。 每次有人参与讨论时,其他参与者都会收到电子邮件通知。
在**“团队资源管理器”中的“我的工作”页上,转到“代码评审和请求”**部分,然后双击该请求。
你还可以打开请求的快捷菜单并选择**“打开”**。
阅读评论并根据需要进行答复。 若要答复评论,请选择**“答复”,在出现的框中输入你的评论,然后选择“确定”。 若要发送你的评论,请选择“发送评论”**。
若要查看文件并查看包含注释的代码块或者要编辑文件,请转到**“注释”部分。 在“文件”子节中,打开文件的快捷菜单并选择“比较(只读)”或“编辑文件”**。
如果你和其他审阅者已回复完彼此的评论并准备关闭审阅,请单击**“关闭审阅”**,然后选择:
**“完成”**可表明已完成审阅。
- 或 -
**“放弃”**可表明正在取消审阅。
修复测试和代码
阅读完 Julia 的注释后,Peter 按照她的建议修复了其单元测试。 测试现已失败。 这意味着代码不正确。
Peter 修复代码:
/// <summary>
/// Returns true if two numbers are equal.
/// </summary>
public static bool EqualTo(double a, double b)
{
// Allow for rounding errors.
const double allowedErrorMultiple = 1/1000000;
double allowedError = (System.Math.Abs(a) + System.Math.Abs(b)) * allowedErrorMultiple/2;
return System.Math.Abs(a - b) < allowedError;
}
测试再次通过:
提示
若要修复此 Bug,请按照代码开发中的相同做法进行操作。编写会失败的测试,然后设法让该测试通过。仅在测试通过时,签入代码和测试。
Peter 现在将注意力转移到发现 Bug 的测试用例上。 在测试用例工作项中清楚说明了 Bug 的重现步骤。 他按照这些步骤操作,并发现已正确列出了发票。
签入修复
Peter 签入已修复代码和单元测试。 Bug 的状态自动设置为**“已解决”,并且“指派给”**值将自动重新分配给发现 Bug 的测试团队的成员。 该团队成员将验证 Bug 是否已修复并关闭工作项。
签入修复
在**“团队资源管理器”中,在“我的工作”页上,选择“签入”**。
查看**“挂起的更改”**页的内容以确保:
所有相关更改都在**“包含的更改”**中列出
所有相关工作项都在**“相关工作项”**中列出。
指定**“注释”**以在你的团队查看已更改文件和文件夹的版本控制历史记录时助其了解这些更改的目的。
选择**“签入”**。
继续处理任务
Peter 继续处理自己的任务。 他很快就可以继续工作,因为他的所有代码更改连同重要的状态图位(如打开窗口、断点及观看窗口变量)都已还原至工作区。
继续任务中的工作
在**“团队资源管理器”中的“我的工作”页上,查找“挂起的和搁置的工作”**列表。 打开项的快捷菜单。 你有两个选择:
若要继续挂起的工作并自动挂起工作区中任何挂起的更改,请选择**“继续”**。
若要将挂起的工作与工作区中已挂起的更改合并,请选择**“与“正在进行”部分合并”**。
当你继续工作时
当你继续工作时,Visual Studio 会还原:
打开的解决方案
代码更改
打开的窗口的状态和位置
断点
监视窗口变量与表达式
书签
验证此 bug 已消失
如果测试团队发现此 bug,他们会将一些测试用例链接到此 bug,并且将重新运行它们。 了解详细信息。