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

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

 F_1

Č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 2222F_2
  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

F_3

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

F_4
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;
	}
}

F_5

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

F_6


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ť.

Roman Hesteric
Roman Hesterichttp://www.priklady.eu
Pracuje ako QA Architekt v Swiss Re. Predtým CTO pre Java a .Net aplikácie. Autorizovaný spolupracovník na projekte Canoo Webtest. Držiteľ certifikátov MCTS a MCPD pre SharePoint server. V IT pracuje 25 rokov, od starého dobrého Turbo Pascalu od Borlandu, cez Javu, až po C#. Administrátor matematického portálu www.priklady.eu

Senior Python Developer/ka

Úspešný americký startup, ktorý umožňuje vývojárom vytvárať aplikácie a rozhrania API bez akýchkoľvek časových, priestorových a cloudových architektúr hľadá...

C#/.NET & React Fullstack Developer/ka

FullStack Developer/ka | Vývoj nového produktu | Security Pracoval/a by si na TPP s platom 2400 - 2800 EUR/brutto mesačne...

Data Visualization Senior Analyst

Pre medzinárodnú IT spoločnosť hľadáme Senior Data Visualization Analyst. Pracujú na veľkých projektoch pre top 100 svetových spoločností. Ide o...

Splunk Data Engineer

Chcel by si dlhodobú spoluprácu, dobré pracovné podmienky, seriózny prístup? Medzinárodná IT spoločnosť hľadá Splunk Data Engineera. Pracujú na veľkých...

Senior Java Developer

Úspešný americký startup, ktorý umožňuje vývojárom vytvárať aplikácie a rozhrania API bez akýchkoľvek časových, priestorových a cloudových architektúr hľadá...

Backend/Node.js Developer / REMOTE

Pre mladý startup vyvíjajúci softvér, ktorý prispieva hráčom k lepšiemu zážitku z hrania, hľadáme Backend/Node.js Developera. Založili ho dvaja...

Julia Developer / REMOTE

Projekt pre nadšencov Julia a machine learning. Pre spoločnosť, ktorá používa matematické metódy a metódy AI / ML na...

Máte vo firemných stretnutiach chaos? Česká firma našla riešenie, teraz s aplikáciou dobývajú svet

Vyvíjajú ju v Českej republike, pracujú na nej aj hendikepovaní kolegovia a používajú ju firmy v rôznych krajinách sveta....

Ondrej Kubovič – Digitálna bezpečnosť a riziká na internete

Tentokrát sme sa porozprávali s Ondrejom Kubovičom, špecialistom v spoločnosti ESET na populárnu tému digitálnej bezpečnosti. Ondrej nám uviedol...

Slovenskí tvorcovia hier dosiahli v roku 2020 rekordný obrat 72 miliónov EUR, zamestnávali 870 ľudí

Slovenský herný priemysel nezastavila ani pandémia, v roku 2020 opäť výrazne rástol. Podľa štatistík Slovak Game Developers Association prekonal...

Čí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ť.