Blog Fitnesse - 2. časť - testovanie webových služieb

Fitnesse – 2. časť – testovanie webových služieb

 

Článok je venovaný použitiu vlastných fixtures do Fitnesse testovacieho frameworku. V tomto článku otestujeme verejne dostupné, takpovediac, edukačné webové služby.

predchádzajúcom článku som sľúbil, že budeme pokračovať vytvorením fixtures na otestovanie skutočných webovýuch služieb. Konkrétne sa pokúsime otestovať webové služby:

Druhá časť článkov o Fitnesse testovacom frameworku bude obsahovať menej „omáčkových rečí“, ktoré sa dajú vždy  nájsť na webe, zato sa však pokúsim pomocou uverejnených zdrojákov ilustrovať použitie tohto nástroja v praxi.

Začíname

  1. Download FitNesse build-u “fitnesse-standalone.jar”
  2. Spustiť ako administrátor: java -jar fitnesse-standalone.jar -p 2222
  3. Na vygenerovanie proxy java tried z WSDL súborov môžete použite váš obľúbený spôsob. Ja som použil Maven, takže mavenovský pom.xml bude obsahovať aj nasledujúce elementy.

 Pom.xml

<build>

        <sourceDirectory>src</sourceDirectory>

        <testSourceDirectory>test</testSourceDirectory>

        <plugins>

            <plugin>

                <groupId>com.googlecode.maven-download-plugin</groupId>

                <artifactId>download-maven-plugin</artifactId>

                <version>1.2.0</version>

                <executions>                                     

                    <execution>

                        <id>Download WeatherWS</id>

                        <phase>generate-sources</phase>

                        <goals>

                            <goal>wget</goal>

                        </goals>

                        <configuration>

                            <url>http://wsf.cdyne.com/WeatherWS/Weather.asmx?wsdl</url>

                            <outputDirectory>wsdl_new</outputDirectory>

                            <outputFileName>WeatherWS.wsdl</outputFileName>

                        </configuration>

                    </execution>                                     

                </executions>

            </plugin>

.

.

.

            <plugin>

                <groupId>org.apache.cxf</groupId>

                <artifactId>cxf-codegen-plugin</artifactId>

                <version>2.3.11</version>

                <dependencies>

                    <dependency>

                        <groupId>org.apache.cxf</groupId>

                        <artifactId>cxf-rt-bindings-soap</artifactId>

                        <version>2.3.11</version>

                    </dependency>

                </dependencies>

                <executions>

                    <execution>

                        <id>generate-wws</id>

                        <phase>generate-sources</phase>

                        <configuration>

                            <additionalJvmArgs>-Dfile.encoding=UTF8</additionalJvmArgs>

                            <sourceRoot>src</sourceRoot>

                            <wsdlOptions>                            

                                <wsdlOption>

                                    <wsdl>wsdl_new/WeatherWS.wsdl</wsdl>

                                    <extraargs>

                                        <extraarg>-wsdlLocation</extraarg>

                                        <extraarg></extraarg>

                                        <extraarg>-client</extraarg>

                                        <extraarg>-p</extraarg>

                                        <extraarg>generated.WeatherWS</extraarg>

                                    </extraargs>

                                </wsdlOption>

                            </wsdlOptions>

                        </configuration>

                        <goals>

                            <goal>wsdl2java</goal>

                        </goals>

                    </execution>

            </executions>

Štruktúra Fitnesse projektu

Do adresára wsdl_new pribudnú nami definované wsdl súbory atribútov pom.xml

… a vygenerované proxy triedy na volanie webových služieb do package „generated“


Facade services

Trieda WeatherService pošle webovému servisu požiadavku prostredníctvom ZIP kódu mesta v USA a vráti aktuálnu teplotu vo farenheitoch.

WeatherService.java

package com.rhe.fitnesse.wsFacade;

import generated.WeatherWS.WeatherReturn;
import generated.WeatherWS.WeatherSoap;

import java.util.HashMap;
import java.util.logging.Logger;

public class WeatherService {
public final static Logger LOGGER = Logger.getLogger(ConversionRateService.class.getName());
	HashMap<String, Object> hm = new HashMap<String, Object>();
	
	public HashMap<String, Object> doWeather(WeatherSoap wService, String zip) {

		long start = System.currentTimeMillis();
		
		WeatherReturn ret =  wService.getCityWeatherByZIP(zip);
		
		hm.put("city",  ret.getCity()); 
		hm.put("state", ret.getState());
		hm.put("farenheit",  ret.getTemperature());

		System.out.println(zip+" City:"+ret.getCity()+" State:"+ret.getState()+" Temperature:"+ret.getTemperature()+" Farenheit");
		
		long end = System.currentTimeMillis();
		long dur = end-start; 
		LOGGER.info("Operation took " + dur + " ms");
		return hm;
	}
}

Trieda ConversionRateService pošle webovému servisu požiadavku prostredníctvom meny „From“ a many „To“, pričom vráti aktuálny kurz oboch mien. Napríklad EUR->CZK.

ConversionRateService.java

package com.rhe.fitnesse.wsFacade;

import generated.currencyConvertor.Currency;
import generated.currencyConvertor.CurrencyConvertorSoap;

import java.util.logging.Logger;



public class ConversionRateService {
	public final static Logger LOGGER = Logger.getLogger(ConversionRateService.class.getName());
	
	public double doCR(CurrencyConvertorSoap ccService, String from, String to) {		
		long start = System.currentTimeMillis();
		
		Currency cFrom 	= Currency.fromValue(from);
		Currency cTo	= Currency.fromValue(to);
		
		double dd = ccService.conversionRate(cFrom, cTo);

		System.out.println("Conversion rate from "+from+" to "+to+" is "+dd);
		
		long end = System.currentTimeMillis();
		long dur = end-start; 
		LOGGER.info("Operation took " + dur + " ms");
		return dd;
	}
}

Fixtures

obsahujú všetky skripty použiteľné vo Fitness front end.

CheckCurrencyConvertor.java

package com.rhe.fitnesse.fixtures;

import com.rhe.fitnesse.main.Main;
import com.rhe.fitnesse.wsFacade.ConversionRateService;

public class CheckCurrencyConvertor {
	double rate;

	public void getConversionrateFromTo(String from, String to) {
		ConversionRateService crs = new ConversionRateService();
		rate = crs.doCR(Main.getCCService(), from, to);
	}

	public String rate() {
		Double dRet = new Double(rate);
		return dRet.toString();
	}

	public boolean rateIsSameAs(double dVal) {
		if (rate == dVal)
			return true;
		else
			return false;
	}

}

 

CheckWeather.java

package com.rhe.fitnesse.fixtures;

import java.util.HashMap;
import com.rhe.fitnesse.main.Main;
import com.rhe.fitnesse.wsFacade.WeatherService;

public class CheckWeather {
	HashMap<String, Object> hm = new HashMap<String, Object>();
	double farenheit;
	String city;
	String state;
	
	public void getWeatherFromZip(String zip) {
		WeatherService wws = new WeatherService();
		hm = wws.doWeather(Main.getWService(), zip);
	}

	public String farenheit() {
		return (String) hm.get("farenheit");		
	}
	
	public String city() {
		return (String) hm.get("city");		
	}
	
	public String state() {
		return (String) hm.get("state");		
	}
}

Set-up

Trieda SetUp inicializuje webové služby a vracia ich SOAP handlery.

SetUp.java

package com.rhe.fitnesse.main;

import generated.WeatherWS.Weather;
import generated.WeatherWS.WeatherSoap;
import generated.currencyConvertor.CurrencyConvertor;
import generated.currencyConvertor.CurrencyConvertorSoap;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;

public abstract class SetUp {
	public static final int TIMEOUT = 0;

