com.intuit.karate.exception.KarateException: 原因:不是子串

com.intuit.karate.exception.KarateException: reason: not a sub-string

我使用 Karate 框架 V 0.7.0 执行一些自动 API 测试。

我在以下场景中进行了一项测试,return 一个异常 com.intuit.karate.exception.KarateException:原因:不是子字符串

场景如下:

Scenario Outline: Put a number, and check the JSON response body.

Given path '/number/check/'
And param serial = '<number>'
When method GET
Then status 200
And match $ contains {"uid":"#uuid","reference":"#notnull","type":"#notnull","name":"#notnull","description":"#notnull","imageUrl":"#notnull","color":"<color>","reason":"<reason>"}

Examples:

  | number | color | reason |
  # Case 1
  |  1234 | RED   | INITIAL_WARRANTY_EXPIRED                  |
  # Case 2
  |  5678 | RED   | INELIGIBLE_PRODUCT_FAMILY                 |
  # Case 3
  |  9012 | RED   | ALREADY_EXTENDED                          |

案例 1 和案例 2 正确通过。

案例3return如下:

StackTrace:
com.intuit.karate.exception.KarateException: path: $, actual: '[{"uid":"2cd897fd-1421-4c02-b594-6ee0de38db3d","reference":"a random reference","type":"a random type","name":"a random name","description":"a random description","imageUrl":"a random image url","color":"RED","reason":"ALREADY_EXTENDED"}]', expected: '{"uid":"#uuid","reference":"#notnull","type":"#notnull","name":"#notnull","description":"#notnull","imageUrl":"#notnull","color":"RED","reason":"ALREADY_EXTENDED"}', reason: not a sub-string

at com.intuit.karate.StepDefs.matchNamed(StepDefs.java:540)

at com.intuit.karate.StepDefs.matchContains(StepDefs.java:532)

at ✽.And match $ contains {"uid":"#uuid","reference":"#notnull","type":"#notnull","name":"#notnull","description":"#notnull","imageUrl":"#notnull","color":"RED","reason":"ALREADY_EXTENDED"}

我已经手动检查,这是案例 3 的 JSON 答案

[{"uid":"2cd897fd-1421-4c02-b594-6ee0de38db3d","reference":"a random reference","type":"a random type","name":"a random name","description":"a random description","imageUrl":"a random image url","color":"RED","reason":"ALREADY_EXTENDED"}]

我不明白为什么只有案例3失败了。

有什么想法吗?

非常感谢!

编辑 1:“"reference" 是一个错误的复制粘贴。很抱歉。

更新:

经过调查,完全相同的测试 运行 在由 JUnit 启动时运行良好,但通过使用 Maven 启动时运行良好。是编码问题。

解决方法:使用Surefire插件强制编码:

<argLine>-Dfile.encoding=UTF-8</argLine>

在pom.xml中是这样的:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.10</version>
    <configuration>
        <includes>
            <include>api/TestParallel.java</include>
        </includes>
        <systemProperties>
             <cucumber.options>--tags ~@ignore</cucumber.options>
        </systemProperties>
        <argLine>${argLine} -Dfile.encoding=${project.build.sourceEncoding}</argLine>
     <configuration>
</plugin>

文档在这里: https://github.com/intuit/karate/tree/master#troubleshooting-cucumber-ide-support -> file.encoding.

重要提示: 如果您 运行 并行测试,并且您使用以下方式切换环境:

mvn clean test -DargLine="-Dkarate.env=YOUR_ENV"

使用语法很重要...

<argLine>${argLine} -Dfile.encoding=${project.build.sourceEncoding}</argLine>

...而不仅仅是...

<argLine>-Dfile.encoding=${project.build.sourceEncoding}</argLine>

否则,Maven -DargLine 将被 覆盖 被 POM.xml.