本主题介绍如何配置单元测试助手。

章节目录:

配置常规选项

选择 Parasoft> 首选项> 单元测试助手可以配置 UTA 常规选项。

测试源文件夹

使用此选项可以指定保存通过 UTA 创建的测试的根目录。默认情况下选择“[基于项目配置]”选项,该选项将读取项目的设置以明确测试应该保存在哪里。如果项目没有指定测试所在的位置,则需更新项目配置以指定测试源文件夹,切换至一个预定义模式,或者使用以下变量手动创建模式:

${project_name} - 包含被测类的项目(IntelliJ 的模块)的名称。
${source_folder} - 包含项目源文件的文件夹的名称。

测试类名称模式

使用此选项可以为测试指定包和类名模式。默认模式“${package_name}.${class_name}${test_kind}Test”会将测试放在与被测类相同的包中,并在类名中添加“${test_kind}test”后缀。还可以使用以下变量指定自定义模式:

${class_name} - 被测类的名称。
${package_name} - 包含被测试类的包的名称。
${test_kind} - 测试类型的名称,将添加到文件名中。该变量可以取以下值:
          - Spring - 在 JUnit 4 和 5 中将 Spring 测试与其他测试分开。
          - Parameterized - 在 JUnit 4 中将参数化测试与常规测试分开。在 JUnit 5 中,常规测试用例和参数化测试用例被添加到同一个文件中。

对于非 Spring 测试或非参数化测试,${test_kind} 变量会解析为空字符串。

新测试的测试框架

使用此选项可以指定 UTA 用于创建新测试的测试框架。可以选择 JUnit 4JUnit 5

测试创建选项

为 private 方法创建测试

使用此选项可以为私有方法创建单元测试。启用后:

  • 在编辑器中选择私有方法时,单元测试助手视图会显示能够为私有方法创建单元测试的操作链接(请参阅为私有方法创建测试)。
  • 如果使用创建测试套件选项为某个类创建测试,则可以在对话框中选择私有方法(请参阅为单个文件创建测试套件)。
  • 如果使用创建测试套件选项为多个类创建测试,则会自动为私有方法创建测试(请参阅为多个文件创建测试套件)。

配置测试的超时 (单位: ms)

此选项允许为使用创建单元测试选项创建的测试套件指定执行时间限制(以毫秒为单位)。如果超过该时间限制,测试执行将会停止,测试套件将会失败,错误相关的信息将作为建议显示在 UTA 界面中。请参阅创建测试套件

生成样本断言

启用此选项后,UTA 在创建基本测试用例时会自动将断言模板作为注释生成到代码中。详细信息,请参阅创建基本单元测试

当使用创建测试套件选项创建测试套件时,此选项不适用。

只添加增加覆盖率的测试用例

启用此选项后,在批量创建期间仅添加增加覆盖率的测试用例(请参阅为多个文件创建测试套件)。

使用 AI 修复失败的生成测试 (需要配置 LLM 提供者)

此选项允许使用 AI 优化 UTA 通过创建测试套件选项生成的失败测试。(UTA 可能会创建一定数量的失败测试,这些测试虽然失败了,但仍能提供一些覆盖率。在此步骤中,UTA 能利用 AI 更新失败的测试,使其通过。)要使用该功能,必须先在 Parasoft 首选项中配置 LLM 提供者(请参阅配置 LLM 提供者设置)。

此功能依赖于 LLM,生成的信息可能不准确。

工厂方法选项

自动发现标记的工厂方法

启用此选项后,UTA 将会:

  • 在 IDE 启动时扫描所有项目中的工厂方法。
  • 在项目被修改时(例如创建或删除 Java 文件或项目时)搜索工厂方法的更新情况。

详细信息,请参阅配置工厂方法。 

参数化测试

启用创建操作

启用此选项后,UTA 将显示用于创建参数化测试用例的操作链接。请参阅创建参数化单元测试

参数化测试依赖于您在新测试的测试框架选项下配置的测试框架:

  • 对于 JUnit 5,自动启用 JUnit 5 Parameterized。
  • 对于 JUnit 4,需要选择用于创建参数化测试用例的框架。

当使用创建测试套件选项创建测试套件时,此选项不适用。

高级设置

在高级设置中可以配置用于创建参数化测试用例的输入数据。

为一个测试用例创建的最大参数集数量 

此选项指定为一个测试用例创建的包含参数变体的最大行数。

生成测试数据到

此选项指定测试用例的保存位置。可以从下拉菜单中选择 Code(默认)或 CSV

关于 CSV

  • JUnitParams 和 JUnit 5 Parameterized 测试类型支持 CSV 格式。
  • CSV 支持 UTF-8 字符编码。
  • CSV 文件与 Java 文件保存在同一个文件夹中。如果位置与构建系统指定的资源文件夹不匹配,需将 CSV 文件复制到适当的位置。

