第 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 规则都定义为包含一个或多个 rulesets
的 rulesets
规则集中的一个元素。如需了解更多详细信息,请参阅 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 | 字符串 |
要搜索的 |
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 | 字符串 |
要搜索的 |
in | 字符串 |
可选参数限制与引用所给文件名的 |
4.1.2.5. <fail> 语法
<fail>
元素将执行报告为失败,并显示相关的消息。通常与 <not>
条件一起使用,仅在不满足条件时才显示消息。
<fail>
元素没有唯一的子元素。
<fail> 元素属性
属性名称 | 类型 | 描述 |
---|---|---|
message | 字符串 | 要显示的消息。 |