Утверждение SOAPUI xpath, где идентификатор изменяется в теге

У меня есть сообщение об ошибке, для которого я хочу использовать утверждение xpath для подтверждения. Проблема заключается в том, что идентификатор транзакции изменяется (генерируется системой), в то время как остальная информация в iongt:faultstring остается неизменной.

Есть ли простой способ сделать это утверждение?

<iongt:retrieveSystemInformationFault xmlns:iongt="http://www.testing.com/xml/TestingIONGT">
      <iongt:faultcode>TestError012</iongt:faultcode>
      <iongt:faultstring>Transaction Id: 8781991797:
Testing error message here</iongt:faultstring>
    </iongt:retrieveCustomerInformationFault>

Использование '*' не работает:

<iongt:retrieveSystemInformationFault xmlns:iongt="http://www.testing.com/xml/TestingIONGT">
      <iongt:faultcode>TestError012</iongt:faultcode>
      <iongt:faultstring>Transaction Id: *:
Testing error message here</iongt:faultstring>
    </iongt:retrieveCustomerInformationFault>

person automationguy    schedule 10.10.2012    source источник
comment
Пожалуйста, покажите XPath, который вы пробовали. Пожалуйста, также опишите не работает; что он на самом деле сделал, и как это отличается от того, что вы ожидали? В-третьих: я предполагаю, что XML, который вы показываете, является сообщением об ошибке, для которого вы пытаетесь запустить утверждение XPath? Если да, то я не понимаю смысла менять его, чтобы поставить в нем звездочку.   -  person LarsH    schedule 10.10.2012
comment
Привет, поскольку идентификатор транзакции меняется (число, сгенерированное системой), утверждение xpath терпит неудачу, поскольку записанное не соответствует полученному. Я попытался использовать * и подстановочный знак для идентификатора транзакции, но это не работает, поскольку утверждение xpath пытается буквально проверить идентификатор транзакции: * Здесь сообщение об ошибке тестирования. Если я использую подстановочный знак для всего тега, это работает, например. ‹iongt:faultstring›*‹/iongt:faultstring›   -  person automationguy    schedule 11.10.2012
comment
Извините, мне до сих пор не ясно: какие фрагменты XML вы опубликовали - это сообщение об ошибке XML, которое вы пытаетесь сопоставить, или они содержат утверждение XPath? Они выглядят как первые, но если да, покажите нам XPath.   -  person LarsH    schedule 11.10.2012
comment
Первая партия XML в моем исходном посте — это то, что я получаю, когда запускаю свой запрос. Второй лот — это мои усилия по настройке утверждения XPATH MATCH. Я использую *, чтобы попытаться обработать сгенерированное системой значение идентификатора транзакции.   -  person automationguy    schedule 12.10.2012
comment
Спасибо, что разъяснили это. Меня все еще очень смущает тот факт, что ваш второй фрагмент выглядит как XML, но вы говорите, что это утверждение соответствия XPath. Может быть, это просто мое незнание SOAPUI. А... Бьюсь об заклад, ваш второй фрагмент на самом деле является ожидаемым результатом (soapui.org/Functional-Testing/), а не само выражение XPath. Теперь я начинаю понимать...   -  person LarsH    schedule 12.10.2012
comment
В таком случае, пожалуйста, покажите нам свое выражение XPath... то, что у вас есть в верхнем текстовом поле в диалоговом окне конфигурации XPath Match. Кроме того, я предполагаю, что у вас установлен флажок Разрешить подстановочные знаки. В конечном счете, я подозреваю, что ответ заключается в том, что подстановочные знаки SoapUI XPath Match Expected Result должны соответствовать целым текстовым узлам, а не их части. Вы можете преодолеть это, но это будет скорее ответ, чем комментарий. И это все равно поможет, если вы покажете свое выражение XPath.   -  person LarsH    schedule 12.10.2012


Ответы (1)


Я подозреваю, что подстановочные знаки SoapUI XPath Match Expected Result должны соответствовать целым текстовым узлам, а не их части.

Конечно, вы можете просто утверждать на менее точном уровне, используя звездочку для всего текстового содержимого в ожидаемом результате (как вы упомянули, что это работает):

<iongt:faultstring>*</iongt:faultstring>

Но если вам нужно быть более точным, вы также можете изменить свое выражение XPath следующим образом. Вместо того, чтобы просто

//iongt:retrieveSystemInformationFault

например, у вас может быть это выражение XPath:

//iongt:retrieveSystemInformationFault/iongt:faultcode

с ожидаемым результатом

<iongt:faultcode xmlns:iongt="http://www.testing.com/xml/TestingIONGT">TestError012</iongt:faultcode>

и еще одно утверждение с выражением XPath

//iongt:retrieveSystemInformationFault/iongt:faultstring[starts-with(., 'Transaction Id: ') and
   contains(., 'Testing error message here')]

Я предлагаю здесь contains(), потому что в XPath 1.0 нет ends-with(). Если вам действительно нужна точность, вместо contains() вы можете заменить эквивалент ends-with(), используя string-length() и substring(), но я сомневаюсь, что такой уровень усилий необходим.

Ожидаемый результат для вышеизложенного будет просто

<iongt:faultstring xmlns:iongt="http://www.testing.com/xml/TestingIONGT">*</iongt:faultstring>

Или вы можете объединить два утверждения в одно... дайте мне знать, если вы хотите увидеть пример этого.

person LarsH    schedule 12.10.2012