DevOps 开发人员的一天:挂起工作、修复 bug 并执行代码评审

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

Visual Studio 2019 | Visual Studio 2022

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

注意

以下版本的 Visual Studio 提供“我的工作”和“代码评审”功能:

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

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

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

    • 所有相关更改都在“包含的更改”中列出

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

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

  4. 选择“签入”。

继续处理任务

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

继续任务中的工作

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

    继续任务的屏幕截图。

    或者,若要将挂起的工作与工作区中挂起的更改合并,请选择“与‘正在进行’部分合并”。

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

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