开发运营开发人员的一天:暂停工作、修复 bug 并执行代码评审

Azure DevOps Services |Azure DevOps Server 2022 - Azure DevOps Server 2019 |TFS 2018

Visual Studio 2019 |Visual Studio 2022

Visual Studio “我的工作 ”和 “代码评审” 功能支持上下文从一个工作线程切换到另一个工作线程。 此外,团队成员可以轻松将有关建议更改的消息交换为代码。 本文介绍了这些功能,并延续 了 Devops 开发人员的一天:为用户编写新代码故事中的教程。

注意

Visual Studio My WorkCode Review 功能在以下版本中可用:

  • Visual Studio 2022:Visual Studio Community、Visual Studio Professional和Visual Studio Enterprise
  • Visual Studio 2019:Visual Studio Professional和Visual Studio Enterprise

本教程介绍如何暂停当前任务的工作,以立即修复阻止其他工作项目中的团队成员的 bug。 修复 Bug 后,可以要求同事查看修补程序,并在评审通过后,签入修复并恢复原始任务的工作。

挂起当前工作

在处理积压工作项时,你可能会发现另一项中阻止队友的 bug。 如果它是你熟悉的领域,则可以创建一个任务来修复 Bug,并立即将其分配给自己来处理。

在开始处理新 bug 之前,需要确保将当前工作放在团队服务器上的安全位置。 在 Visual Studio 团队资源管理器的“ 我的工作 ”页上,选择“ 挂起 ”以在服务器上保存:

  • 已完成的所有工作,包括对代码、测试和其他文件的更改。

  • 打开解决方案、窗口、断点、监视窗口变量和其他 Visual Studio 状态的位。

现在工作区已干净,请将新任务从 “可用工作项” 拖动到 “正在进行的工作”。 你已准备好研究和编写修补程序。

注意

你的工作上下文链接到在“我的工作”页上显示为“正在进行”的工作项。 通过使用“暂停”和“恢复”,可以在不同的任务之间快速切换。 打开的解决方案和文件、代码更改以及 Visual Studio 布局都会一起切换。

挂起当前工作并开始执行另一项任务

切换工作上下文:

  1. 如果尚未连接到要处理的项目, 请连接到该项目

  2. “团队资源管理器”的“主页”中,选择“我的工作”。

  3. 在“ 我的工作 ”页上的“ 正在进行的工作 ”部分中,选择“ 挂起”。

  4. 在显示的框中,根据需要更改要授予这组挂起工时的名称,然后选择“ 挂起”。 该项显示在 “挂起的工作”下。

    暂停某些工作的屏幕截图。

  5. 将工作项从 “可用工作项” 拖到 “正在进行的工时”。 或者,可以通过将工作项从“挂起的工作”中拖动来切换到之前挂起 的工作项。

    如果要自行分配的工作项未显示在 “可用工作项”下,则可以:

    • 通过选择“ 新建”创建新任务或其他工作项。
    • 通过选择“打开查询”选择其他 查询

提示

“正在进行的工作”项链接到当前代码更改和 Visual Studio 状态。 若要允许 Visual Studio 帮助你组织工作,请确保在从一个任务切换到另一个任务时,相应的项处于 “正在进行工作” 状态。

调查 Bug

打开新 bug 并阅读说明。 在此示例中,测试团队成员的说明指出,付费发票有时被错误地标记为未付。 实验室环境快照附加到 bug 工作项。 打开运行测试的虚拟机 (VM) ,查看错误的发票,然后单步执行 IntelliTrace 日志。 可以将错误跟踪到以下方法:

public class LocalMath
{
    public static bool EqualTo(double a, double b)
    {
        return a == b;
    }

从 IntelliTrace 日志中可以看到,有时方法返回 false,因为参数差异极小。 你知道,这种舍入误差在浮点算术中是不可避免的,而且测试浮点数是否相等是一种不好的做法。

增加测试以显示错误

当发现 bug 时,它表明单元测试存在差距,或者测试与用户的实际需求不匹配。 因此,在修复 bug 之前,请添加一个测试来证明是否存在此错误:

// Added 2022-02-02 for bug 654321:
/// <summary>
/// Make sure that number equality test allows for 
/// small rounding errors.
/// </summary>
[TestMethod]
public void TestDoublesEqual()
{
    // 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));
}

运行测试,但会按预期失败。

单元测试资源管理器的屏幕截图,显示未通过等于的测试。

让测试通过

修复代码:

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;
}

测试现在通过:

单元测试资源管理器的屏幕截图,其中显示了相等的已通过测试。

请求代码评审

如果对 bug 的修复感到满意,请不要签入你的工作。 团队使用代码评审来提高整体代码质量,并降低创建更多 bug 的风险。 使用 团队资源管理器 向团队成员请求代码评审。

请求代码评审

  1. “团队资源管理器”的我的工作 ”页上,选择“ 正在工作”下的“ 请求评审”。

    此时将显示 “新建代码评审 ”页。

    显示“请求代码评审”页的屏幕截图。

    • “输入审阅者的姓名 ”字段中,指定一个或多个审阅者,并在每次选择后按 Enter。
    • 在下一个字段中,根据需要更改审阅的名称。
    • 在下一个字段中,确保显示正确的区域路径。
    • 在下一个字段中,键入可选说明。
  2. 选择 “提交请求”。

