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

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

Visual Studio 2019 |Visual Studio 2022

Visual Studio My WorkCode Review 功能支持从一个工作线程切换到另一个线程的上下文。 此外,团队成员可以轻松交换有关代码建议的更改的消息。 本文阐释了这些功能,继续学习 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 的修复感到满意时,请不要签入你的工作。 Teams 使用代码评审来提高总体代码质量,并降低创建更多 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. 若要查看文件并查看包含注释的代码块,或者要编辑或注释文件,请转到 “文件” 子部分。 右键单击该文件,然后选择以下任一项:

    • 比较(Read-Only)
    • 编辑本地文件,或
    • 添加文件注释

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

  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. “团队资源管理器”的“ 我的工作 ”页上,选择 “签入 ”以打开 “挂起的更改 ”页。

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

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

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

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

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

  4. 选择 “签入”。

继续处理任务的工作

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

恢复对任务的工作

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

    恢复任务的屏幕截图。

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

恢复工作时,Visual Studio 将还原:

  • 打开的解决方案
  • 代码更改
  • 打开窗口的状态和位置
  • Breakpoints
  • 监视窗口变量和表达式
  • Bookmarks