4

データソースを使用して、SOAP要求を送信し、SOAP応答を返すテストステップを実行しています。

応答を検証するとき、フィールドの1つに値(文字列)があることを期待することもあれば、値に初期化されないこと(つまり、<message/>の代わりに<message></message>)を期待することもあります。VSとExcel(私のデータソース)の空のフィールドを比較するときと<message/>何か違いがあるかどうかは、正直にわかりません。<message></message>私が知っているのは、soapUIは空のExcelフィールドをと比較するのが好きではないということだけ<message/>です。

両方のケースをアサートできるほどインテリジェントなアサーションを設定したいと思います。空の結果が予想される場合は、フィールドが空である必要があるとアサートされます。文字列が必要な場合は、文字列がそこにあるとアサートされます。

soapUI Proのデフォルト機能は、空の期待される結果(Excelスプレッドシートから読み込まれる)を空のフィールド(つまり、値がまったくないフィールド)と比較すると機能しないようです。


機能テストの例:

アカウントを作成するAPIをテストしています。そこで、データを入力してアカウントを作成します。

<username>username</username>
<password>password</password>

それから、私は次の応答を期待しています:

<code>0</code>
<resultMessage>Created successfully!</resultMessage>

私のデータソース(Excelスプレッドシート)には次の情報があります:(最初の2つのフィールドが入力され、次の2つは期待される結果です)

ユーザー名、パスワード、0、正常に作成されました!

したがって、soapUIは適切なフィールドを比較し、正常に機能します。

壊れたテストの例:

ここで、アカウントが作成されていないときに何が起こるかをテストしたいとします。

<username>bad username</username>
<password>bad password</password>

それから、私は次の応答を受け取ります:

<code>-1</code>
<resultMessage/>

私のデータソース(Excelスプレッドシート)には次の情報があります:(最初の2つのフィールドが入力され、次の2つは期待される結果であり、4番目のフィールドは空です

悪いユーザー名、悪いパスワード、-1

したがって、今回は、と比較するための空の値があります<resultMessage/>。唯一のことは、2つの空のフィールドを適切に比較しないことです。

次のエラーが表示されます。

[Match content of [resultMessage]] XPathContains assertion failed for path [declare namespace ns1='http://website.com/Account/'; //ns1:CreateAccountResponse[1]/resultMessage[1]/text()] : Exception:Missing content for xpath[declare namespace ns1='http://website.com/Account/'; //ns1:CreateAccountResponse[1]/resultMessage[1]/text)()] in Response

私はGroovyに不慣れで、soapUIに不慣れであり、ノードの概念に不慣れです(そして気づいていません)。

問題を解決するためのスクリプトを書くと思いました。スクリプトは、期待される結果が空でないことを確認してから、期待される結果と比較<resultMessage>します。

期待される結果が空の場合の対処方法については、何も書いていません。

import com.eviware.soapui.support.XmlHolder

def holder = new XmlHolder( messageExchange.responseContentAsXml )
holder.namespaces["ns1"] = "http://website.com/Account/"
def node = holder.getDomNode( "//ns1:CreateAccountResponse[1]/resultMessage[1]" )
def expectedResultMessage = context.expand( '${CreateAccount DataSource#resultMessage}' )

if (expectedResultMessage != null)
 assert node == expectedResultMessage

ノードとGroovyを初めて使用するnodeため、の値をの値と適切に比較しているかどうかはわかりませんexpectedResultMessage。または、VSをチェックして比較する適切な方法がある場合は、それ自体を閉じるフィールド(つまり<resultmessage/>)。

このスクリプトを実行すると、次の結果が得られます。

[Assert node [resultMessage]] assert node == resultMessage |  |    | |    | null   | ""  |  false <?xml version ="1.0" encoding="UTF-8"?> <resultMessage xmlns:ns1="http://website.com/Account/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"/>

おそらくそれを設定するだけなので、応答はではなく単に返されます<resultMessage></resultMessage><resultMessage/>、回避策を作成するのではなく、後者に対処する方法があると思います。

うまくいけば、これはそれほど長くはありませんでした、そしてうまくいけば、それは幾分明確でした!どんな助けでもいただければ幸いです!:)

4

2 に答える 2

3

この回答は非常に遅いですが、stackoverflow を捨てることが重要だと感じました。ここに書かれている concat() ハックを使用します。これを使用してみてください:

concat(//myxpath/text(),"")

したがって、データ シートでは、null フィールドの値が空白になります。Concat は文字列を連結します。したがって、シートにデータがある場合、既存の文字列には何も追加されません。値が null の場合、soapUI は代わりに空の値に一致するように変換します。

于 2013-10-12T03:57:12.687 に答える
1

Xmlを操作するXmlSlurper代わりに使用することをお勧めします。応答メッセージからXmlHolder取得するためのスニペットを次に示します。resultMessage

def doc = new XmlSlurper().parse(messageExchange.responseContentAsXml)
def value = doc.resultMessage

value空の要素の値は、この場合、アサーションで機能する空の文字列と同じです。

于 2012-07-23T16:15:32.497 に答える