BlogFitnesse - 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

Čítaj ďalej: