11

私がしたこと

テスト中の 2 つのクライアント アプリケーションに特定のデータを提供するために、soapUI (3.6.1 無料版) モック サービスを使用しています。簡単な Groovy スクリプトを使用して、クライアント アプリケーションからの要求に基づいて特定のファイルから応答をフェッチするためのモック操作をセットアップしました。

モック応答の静的コンテンツは次のとおりです。

${responsefile}

操作ディスパッチ スクリプト ペインの groovy は次のとおりです。

def req = new XmlSlurper().parseText(mockRequest.requestContent)
if (req =~ "CategoryA")
{
    context.responsefile = new File("C:/soapProject/Test_Files/ID_List_CategoryA.xml").text
}
else
{
    context.responsefile = new File("C:/soapProject/Test_Files/ID_List_CategoryB.xml").text
}

この例では、クライアント アプリケーションが文字列 CategoryA を含むモック サービスに要求を発行すると、soapUI によって返される応答はファイル ID_List_CategoryA.xml の内容です。

私が達成しようとしていること

これはすべて、groovy の絶対パスで正常に機能します。ここで、簡単に再展開できるように、soapUI プロジェクト ファイルと外部ファイルのコレクション全体をパッケージにプルしたいと考えています。soapUI について読んだことから、プロジェクトのリソース ルートの値を ${projectDir} に設定し、パスを次のように変更するのと同じくらい簡単になることを願っていました。

def req = new XmlSlurper().parseText(mockRequest.requestContent)
if (req =~ "CategoryA")
{
    context.responsefile = new File("Test_Files/ID_List_CategoryA.xml").text
}
else
{
    context.responsefile = new File("Test_Files/ID_List_CategoryB.xml").text
}

... soapUI プロジェクトの xml ファイルは C:/soapProject/ にあることに注意してください

これまでに試したこと

だから、それはうまくいきません。相対パスのバリエーションを試しました:

  • ./Test_Files/ID_List_CategoryA.xml
  • /Test_Files/ID_List_CategoryA.xml
  • Test_Files/ID_List_CategoryA.xml

ある投稿では、soapUI が相対パスの目的でプロジェクト ファイルの親ディレクトリをルートと見なす可能性があることを示していたため、次のバリエーションも試してみました。

  • ./soapProject/Test_Files/ID_List_CategoryA.xml
  • /soapProject/Test_Files/ID_List_CategoryA.xml
  • soapProject/Test_Files/ID_List_CategoryA.xml

どれもうまくいかなかったとき、Groovy スクリプトで ${projectDir} プロパティを使用しようとしましたが、そのような試みはすべて「そのようなプロパティはありません: クラスの mockService: Script[n]」エラーで失敗しました。確かに、それをしようとしたとき、私は本当に手探りでした。

この投稿やその他の情報を使用してみました: How do I make soapUI attachment paths relative?

...運がない。その投稿のソリューション コードで「test」を「mock」に置き換えると (他の変更の中でも)、より多くのプロパティ エラーが発生しました。

testFile = new File(mockRunner.project.getPath())

.. につながった

No such property: mockRunner for class: Script3

私が必要だと思うもの

この問題に関連して私が見つけた投稿はすべて、soapUI TestSuites に焦点を当てています。MockService 中心のソリューション、または少なくとも TestSuite とは対照的に MockService で異なる方法で処理する方法に光を当てるソリューションが本当に必要です。

どんな助けでも大歓迎です。ありがとう。マーク。

解決策 - GargantuChet提供

${projectDir} プロパティにアクセスしようとする問題を解決し、groovy スクリプトのスコープ内で新しい projectDir オブジェクトを定義して相対パスを使用できるようにするために、GargantuChetによって提案された変更を以下に示します。

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def projectDir = groovyUtils.projectPath

def req = new XmlSlurper().parseText(mockRequest.requestContent)
if (req =~ "CategoryA")
{
    context.responsefile = new File(projectDir, "Test_Files/ID_List_CategoryA.xml").text
}
else
{
    context.responsefile = new File(projectDir, "Test_Files/ID_List_CategoryB.xml").text
}
4

2 に答える 2

10

私は Groovy に詳しくありませんFileが、通常のjava.io.Fileインスタンスだと思います。

相対パスは、アプリケーションの現在のディレクトリからの相対パスとして解釈されます。確認するには、次のようなことを試してください。

def defaultPathBase = new File( "." ).getCanonicalPath()
println "Current dir:" + defaultPathBase

この場合、new File(String parent, String child)コンストラクターを使用して、リソース ディレクトリを最初の引数として、相対パスを 2 番目の引数として渡すことができます。

例えば:

// hardcoded for demonstration purposes
def pathbase = "/Users/chet"
def content = new File(pathbase, "Desktop/sample.txt").text

println content

スクリプトを実行した結果は次のとおりです。

Chets-MacBook-Pro:Desktop chet$ groovy sample.groovy 
This is a sample text file.

It will be displayed by a Groovy script.
Chets-MacBook-Pro:Desktop chet$ groovy sample.groovy 
This is a sample text file.

It will be displayed by a Groovy script.

Chets-MacBook-Pro:Desktop chet$ 
于 2012-09-04T15:37:57.837 に答える
6

次のようにして projectDir の値を取得することもできます。

    def projectDir = context.expand('${projectDir}');
于 2013-03-07T20:05:30.873 に答える