	public static CurrencyConvertorSoap setupSoapCurrencyConvertor(String url, String nameSpace, String serviceName) {
		URL wsdlURL = null;
		try {
			wsdlURL = new URL(url);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		QName SERVICE_NAME = new QName(nameSpace, serviceName);
		CurrencyConvertor ss = new CurrencyConvertor(wsdlURL, SERVICE_NAME);
		CurrencyConvertorSoap port = ss.getCurrencyConvertorSoap();
		return port;
	}
	
	public static WeatherSoap setupSoapWeather (String url, String nameSpace, String serviceName) {
		URL wsdlURL = null;
		try {
			wsdlURL = new URL(url);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		QName SERVICE_NAME = new QName(nameSpace, serviceName);
		Weather ss = new Weather(wsdlURL, SERVICE_NAME);
		WeatherSoap port = ss.getWeatherSoap();
		return port;
	}
	
}

Spustenie z prostredia Eclipse

Main.java

package com.rhe.fitnesse.main;

import generated.WeatherWS.WeatherSoap;
import generated.currencyConvertor.CurrencyConvertorSoap;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import com.rsd.fitnesse.fixtures.CheckCurrencyConvertor;
import com.rsd.fitnesse.fixtures.CheckWeather;
import com.rsd.fitnesse.repositoryFacade.Priklad_eu;
import com.rsd.fitnesse.wsFacade.ConversionRateService;

public class Main {
	private static CurrencyConvertorSoap ccService;
	private static WeatherSoap wService;
	
	static {
		LogManager.getLogManager().getLogger(Logger.GLOBAL_LOGGER_NAME).setLevel(Level.INFO);
		ConsoleHandler consoleHandler = new ConsoleHandler();
		ConversionRateService.LOGGER.addHandler(consoleHandler);
	}
	public static void main(String[] args) {
								
		setWServices();
		CheckWeather cw = new CheckWeather();
		cw.getWeatherFromZip("85001");
		System.out.println(cw.farenheit());
		
		setCCServices();
		CheckCurrencyConvertor cc = new CheckCurrencyConvertor();
		cc.getConversionrateFromTo("EUR", "CZK");
		System.out.println(cc.rate());
				
		return;
	}
	
	public static void setWServices() {
		wService  = SetUp.setupSoapWeather("http://wsf.cdyne.com/WeatherWS/Weather.asmx?wsdl", "http://ws.cdyne.com/WeatherWS/", "Weather");
	}
	
	public static void setCCServices() {
		ccService = SetUp.setupSoapCurrencyConvertor("http://www.webservicex.net/CurrencyConvertor.asmx?WSDL", "http://www.webserviceX.NET/", "CurrencyConvertor");
	}
	
	
	public static CurrencyConvertorSoap getCCService() {
		return ccService;
	}
	
	public static WeatherSoap getWService() {
		return wService;
	}
}

Na konzole sa objaví:

log4j:WARN No appenders could be found for logger
(org.apache.http.impl.conn.BasicClientConnectionManager).
log4j:WARN Please initialize the log4j system properly.
Dec 1, 2014 11:25:57 AM org.apache.cxf.service.factory.ReflectionServiceFactoryBean
buildServiceFromWSDL
INFO: Creating Service {http://ws.cdyne.com/WeatherWS/}Weather from WSDL: http://wsf.cdyne.com/WeatherWS/Weather.asmx?wsdl
85001 City:Phoenix State:AZ Temperature:74 Farenheit
74
Dec 1, 2014 11:25:58 AM com.rsd.fitnesse.wsFacade.WeatherService doWeather
INFO: Operation took 264 ms
Dec 1, 2014 11:25:58 AM com.rsd.fitnesse.wsFacade.WeatherService doWeather
INFO: Operation took 264 ms
Dec 1, 2014 11:25:59 AM org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
INFO: Creating Service {http://www.webserviceX.NET/}CurrencyConvertor from WSDL: http://www.webservicex.net/CurrencyConvertor.asmx?WSDL
Conversion rate from EUR to CZK is 27.608
Dec 1, 2014 11:25:59 AM com.rsd.fitnesse.wsFacade.ConversionRateService doCR
INFO: Operation took 406 ms
Dec 1, 2014 11:25:59 AM com.rsd.fitnesse.wsFacade.ConversionRateService doCR
INFO: Operation took 406 ms
27.608

Fitnesse front end

!define TEST_SYSTEM {slim}
!path C:\Users\rhe\workspace\FitnesseFixturesDemo\jar\FitnesseFixturesDemo.jar
!path C:\Users\rhe\workspace\FitnesseFixturesDemo\jar\FitnesseFixturesDemo_lib/*

|import                   |
|com.rsd.fitnesse.fixtures|

!|setUpCurrencyConvertorService|
|start?                        |
|true                          |

!3 Get CC rate - Check Currency Convertor
|script                 |check currency convertor|
|get Conversionrate from|EUR             |to |CZK|
|check not              |rate            |null   |
|show                   |rate                    |
|ensure                 |rate is same as |27.6059|
|reject                 |rate is same as |2      |


!|setUpWeatherService|
|start?              |
|true                |

!3 Get Wheather - temperature in NY
|script           |check weather |
|getWeatherFromZip|10001         |
|check not        |farenheit|null|
|show             |city          |
|show             |state         |
|show             |farenheit     |

!3 Get Wheather - temperature in Phoenix 
|script           |check weather |
|getWeatherFromZip|85001         |
|check not        |farenheit|null|
|show             |city          |
|show             |state         |
|show             |farenheit     |

 

Spustenie testov vo Fitnesse front end


Dobrý článok? Chceš dostávať ďalšie?

Už viac ako 6 200 ITečkárov dostáva správy e-mailom. Nemusíš sa báť, nie každé ráno. Len občasne.



Súhlasím so spracovaním mojich osobných údajov. ( Viac informácií. )

Tvoj email neposkytneme 3tím stranám. Posielame naňho len informácie z robime.it. Kedykoľvek sa môžeš odhlásiť.

Senior Java Consultant

Hľadáš, kam by si sa posunul? Možno ťa táto práca zaujme. Ide o Senior JAVA konzultanta v nadnárodnej IT...

PHP Developer / Homeoffice / Vhodné aj pre absolventa!

Aj pre absolventa je tu dobrý začiatok IT kariéry! Hľadáme PHP Developera pre spoločnosť, ktorá pôsobí v oblasti zdravia.Je...

Junior Java Developer / REMOTE

Máš rád svoju slobodu, pracuješ na projektoch, ideálne remote? Možno táto práca Java Developera bude pre Teba to najlepšie...

Ruby on Rails Developer / REMOTE

Je tvoj život príliš v “koľajniciach”? Urob si odbočku a skús sa pridať do tímu Ruby on Rails developerov.Ide...

Automation Tester / Java

Medzinárodná spoločnosť, ktorá vyvíja finančný softvér hľadá človeka na pozíciu Automation Tester.Práca je v Bratislave na TPP. Odmena sa...

Cloud Administrátor / REMOTE

Máš pocit, že chceš ísť ďalej? Možno práve v tomto období je ten správny čas. Hľadáme Cloud Administrátora.Práca je...

Integračný Administrátor

Poď sa učiť od profesionálov! Pre medzinárodnú spoločnosti, ktoré sa venujú vývoju databáz hľadáme integračného administrátora.Práca je REMOTE, na...

Schválené. Poznáme najlepšie projekty uplynulej výzvy!

Výzvu pre veľké projekty sme vyhlásili v polovici marca tohto roku a s napätím sme...

Bezáková: Otázky o ochrane osobných údajov je potrebné riešiť na začiatku, nie „potom“

Počas dvojdňového praktického workshopu DPO Bootcamp, ktorý sme zorganizovali 24.-25. júna 2020...

Stanovisko IT Asociácie Slovenska k dokumentu ÚHP Informatizácia 2.0 – revízia výdavkov

IT Asociácia Slovenska (ITAS) ako najväčšia profesijná organizácia IT firiem, ktorej členovia...

Čítaj ďalej:

Dobrý článok? Chceš dostávať ďalšie?

Už viac ako 6 200 ITečkárov dostáva správy e-mailom. Nemusíš sa báť, nie každé ráno. Len občasne.

Súhlasím so spracovaním mojich osobných údajov. ( Viac informácií. )

Tvoj email neposkytneme 3tím stranám. Posielame naňho len informácie z robime.it. Kedykoľvek sa môžeš odhlásiť.