参数化值

这组选项允许通过从选择类型下拉菜单中选择数据类型,并添加、编辑或删除列表中的值,来自定义默认值列表。通过查找字段可以轻松找到某个特定值。

字符编码

添加新值时,字符必须与用于保存文件的字符编码匹配,从而确保文件正确生成。 

Spring 框架测试

启用创建操作

启用此选项后,UTA 将显示用于创建 Spring 测试用例的操作链接。请参阅创建 Spring 单元测试

当使用创建测试套件选项创建测试套件时,此选项不适用。

默认的 ContextConfiguration 属性

此选项用于指定创建 Spring 测试时要包含在 ContextConfiguration 注解中的属性。请参阅使用 ContextConfiguration 注解配置 Spring 测试

配置执行监控器选项

配置 UTA 执行监控器选项可以指定在测试执行期间收集数据的限制。此外,为了防止超出限制,您可以指定在使用 UTA 执行测试时不进行监控的包和类。

选择 Parasoft> 首选项> 单元测试助手> 执行监控器可以配置 UTA 的执行监控器选项。

排除的包和类

此选项用于指定要从监控器中排除的包和类的列表。点击新建并提供相应包或类的限定名称(不支持通配符)。

执行流程数据收集限制

这一组选项可以指定在执行期间收集数据的限制:

  • 最大的方法调用深度 - 指定分析期间方法调用的最大深度。
  • 单个方法的最大方法调用次数 - 指定单个方法中子方法的最大调用次数。
  • 方法调用的最大总数 - 指定分析期间所有方法调用的最大次数。

配置模拟选项

选择 Parasoft> 首选项> 单元测试助手> 模拟可以配置 UTA 的模拟选项。

启用

此选项在测试创建期间启用或禁用模拟对象,以及在测试执行后显示模拟建议。

为模拟使用辅助方法

此选项用于启用或禁用使用辅助方法。启用后,生成的测试类将把常规测试方法与用于准备对象但不进行断言的辅助方法分开。 

启用静态方法和构造函数模拟 (需要 Mockito inline 3.5 以上)

信息

从 2022.1 版本开始,静态方法和构造函数模拟使用 Mockito 创建。要使用此功能,您需要更新项目,以包含支持静态方法和构造函数模拟的 Mockito 版本。如果您想继续将 Powermock 和 Mockito 用于手写模拟,推荐使用 Mockito 的 3.12.4 版本。任何使用 PowerMock 并在 2022.1 版本之前通过 Jtest 或手动创建的测试都可能需要更新,以避免测试失败;请参阅使用 mockito-inline 运行 PowerMock 时测试失败该怎么办?

此选项用于启用或禁用静态方法和构造函数模拟。启用后,UTA 会自动为所有必需的可模拟静态方法和/或构造函数创建模拟。UTA 将在测试创建期间自动将静态模拟添加到测试用例中,或者在测试运行后显示能够帮助您添加模拟的建议(请参阅创建模拟)。mockStatic() 方法将用于模拟类的静态方法。有关 mockStatic() 方法的详细信息,请参阅 mockStatic

启用此选项后,批量创建时间可能会增加,覆盖率结果将取决于您的具体项目。

要从静态模拟中排除某些方法和/或构造函数,可将它们添加到要从静态模拟中排除的方法和构造函数表中。如果需要 UTA 模拟特定的已排除方法和/或构造函数,则将它们添加到要包含的静态方法和构造函数 (覆盖排除项) 表中。之后,UTA 将会模拟与表中指定模式匹配的方法。

点击新建添加新方法或模式。使用限定方法名和通配符(*)来匹配模式。以 .*<init> 结尾的模式将与构造函数匹配。

在以下示例中,将从模拟中排除以下配置:

  • 名称以“Service”结尾的所有类中的所有构造函数。
  • “com.example”的所有子包中 DAO 类的所有静态方法和构造函数。
  • InternalUtil 类的所有方法。

但是,examples.powermock.InternalUtil.createConnection 方法仍然会被模拟。

配置建议

您可以指定 UTA 在测试执行后显示的建议类型。

选择 Parasoft> 首选项> 单元测试助手 > 建议可以配置 UTA 建议选项。

您可以启用或禁用以下建议类型:

  • 额外的线程 - 检测可能影响测试状态的子线程。
  • 无法访问的字段的断言 - 检测在执行过程中被修改的无法访问的字段,并生成断言模板。
  • 创建的文件 - 检测在测试运行期间创建但在执行后未删除的文件。
  • 可模拟调用 - 检测对可修改的模拟对象的调用,以确保正确的测试隔离。
  • 可模拟的静态调用 (要求启用静态模拟) - 根据在配置模拟选项中指定的配置,检测对可模拟静态方法或构造函数的调用
  • 没有断言 - 检测没有做出断言的情况。
  • 潜在设置问题 - 识别存在共同的异常或问题的批量测试失败的根本原因,指示项目中可能存在的设置问题。 
  • 改变的静态字段 - 检测测试执行期间静态字段被修改的情况。
  • 系统属性发生变化 - 检测在测试运行期间被修改但在执行后未恢复的系统属性。
  • 未覆盖的代码 - 检测未覆盖的代码块。

