SoapUI-助けが必要
約半年前、彼らは私に、SOAPプロトコルを満たすサービスを積極的に使用するプロジェクトをテストする(同時に自動化する)ように指示しました。 SoapUIのようなクールなプログラムを見せてくれました。 これはなんて素晴らしいプログラムなのか、直感的なインターフェイスと直感的なオンラインヘルプ(soapui.org)がこの記事の範囲外になります。
残念ながら、そのすべてのメリットは、かなり狭く専門化されているため、おそらくロシア語でそれに関する資料が完全に不足しています。 英語の直感的なヘルプは、かなり複雑なタスクには役立ちません(ただし、始めるのは不可欠ですが)。すべてのインターネットでステップバイステップのマニュアルを見つけることは非常に困難です。
要するに!
今日は、特定のアプリケーションの問題、つまり、これらの要素のリストを返すサービスのテストの自動化を解決します。
<item>
<FeedbackId>357</FeedbackId>
<RequestDate>2012-04-08T00:48:49.493</RequestDate>
<FeedbackStatusName></FeedbackStatusName>
<FeedbackTypeName></FeedbackTypeName>
<AuthorFullName> </AuthorFullName>
<FeedbackStatusId>1</FeedbackStatusId>
<FeedbackTypeId>1</FeedbackTypeId>
<AuthorUserId>69</AuthorUserId>
</item>
同様のタスクに直面したとき、私はそれを手でly病にチェックし(xpathチェックを設定)、完了したことを報告しました(製品を知らなかったので、時間があまりありません...)。 今、私は改善する準備ができていると同時に、これを行う方法を皆に伝えます。 すぐに、私の方法が理想的または最適であると主張しないいくつかの方法の1つにすぎないことを予約してください。 そして、他の方法も学びたいと思っています-あなたのアイデア、経験、空想を頼りにしています...
この記事を読んでいるのであれば、同様のリストとそれがデータを引き出すベースを返す実用的なサービスをすでに持っていることを望みます。 そして、結果がサービスが返すものと一致するように、そのようなselectを書くことができます。
私にとって判明したプロジェクトの図では、サービスからの応答でxmlを受信し、データベースから結果を取得しています。 私はjoin'yや他のmura(今では無関係)を追加するのが面倒なので、それらは少しは一致しません。
今おいしい:
マウスと既製のチェックでできることは何もないことは明らかです-プログラムする必要があります。 GroovyのSoapUIでプログラミングする必要があります。 Javaコードは正しいGroovyコードであるため、何も学ぶ必要はありません(たとえば、Groovyを知りません)。問題に戻りましょう。それを解決する2つの方法があります。JDBCリクエストステップでスクリプトアサーションを作成するか、別のステップで取り出すことができます。
耐えました。 さらに、コードのために、すべてが開始されました。 自分の仕事のためにそれを変更できる人は、コメントを理解することができると思うので、それ以上の言葉は不要です...
import com.eviware.soapui.support.XmlHolder;
boolean b = true;
def soapRequest = testRunner.testCase.getTestStepAt(0);
// - item'
XmlHolder response = new XmlHolder( soapRequest.getProperty('Response').getValue() );
int numberOfItems = response.getXmlObject().selectPath('//item').size();
if (numberOfItems != 0)
{
XmlHolder row, item;
for (int i=1; i<=numberOfItems; i++) {
row = new XmlHolder( context.expand ( '${JDBC Request#ResponseAsXml#//Row['+i+']}' ));
item = new XmlHolder( context.expand ( '${GetFeedbackList#Response#//item['+i+']}' ));
//compareItemWithRow - ,
if (!compareItemWithRow (item, row) ) {
b = false;
//
break;
}
}
}
else {
//
def jdbcRequest = testRunner.testCase.getTestStepAt(1);
response = new XmlHolder( jdbcRequest.getProperty('ResponseAsXml').getValue() )
if (response.getXmlObject().selectPath('//item').size() != 0) {
log.error "There was no items in response but I found a few in database! WTF?!"
assert false;
}
}
assert b;
return;
/** 2 XmlHolder' , - - false*/
private boolean compareItemWithRow (XmlHolder item, XmlHolder row) {
boolean b = true;
if (!item.getNodeValue('//FeedbackId').equals( row.getNodeValue('//FEEDBACKID') )) {
log.error ('''FeedbackId doesn't corresponds database! Here could be your advertisment...'''
+ item.getNodeValue('//FeedbackId') + ' != ' + row.getNodeValue('//FEEDBACKID') +
'!!!ITEM: '+ item.getXml()+
' !!!ROW: '+ row.getXml());
b=false;
}
if (!item.getNodeValue('//RequestDate').equals( row.getNodeValue('//DATEINXML') )) {
log.error ('''RequestDate doesn't corresponds database! Here could be your advertisment... "'''
+ item.getNodeValue('//RequestDate') + '" != "' + row.getNodeValue('//DATEINXML') +
'" !!!ITEM: '+ item.getXml()+
' !!!ROW: '+ row.getXml());
b=false;
}
if (!item.getNodeValue('//AuthorUserId').equals( row.getNodeValue('//REQUESTUSERID') )) {
log.error ('''AuthorUserId doesn't corresponds database! Here could be your advertisment... "'''
+ item.getNodeValue('//AuthorUserId') + '" != "' + row.getNodeValue('//REQUESTUSERID') +
'" !!!ITEM: '+ item.getXml()+
' !!!ROW: '+ row.getXml());
b=false;
}
//...
return b;
}