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 浏览代码并生成单元测试
若要生成单元测试,类型必须为公共类型。
在 Visual Studio 中打开解决方案,然后打开包含要测试的方法的类文件。
右键单击某个方法,然后选择 “运行 IntelliTest ”,为方法中的代码生成单元测试。
IntelliTest 使用不同的输入多次运行代码。 表格中显示每次运行的输入测试数据及其对应的输出或异常情况。
若要为类中的所有公共方法生成单元测试,只需右键单击类而不是特定方法,然后选择 “运行 IntelliTest”。 使用 “浏览结果 ”窗口中的下拉列表显示类中每个方法的单元测试和输入数据。
对于通过的测试,请检查结果列中报告的结果是否符合代码的预期。 对于失败的测试,请根据需要修复代码。 然后重新运行 IntelliTest 以验证修补程序。
持久保存:将单元测试另存为回归套件
选择您希望与参数化单元测试一起保存到测试项目中的数据行。
可以查看已创建的测试项目和参数化单元测试 - 与每行对应的单个单元测试保存在测试项目中 的.g.cs 文件中,参数化单元测试将保存在其相应的 .cs 文件中。 可以运行单元测试并从测试资源管理器查看结果,就像手动创建的任何单元测试一样。
必要的引用也会被添加到测试项目中。
如果方法代码发生更改,请重新运行 IntelliTest 以使单元测试与更改保持同步。
协助:使用 IntelliTest 专注于代码浏览
如果有更复杂的代码,IntelliTest 可帮助你集中探索代码。 例如,如果有一个方法具有接口作为参数,并且有多个实现该接口的类,IntelliTest 将发现这些类并报告警告。
查看警告以决定你想执行什么操作。
调查代码并了解要测试的内容后,可以修复警告以选择要用于测试接口的类。
此选项将添加到 PexAssemblyInfo.cs 文件中。
[assembly: PexUseType(typeof(Camera))]现在,可以使用修复的类重新运行 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?
一个: 是的,请按照以下步骤 查找并安装其他框架。 Visual Studio Marketplace 中也提供了测试框架扩展,例如 NUnit 测试生成器。
重启 Visual Studio 并重新打开解决方案后,右键单击类或方法,然后选择 “创建 IntelliTest”。 在此处选择已安装的框架:
IntelliTest 中选择其他单元测试框架时的屏幕截图。
然后运行 IntelliTest,在其相应的 .g.cs 文件中生成单个单元测试。
问:能否详细了解如何生成测试?
一个: 是的,若要获得高级别概述,请阅读此 博客文章。