有关 UTA 显示的建议示例,请参阅使用单元测试助手执行单元测试

配置测试模板

您可以使用测试模板控制测试类的结构,以指定特定测试所需的通用配置。例如,您可以添加设置方法或从基类继承。 

如果测试模板引发编译错误,则可能不会生成测试。控制台中将显示一条消息,指示生成文件中的错误。

选择 Parasoft> 首选项> 单元测试助手 > 测试模板可以配置 UTA 测试模板选项。

  • 新建 - 创建新模板并打开模板进行编辑。自动提供 Parasoft 默认模板。
  • 编辑 - 打开模板进行编辑。
  • 删除 - 删除模板。尝试删除活动模板或最后一个模板时会出现错误提示。
  • 标记活动 - 用于指定将哪个模板用于快速添加操作(非批量创建)。

编辑模板

编辑模板对话框用于创建/编辑模板。

必须在编辑模板对话框中配置以下内容:

  • 模板名称 - 模板的名称(唯一)。
  • 类模板 - 模板中类部分的源代码。在输入过程中会执行基础验证,以检查模板中的错误:
    • 如果变量格式错误或无法识别,则会显示一条错误消息(“未知或无效的变量”)。 
    • 如果模板未通过基本语法检查,则会显示错误。 

可以识别以下变量:

    • ${className} - 被测类的非限定名称,例如:MyClass
    • ${qualifiedClassName} - 被测类的完全限定名称,例如:com.company.MyClass
    • ${author} - DTP 设置中指定的用户名。
    • ${testClassName} - 创建的类的非限定名称,例如:MyClassTest
      该名称通过测试类名称模式生成并且应在模板中更改。更新测试类名称的标准做法是更新测试源文件夹

以下示例展示了常见类配置的实现。

常见基类继承:

import com.company.BaseTestClass;

public class ${testClassName} extends BaseTestClass
{
}

为静态模拟添加 setup/teardown 方法:

import org.junit.jupiter.api.*;
import static org.mockito.Mockito.*;
import java.util.*;

public class ${testClassName}
{
    Set<ScopedMock> staticMocks = new HashSet<>();

    @BeforeEach
    public void setup()
    {
        var mocked = mockStatic(MyUtilClass.class);
        staticMocks.add(mocked);
        mockUtil.when(MyUtilClass::getUserName).thenReturn("testUser");
    }

    @AfterEach
    public void teardown()
    {
        staticMocks.forEach(i -> i.close());
        staticMocks.clear();
    }
}
  • 方法模板 - 新测试方法的源代码。在输入过程中会执行基础验证,以检查模板中的错误:
    • 如果变量格式错误或无法识别,或者缺少所需变量,则会显示一条错误信息(“未知或无效的变量”或“方法中缺少所需变量”)。 
    • 如果模板未通过基本语法检查,则会显示错误。 

可以识别以下变量:

    • ${methodSignature} - 被测方法的名称,包括参数类型。例如:calc(int, int, String)
    • ${qualifiedMethodSignature} - 被测方法的完全限定名称,包括参数类型。例如:com.company.MyClass#calc(int, int, String)
      此变量适合在 Javadoc 的 @see 标签中使用。

    • ${author} - DTP 设置中指定的用户名。

    • ${testAnnotations}(必填)- 要添加到测试方法中的自动生成注解的占位符。例如,JUnit 测试需要 @Test 注解。可以在此变量之前或之后添加自定义注解。

    • ${testName}(必填)- 自动生成的测试方法名称。

    • ${testBody}(必填)- 用于自动生成语句的占位符,构成测试的主体部分。可以在此变量之前或之后添加自定义代码,以包含在所有生成的测试中。

  • 可以在测试方法之外添加额外的代码,但由于会导致重复,因此不建议这样做。例如,如果将“int foo=0;”字段添加到方法模板中,会为每个测试都添加该字段,并且名称重复。因此,建议要么在添加元素的名称中包含 ${testName} 变量,或者改为将代码添加到类模板中。

以下示例展示了一个定义和配置字段的类和方法模板。

类模板

public class ${testClassName}
{
    private CustomField customField = null;
} 

方法模板

${testAnnotations}
public void ${testName}() throws Exception
{
    customField = new CustomField(42, "Testing example");
    customField.init();

    ${testBody}
} 



  • No labels