第 4 章 测试 XML 规则


创建 XML 规则后,您应该创建一个测试规则以确保它可以正常工作。

4.1. 创建测试规则

使用与创建测试规则的过程类似的进程创建测试规则,但有以下区别:

  • 测试规则应当放在要测试的规则下的 test/ 目录中。
  • 测试类等任何数据都应放在 tests/ 目录下的 data/ 目录中。
  • 测试规则应使用 .windup.test.xml 扩展。
  • 这些规则使用 Test XML 规则结构中定义的结构。

另外,建议您创建一个遵循它测试的规则名称的测试规则。例如,如果创建了一个规则,其文件名为 proprietary-rule.mtr.xml,则测试规则应称为 proprietary-rule.windup.test.xml

4.1.1. 测试 XML 规则结构

所有测试 XML 规则都定义为包含一个或多个 rulesetsrulesets 规则集中的一个元素。如需了解更多详细信息,请参阅 MTR XML 规则模式

规则测试是针对特定迁移区域的一个或多个测试组。这是 <ruletest> 元素的基本结构。

  • <ruletest id="<RULE_TOPIC>-test">: 定义它作为唯一 MTR ruletest,并将其指定为唯一的 ruletest id。

    • <testDataPath>:定义用于测试的所有数据的路径,如类或文件。
    • <sourceMode> : 指定传递的数据是否只包括源文件。如果存档(如 EAR、WAR 或 JAR)正在使用,则这应设置为 false。默认值为 true
    • <rulePath> : 要测试的规则的路径。这应该以要测试的规则的名称结尾。
    • <ruleset>: Rulesets 包括测试的逻辑。它们与 Rulesets 中定义的相同。

4.1.2. XML 规则语法

除了标准 XML 规则语法中的标签外,when 条件通常用于创建测试规则时:

  • <not>
  • <iterable-filter>
  • <classification-exists>
  • <hint-exists>

除了标准 perform action 语法中的标签外,以下 when 条件通常用于测试规则中的操作:

  • <fail>

4.1.2.1. <not> 语法

概述

<not> 元素是标准逻辑 not 操作符,如果不满足条件,通常用于执行 <fail>

以下是测试规则的一个示例,如果分析末尾只有特定消息,则会失败。

<ruletest xmlns="http://windup.jboss.org/schema/jboss-ruleset"
          id="proprietary-servlet-test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://windup.jboss.org/schema/jboss-ruleset http://windup.jboss.org/schema/jboss-ruleset/windup-jboss-ruleset.xsd">
  <testDataPath>data/</testDataPath>
  <rulePath>../proprietary-servlet.windup.xml</rulePath>
  <ruleset>
    <rules>
      <rule id="proprietary-servlet-01000-test">
        <when>
          <!--
	    The `<not>` will perform a logical _not_ operator on the elements within.
	  -->
          <not>
            <!--
	      The defined `<iterable-filter>` has a size of `1`. This rule will only match on a single instance of the defined hint.
	    -->
            <iterable-filter size="1">
              <hint-exists message="Replace the proprietary @ProprietaryServlet annotation with the Java EE 7 standard @WebServlet annotation*" />
            </iterable-filter>
          </not>
        </when>
        <!--
	  This `<perform>` element is only executed if the previous `<when>` condition is false.
          This ensures that it only executes if there is not a single instance of the defined hint.
        -->
        <perform>
          <fail message="Hint for @ProprietaryServlet was not found!" />
        </perform>
      </rule>
    </rules>
  </ruleset>
</ruletest>

<not> 元素没有唯一属性或子元素。

4.1.2.2. <iterable-filter> 语法

概述

<iterable-filter> 元素统计验证条件的次数。详情请参阅 IterableFilter 类。

下例中查找指定消息的四个实例:

<ruletest xmlns="http://windup.jboss.org/schema/jboss-ruleset"
          id="proprietary-servlet-test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://windup.jboss.org/schema/jboss-ruleset http://windup.jboss.org/schema/jboss-ruleset/windup-jboss-ruleset.xsd">
  <testDataPath>data/</testDataPath>
  <rulePath>../proprietary-servlet.mtr.xml</rulePath>
  <ruleset>
    <rules>
      <rule id="proprietary-servlet-03000-test">
        <when>
          <!--
	    The `<not>` will perform a logical _not_ operator on the elements within.
	  -->
          <not>
	    <!--
	      The defined `<iterable-filter>` has a size of `4`. This rule will only match on four instances of the defined hint.
	    -->
            <iterable-filter size="4">
              <hint-exists message="Replace the proprietary @ProprietaryInitParam annotation with the Java EE 7 standard @WebInitParam annotation*" />
            </iterable-filter>
          </not>
        </when>
	<!--
	  This `<perform>` element is only executed if the previous `<when>` condition is false.
	  In this configuration, it only executes if there are not four instances of the defined hint.
	-->
        <perform>
          <fail message="Hint for @ProprietaryInitParam was not found!" />
        </perform>
      </rule>
    </rules>
  </ruleset>
