2012-09-04 25 views
6

co zrobiłem

Używam SoapUI (3.6.1 wersja darmowa) usługi makiety służyć do konkretnych danych do 2 aplikacji klienckich Jestem testowanie . Za pomocą prostego skryptu Groovy skonfigurowałem kilka próbnych operacji pobierania odpowiedzi z określonych plików na podstawie żądań aplikacji klienckich.Jak mogę użyć względnych ścieżek do zewnętrznych plików odpowiedzi dla SoapUI MockService

Statyczne zawartość udawanym odpowiedź brzmi:

${responsefile} 

Groovy w okienku wysyłka skryptowego pracy jest:

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 
} 

W tym przykładzie, gdy aplikacja kliencka wysyła żądanie do próbna usługa zawierająca ciąg KategoriaA, odpowiedź zwrócona przez soapUI to zawartość pliku ID_List_CategoryA.xml

Co próbuję osiągnąć e

To wszystko działa dobrze z absolutnymi ścieżkami w wesołym miasteczku. Teraz chcę pobrać całą kolekcję plików projektu soapUI i plików zewnętrznych w pakiet w celu łatwego ponownego wdrożenia. Z mojego czytania o SoapUI Mam nadzieję, że będzie tak łatwe, jak ustawienie wartości Korzeń zasobów projektu do $ {projectDir} i zmienia moje ścieżki do:

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 
} 

... pamiętając, że mieszka pliku XML projektu SoapUI C:/soapProject/

Co ja próbowałem dotąd

Tak, że nie działa. Próbowałem odmiany ścieżek względnych:

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

Jeden wpis wskazuje, że SoapUI może uznać katalog plików projektu jako katalog główny dla celów ścieżki względnej, więc wypróbowano również następujące odmiany:

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

Kiedy żaden, który pracował Próbowałem korzystające z $ Właściwość {projectDir} w skrypcie groovy, ale wszystkie takie próby zakończyły się niepowodzeniem z błędem "Brak takiej właściwości: mockService dla klasy: Script [n]". Admittefly, naprawdę próbowałem to zrobić.

Próbowałem przy użyciu informacji z tego postu i innych: How do I make soapUI attachment paths relative?

... bez powodzenia. Zastąpienie "testu" przez "próbę" (między innymi zmianami) w kodzie rozwiązania z tego wpisu spowodowało więcej błędów właściwości, np.

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

.. doprowadziły do ​​...

No such property: mockRunner for class: Script3 

Co Chyba muszę

Słupki znalazłem podobne do tej kwestii wszystko ostrości na SoapUI TestSuites. Naprawdę potrzebuję rozwiązania, które jest MockService centric lub przynajmniej rzuca trochę światła na sposób, w jaki można go traktować inaczej w MockServices w przeciwieństwie do TestSuites.

Każda pomoc jest bardzo doceniana. Dzięki. Znak.

Rozwiązanie - Zapewnione przez GargantuChet

Następujące składniki zawiera zmian sugerowanych przez GargantuChet aby rozwiązać problem próbuje uzyskać dostęp do $ {projectDir} nieruchomości i umożliwić stosowanie ścieżek względnych poprzez zdefiniowanie nowego obiektu projectDir zasięgu zakres groovy skryptu:

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 
} 

Odpowiedz

7

nie jestem zaznajomiony z Groovy, ale zakładamy, że jest to normalne Filejava.io.File instancji.

Ścieżki względne są interpretowane jako relatywne do bieżącego katalogu aplikacji. Spróbuj coś jak poniżej w celu sprawdzenia:

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

Jeśli tak jest w tym przypadku, to może chcesz użyć konstruktora new File(String parent, String child), przechodząc katalog zasobów jako pierwszy argument i względną ścieżkę jako drugi.

Na przykład:

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

println content 

Oto wynik wykonania skryptu:

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$ 
+0

Trying Twój zakodowany przykład dla kopnięć spowodował następujący błąd: 'Nie udało się wysłać za pomocą skryptu; groovy.lang.MissingMethodException: Brak sygnatury metody: Script27.var() ma zastosowanie do typów argumentów: (java.lang.String) wartości: [C:/soapProject] Możliwe rozwiązania: wait(), run(), uruchom(), every(), any(), wait (long) ' – Mark

+0

_Pokaż o przebudowach. Nie zdawałem sobie sprawy, że formatowanie w komentarzach byłoby tak kłopotliwe. Ponieważ soapUI nie ma przeglądarki konsoli, zmieniłem twoją pierwszą sugestię, aby zalogować się do defaultPathBase: 'log.info" Aktualny katalog: "+ defaultPathBase." Jak podejrzewasz, że zarejestrował katalog aplikacji soapUI. Następnie próbowałem sprawdzić, czy mogę zarejestrować wartość właściwości $ {projectDir}: 'log.info" Katalog projektu: "+ projectDir" Pojawia się następujący błąd: 'Nie udało się wysłać za pomocą skryptu; groovy.lang.MissingPropertyException: Brak takiej właściwości: projectDir dla klasy: Script26' – Mark

+0

'projectDir' może nie być zdefiniowany w bieżącym skrypcie/zakresie. Najwyraźniej możesz odwoływać się do niego za pomocą ['def groovyUtils = new com.eviware.soapui.support.GroovyUtils (context); def projectDir = groovyUtils.projectPath; log.info (projectDir) '] [1], co jest prawdopodobnie metodą zatwierdzoną przez Groovy. Złapię kopię Groovy i wymyślę, co jest nie tak z przykrym przykładem. [1] http://www.webservices-testing.com/2011/10/project-path-using-groovy-in-soapui.html – GargantuChet

6

Mogłeś również zrobić następujące czynności, aby uzyskać wartość projectDir:

def projectDir = context.expand('${projectDir}'); 
+0

To nie zadziała w skrypcie ładowania projektu "krok" - dostępne są tylko obiekty "log" i "projekt". –

+0

Aktualizowanie komentarza: zadziała, jeśli wywołasz: def context = project.getContext(), a następnie uruchom powyższe. –

Powiązane problemy