使用 IntelliTest 为模糊测试生成单元测试

IntelliTest 探索 .NET 代码以生成测试数据和单元测试套件。 对于代码中的每个语句,将生成将执行该语句的测试输入。 对代码中的每个条件分支执行事例分析。 例如,if 将分析语句、断言以及所有可能引发异常的操作。 此分析用于为每个方法生成参数化单元测试的测试数据,从而创建代码覆盖率较高的单元测试。 将其视为智能模糊测试,可将输入和测试用例剪裁为执行所有逻辑分支并检查异常的内容。

运行 IntelliTest 时,可以轻松查看哪些测试失败,并添加任何必要的代码来修复它们。 可以选择将哪些生成的测试保存到测试项目中,以提供回归套件。 更改代码时,请重新运行 IntelliTest,使生成的测试与代码更改保持同步。

注释

Visual Studio 2026 中弃用 IntelliTest。 在 Visual Studio 2022 中,仅 .NET Framework 支持 IntelliTest,并且仅限于 Visual Studio Enterprise。 仅对 .NET 6 的支持仅限于预览版。

注释

在 Visual Studio 2022 中,仅 .NET Framework 支持 IntelliTest,并且仅限于 Visual Studio Enterprise。 仅对 .NET 6 的支持仅限于预览版。

可用性和扩展

创建 IntelliTest运行 IntelliTest 菜单命令:

  • 仅在 Visual Studio Enterprise Edition 中可用。

  • 仅支持面向 .NET Framework 的 C# 代码。

  • 可扩展并支持以 MSTest、MSTest V2、NUnit 和 xUnit 格式发出测试。

  • 不支持 x64 配置(需要预览版)。

探索:使用 IntelliTest 浏览代码并生成单元测试

若要生成单元测试,类型必须为公共类型。

  1. 在 Visual Studio 中打开解决方案,然后打开包含要测试的方法的类文件。

  2. 右键单击某个方法,然后选择 “运行 IntelliTest ”,为方法中的代码生成单元测试。

    右键单击方法以生成单元测试的屏幕截图。

    右键单击方法以生成单元测试的屏幕截图。

    IntelliTest 使用不同的输入多次运行代码。 表格中显示每次运行的输入测试数据及其对应的输出或异常情况。

    “浏览结果”窗口的屏幕截图。

    “浏览结果”窗口的屏幕截图。

若要为类中的所有公共方法生成单元测试,只需右键单击类而不是特定方法,然后选择 “运行 IntelliTest”。 使用 “浏览结果 ”窗口中的下拉列表显示类中每个方法的单元测试和输入数据。

查看列表中的测试结果的屏幕截图。

测试结果列表界面的屏幕截图。

对于通过的测试,请检查结果列中报告的结果是否符合代码的预期。 对于失败的测试,请根据需要修复代码。 然后重新运行 IntelliTest 以验证修补程序。

持久保存:将单元测试另存为回归套件

  1. 选择您希望与参数化单元测试一起保存到测试项目中的数据行。

    保存测试结果的屏幕截图。

    保存测试结果的屏幕截图。

    可以查看已创建的测试项目和参数化单元测试 - 与每行对应的单个单元测试保存在测试项目中 的.g.cs 文件中,参数化单元测试将保存在其相应的 .cs 文件中。 可以运行单元测试并从测试资源管理器查看结果,就像手动创建的任何单元测试一样。

    解决方案资源管理器中保存的测试的屏幕截图。

    解决方案资源管理器中保存的测试的屏幕截图。

    必要的引用也会被添加到测试项目中。

    如果方法代码发生更改,请重新运行 IntelliTest 以使单元测试与更改保持同步。

协助:使用 IntelliTest 专注于代码浏览

  1. 如果有更复杂的代码,IntelliTest 可帮助你集中探索代码。 例如,如果有一个方法具有接口作为参数,并且有多个实现该接口的类,IntelliTest 将发现这些类并报告警告。

    查看警告以决定你想执行什么操作。

    查看警告的屏幕截图。

    查看警告的屏幕截图。

  2. 调查代码并了解要测试的内容后,可以修复警告以选择要用于测试接口的类。

    修复警告的屏幕截图。

    修复警告的屏幕截图。

    此选项将添加到 PexAssemblyInfo.cs 文件中。

    [assembly: PexUseType(typeof(Camera))]

  3. 现在,可以使用修复的类重新运行 IntelliTest 以生成参数化单元测试和测试数据。

    修复后重新运行 IntelliTest 的屏幕截图。

    修复后重新运行 IntelliTest 的屏幕截图。

指定:使用 IntelliTest 验证在代码中指定的正确性属性

指定要生成的单元测试验证的输入和输出之间的常规关系。 此规范封装在类似于测试方法但具有普遍量化的方法中。 这是参数化单元测试方法,你所做的任何断言都必须保留 IntelliTest 可以生成的所有可能输入值。

问题解答

问:是否可以将 IntelliTest 用于非托管代码?

A: 否,IntelliTest 仅适用于托管代码。

问:生成的测试何时通过或失败?

A: 如果没有发生异常,它会像任何其他单元测试一样通过。 如果任何断言失败,或者测试中的代码引发未经处理的异常,则失败。

如果你有一个测试,可以在引发某些异常时通过,则可以根据测试方法、测试类或程序集级别的要求设置以下属性之一:

  • PexAllowedExceptionAttribute

  • PexAllowedExceptionFromTypeAttribute

  • PexAllowedExceptionFromTypeUnderTestAttribute

  • PexAllowedExceptionFromAssemblyAttribute

问:是否可以向参数化单元测试添加假设?

A: 是的,使用假设条件指定某个方法的单元测试不需要哪些测试数据。 使用 PexAssume 类添加假设。 例如,可以添加一个假设,即 lengths 变量不为 null,如下所示:

PexAssume.IsNotNull(lengths);

如果添加假设并重新运行 IntelliTest,将不再相关的测试数据将被删除。

问:是否可以向参数化单元测试添加断言?

一个: 是的,IntelliTest 会在运行单元测试时检查你在语句中断言的内容是否确实正确。 使用测试框架附带的 PexAssert 类或断言 API 添加断言。 例如,可以添加两个变量相等的断言。

PexAssert.AreEqual(a, b);

如果添加断言并重新运行 IntelliTest,它将检查断言是否有效,如果不是,测试将失败。

问:是否可以在不先运行 IntelliTest 的情况下生成参数化单元测试?

一个: 是,右键单击类或方法,然后选择 “创建 IntelliTest”。

创建 IntelliTest 的屏幕截图。

创建 IntelliTest 的屏幕截图。

接受默认格式以生成测试,或更改项目和测试的命名方式。 可以创建新的测试项目或将测试保存到现有项目。

使用 MSTest 默认值创建 IntelliTest 的屏幕截图。

使用 MSTest 默认值创建 IntelliTest 的屏幕截图。

问:是否可以将其他单元测试框架用于 IntelliTest?

一个: 是的,请按照以下步骤 查找并安装其他框架。 Visual Studio Marketplace 中也提供了测试框架扩展,例如 NUnit 测试生成器

重启 Visual Studio 并重新打开解决方案后,右键单击类或方法,然后选择 “创建 IntelliTest”。 在此处选择已安装的框架:

IntelliTest 中选择其他单元测试框架时的屏幕截图。

IntelliTest中选择其他单元测试框架的屏幕截图。

然后运行 IntelliTest,在其相应的 .g.cs 文件中生成单个单元测试。

问:能否详细了解如何生成测试?

一个: 是的,若要获得高级别概述,请阅读此 博客文章