</ruletest>

<iterable-filter> 元素没有唯一的子元素。

<iterable-filter> 元素属性
属性名称类型描述

size

整数

验证的次数。

4.1.2.3. <classification-exists> 语法

<classification-exists> 元素决定分析中是否包含特定的分类标题。如需更多信息,请参阅 ClassificationExists 类。

重要

当测试包含特殊字符(如 [' )的消息时,您必须用反斜杠(\)进行转义来正确匹配。

以下是搜索特定分类标题的示例。

<ruletest xmlns="http://windup.jboss.org/schema/jboss-ruleset"
          id="proprietary-servlet-test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://windup.jboss.org/schema/jboss-ruleset http://windup.jboss.org/schema/jboss-ruleset/windup-jboss-ruleset.xsd">
  <testDataPath>data/</testDataPath>
  <rulePath>../weblogic.mtr.xml</rulePath>
  <ruleset>
    <rules>
      <rule id="weblogic-01000-test">
        <when>
          <!--
	    The `<not>` will perform a logical _not_ operator on the elements within.
	  -->
          <not>
	    <!--
	      The defined `<classification-exists>` is attempting to match on the defined title.
	      This classification would have been generated by a matching `<classification title="WebLogic scheduled job" .../>` rule.
	    -->
            <classification-exists classification="WebLogic scheduled job" />
          </not>
        </when>
	<!--
	  This `<perform>` element is only executed if the previous `<when>` condition is false.
	  In this configuration, it only executes if there is not a matching classification.
	-->
        <perform>
          <fail message="Triggerable not found" />
        </perform>
      </rule>
    </rules>
  </ruleset>
</ruletest>

<classification-exists> 没有唯一的子元素。

<has-classification> 元素属性
属性名称类型描述

classification

字符串

要搜索的 <classification> title

in

字符串

可选参数,限制对包含所定义文件名的文件的匹配。

4.1.2.4. <hint-exists> 语法

<hint-exists> 元素决定分析中是否包含特定的提示。它搜索已定义消息的任何实例,通常用于搜索 <message> 元素的开头或特定类。详情请参阅 HintExists 类。

重要

当测试包含特殊字符(如 [' )的消息时,您必须用反斜杠(\)进行转义来正确匹配。

以下是搜索特定提示的示例。

<ruletest xmlns="http://windup.jboss.org/schema/jboss-ruleset"
          id="proprietary-servlet-test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://windup.jboss.org/schema/jboss-ruleset http://windup.jboss.org/schema/jboss-ruleset/windup-jboss-ruleset.xsd">
  <testDataPath>data/</testDataPath>
  <rulePath>../weblogic.windup.xml</rulePath>
  <ruleset>
    <rules>
      <rule id="weblogic-eap7-05000-test">
        <when>
          <!--
	    The `<not>` will perform a logical _not_ operator on the elements within.
	  -->
          <not>
	    <!--
	      The defined `<hint-exists>` is attempting to match on the defined message.
	      This message would have been generated by a matching `<message>` element on the `<hint>` condition.
	    -->
            <hint-exists message="Replace with the Java EE standard method .*javax\.transaction\.TransactionManager\.resume\(Transaction tx\).*" />
          </not>
        </when>
	<!--
	  This `<perform>` element is only executed if the previous `<when>` condition is false.
	  In this configuration, it only executes if there is not a matching hint.
	-->
        <perform>
          <fail message="Note to replace with standard TransactionManager.resume is missing!" />
        </perform>
      </rule>
    </rules>
  </ruleset>
</ruletest>

<hint-exists> 元素没有唯一的子元素。

<hint-exists> 元素属性
属性名称类型描述

message

字符串

要搜索的 <hint> message

in

字符串

可选参数限制与引用所给文件名的 InLineHintModels 匹配。

4.1.2.5. <fail> 语法

<fail> 元素将执行报告为失败,并显示相关的消息。通常与 <not> 条件一起使用,仅在不满足条件时才显示消息。

<fail> 元素没有唯一的子元素。

<fail> 元素属性
属性名称类型描述

message

字符串

要显示的消息。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.