将通过电子邮件通知审阅者请求。

你还可以请求对挂起的工作、搁置集或变更集进行代码评审。 若要查看更改集的列表,请打开 源代码管理资源管理器 ,然后选择“ 历史记录 ”按钮。

执行代码评审

审阅者可以接受代码评审请求。 审阅者审阅代码,在文件和代码块级别编写一些注释,然后将代码评审发送回给你。 如果请求的审阅者太忙而无法审阅代码,则可以拒绝评审。

在评论中,审阅者指出测试错误。 允许的误差应为输入值的指定部分,而不是常数。 因此,测试应将错误值乘以值。

// 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

提示

团队成员将测试用作讨论的焦点。 如果测试正确且足够,则代码也会如此。 与代码不同,每个测试表示单独的大小写。 因此,讨论测试通常比讨论代码更容易。

执行代码评审

  1. 团队资源管理器“我的工作”页上,右键单击“代码评审”部分中的代码评审,然后选择“打开”。

    此时将显示 “代码评审 ”页。

    “代码评审”页的屏幕截图。

  2. “代码评审 ”页上,可以:

    • 选择 “添加审阅者 ”,将其他审阅者添加到代码评审请求。

    • 选择每个文件链接以查看对此工作项更新的文件所做的更改。

    • 使用 “注释” 与作者和其他审阅者讨论更改。

      添加批注:

      • 选择 “添加整体批注 ”,向审阅添加整体批注。
      • 查看文件时,请选择一行或代码块,右键单击,然后选择“ 添加注释”。

      添加每个批注后,选择“ 保存 ”或按 Ctrl+Enter。

  3. 输入完批注后,选择“ 发送批注 ”,使你的贡献对作者和其他审阅者可见。

响应代码评审

你会收到并响应审阅者的代码评审。 你和审阅者可以根据需要频繁地交换评论。 评论将在关闭时结束。

响应代码评审

  1. 团队资源管理器的“ 我的工作 ”页上,转到 “代码评审 ”部分并双击请求,或右键单击请求并选择“ 打开”。

    此时将显示 “代码评审 ”页。

    响应代码评审的屏幕截图。

  2. “批注 ”部分下,阅读批注并根据需要回复。 若要回复批注,请选择“ 回复”,在显示的框中输入批注,然后选择 “确定”。

  3. 若要查看文件并查看包含注释的代码块,或者要编辑或注释某个文件,请转到 “文件” 子部分。 右键单击该文件,然后选择以下任一选项:

    • 比较 (只读)
    • 编辑本地文件,或
    • 添加文件注释

    还可以选中批注旁边的复选框,以指示批注已解决。

  4. 若要发送批注,请选择 “发送批注”。

  5. 当你和其他审阅者完成对彼此的批注的响应并准备好关闭审阅时,请选择“ 关闭审阅”,然后选择:

    • 完成 以指示审阅已完成,或者
    • 放弃 以指示你正在取消评审。

修复测试和代码

阅读审阅注释后,可以按建议修复单元测试。 测试现已失败。 这表明代码尚不正确。

修复代码:

/// <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,请按照代码开发中的相同做法进行操作。 编写会失败的测试,然后设法让该测试通过。 仅在测试通过时,签入代码和测试。

现在,你将注意力转向发现 bug 的测试用例。 在测试用例工作项中清楚说明了 Bug 的重现步骤。 按照这些步骤操作,发现发票已正确列出。

签入修复

签入固定代码和单元测试。 bug 的状态会自动设置为“ 已解决”,并且“ 分配给 ”值会自动重新分配给发现该 bug 的测试团队的成员。 该团队成员将验证 Bug 是否已修复并关闭工作项。

签入修复

  1. “团队资源管理器”的“我的工作”页上,选择“Check In”以打开“挂起的更改”页。

    签入更新以修复 bug 的屏幕截图。

  2. “挂起的更改” 页上,确保:

    • 所有相关更改都列在包含的更改

    • 所有相关工作项都列在 “相关工作项”中。

  3. 输入 注释 ,以帮助团队在查看已更改文件和文件夹的版本控制历史记录时了解这些更改的用途。

  4. 选择“Check In”。

继续处理任务

继续处理原始任务。 你可以快速恢复工作,因为所有代码更改都会还原到工作区以及重要的状态位,例如打开的窗口、断点和监视窗口变量。

继续任务中的工作

  • “团队资源管理器”的“ 我的工作” 页上,选择“挂起的工作”下的“原始 工作 项”,然后选择“ 恢复”。

    “恢复任务”的屏幕截图。

    或者,如果要将挂起的工作与工作区中挂起的更改合并,请选择“合并正在进行”。

当你继续工作时,Visual Studio 会还原:

  • 打开的解决方案
  • 代码更改
  • 打开的窗口的状态和位置
  • 断点
  • 监视窗口变量与表达式
  • 书签