2016. február 3., szerda

UBIK Load Pack - GWT alkalmazások tesztelése JMeterrel

Azt a feladatot kaptam, hogy terheléses tesztet készítsek egy GWT alapú web-alkalmazáshoz. A felvett JMeter teszteseteknél a GWT-RPC protokoll miatt a request és a response paraméterek nem olvashatók ki a szokásos módon, amire viszont szükség volt a paraméterek szkriptelt aktualizálásánál. Paraméterek használata nélkül csak olyan terheléses teszt készíthető, ahol nincsenek futásidőben változó paraméterek, mint például a menükön való végig kattintgatás szimulálása.

Azért, hogy a GWT RPC során használt objektumokat a JMeter segítségével felhasználhassuk, az UBIK Load Pack kiegészítői közül, a JMeter-GWT alkalmazása mellett döntöttem, ami visszafejti és cserélhetővé teszi a paramétereket. A dekódolás végrehajtása után XML-t kapunk, így XPATH kifejezésekkel már könnyen beazonosíthatunk egy node-ot és annak az értékét a JMeter teszteseteknél.

A dekódolás előtti request:


A dekódolt request:


A dekódolt response:


A plugin bekonfigurálását elég körülményesnek mondanám, valamint szükséges hozzá a telepíthető alkalmazás is (WAR, EAR) és ehhez hozzájön még, hogy a konfigurációs lépéseket új alkalmazás verziók esetén ismételten el kell végezni. Szintén fekete pont, hogy a plugin fizetős, pl. egy 100VU-s licence ára 1100EUR (~ 340.000Ft) - 3 hónapos frissítési támogatással. Mindezek ellenére tökéletesen működik és jól integrálódik a JMeter-hez, a használata egyszerű.

Ti milyen eszközt használtok a GWT-s web-alkalmazások terheléses tesztelésénél?

2016. január 4., hétfő

Selenium - RemoteWebDriver + Jenkins

Egy folyamatos integrációs környezetben általában nem azon a gépen futtatjuk a felületi teszteket ahol a Jenkins is dolgozik, ezért felhúzunk egy külön Windows-os gépet ahova feltelepítünk Internet Explorer-t, Firefox-ot meg egy Chrome-ot mivel azt szeretnénk, hogy a Jenkins indította klikkelő robot már itt kattintgasson majd az eredményeket juttassa vissza a Jenkins számára.

Ez a működés a Selenium RemoteWebDriver segítségével egyszerűen megoldható. Először is rögzítsük a felületi tesztesetet a Selenium IDE Firefox plugin segítségével, majd exportáljuk Java forrásként és módosítsuk az alábbi mintakód alapján, ahol is a baseURL az alkalmazás kezdő URL-e, a távoli Windows-os gép a remoteSeleniumServer URL-en figyel, a browser pedig az a böngésző típus amivel a tesztet futtatni fogjuk. Látható, hogy ebben a minta kódban be vannak égetve az alapértelmezett értékek, de a Jenkins-ből ezeket majd felülírhatjuk.

import static org.junit.Assert.fail;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.commons.lang3.StringUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import com.thoughtworks.selenium.webdriven.WebDriverBackedSelenium;


public class NLRTest {
 private String baseURL = "https://webapphost:8113/";
 private String remoteSeleniumServer = "http://rsh:4444/wd/hub";
 private String browser="chrome";//firefox,internet explorer,chrome
 
 private WebDriverBackedSelenium selenium;
 private RemoteWebDriver remoteWD = null;

 @Before
 public void setUp() throws Exception {
  
  
  if(!StringUtils.isBlank(System.getProperty("baseURL")))
   baseURL=System.getProperty("baseURL");
  
  if(!StringUtils.isBlank(System.getProperty("remoteSeleniumServer")))
         remoteSeleniumServer=System.getProperty("remoteSeleniumServer");
  if(!StringUtils.isBlank(System.getProperty("browser")))
         browser=System.getProperty("browser");
   

  DesiredCapabilities capabilities = new DesiredCapabilities();
  capabilities.setJavascriptEnabled(true);
  capabilities.setBrowserName(browser);
  try {
   remoteWD = new RemoteWebDriver(new URL(remoteSeleniumServer),capabilities);
   

  } catch (MalformedURLException e) {
   e.printStackTrace();
  }

  selenium = new WebDriverBackedSelenium(remoteWD, baseURL);

 }

 @SuppressWarnings("deprecation")
 @Test
 public void testNLR1() throws Exception {

  selenium.open("/NLR/login");
  
  //IE certification ok button
  if(browser.equals("internet explorer"))
   remoteWD.navigate().to("javascript:document.getElementById('overridelink').click()");
  
  
  selenium.type("id=fnev", "myuser");
  selenium.type("id=password", "mypass");
  for (int second = 0;; second++) {
   if (second >= 60)
    fail("timeout");
   try {
    if ("felhasználónév:".equals(selenium
      .getText("css=td.left_label")))
     break;
   } catch (Exception e) {
   }
   Thread.sleep(1000);
  }

  selenium.click("css=button[type=\"button\"]");
  selenium.waitForPageToLoad("30000");
  for (int second = 0;; second++) {
   if (second >= 60)
    fail("timeout");
   try {
    if ("Munkamenet".equals(selenium.getText("link=Munkamenet")))
     break;
   } catch (Exception e) {
   }
   Thread.sleep(1000);
  }

  selenium.click("link=Munkamenet");
  ...
  selenium.click("link=Előzmények keresése");
  selenium.waitForPageToLoad("30000");
  selenium.click("link=Kilépés");
  selenium.waitForPageToLoad("30000");

 }

 @After
 public void tearDown() throws Exception {
  selenium.stop();
 }

}

A klikkelő robotnak létrehozott távoli Windows-os hosztra, ahol feltelepítettük az IE, Firefox és Chrome böngészőket, másoljuk fel a selenium-server-standalone.jar, a chromedriver.exe és IEDriverServer.exe fájlokat. A firefox driver-t nem kell külön letölteni, mert azt a selenium-server-standalone.jar már tartalmazza. Ezután ezen a dedikált Windows-os gépen indítsuk el a Selenium-ot az alábbi paranccsal, felparaméterezve a driverek elérési útvonalával. Innentől kezdve a Jenkins már képes elindítani a klikkelő robotot ezen a gépen.

java -Dwebdriver.chrome.driver="c:\\chromedriver.exe" -Dwebdriver.ie.driver = "c:\IEDriverServer.exe" -jar c:\selenium-server-standalone-2.47.1.jar 

Itt olvasható, hogy a Selenium-ot hogyan illeszthetjük be a maven-es projektünkbe, a Jenkins felületén pedig a Goals and options résznél állíthatjuk be a megfelelő paramétereket:

test -Dbuild.number=${PIPELINE_VERSION} -Dtest=hu.bakai.selenium.* -DbaseURL = "https://172.22.22.22:8113" -DrempoteSeleniumServer = "http://10.128.11.11:4444/wd/hub"  -Dbrowser = "internet explorer"

2015. december 3., csütörtök

SonarQube - LDAP csoport szinkronizáló plugin

A SonarQube lehetőséget ad arra, hogy az LDAP plugin segítségével az authentikációs és az authorizációs információkat LDAP-ból vagy Active Directory-ból kérjük le. Ez a gyári plugin a felhasználók minden belépésekor aktualizálja a csoportokat, azonban a működésének az előfeltétele, hogy a csoportok a SonarQube saját adatbázisában már benne legyenek. Alapesetben kézzel kellene felvenni akár több száz LDAP csoportot, így inkább fejlesztettem hozzá egy kiegészítőt.

SonarQube-LDAPGroup-Synchronizer plugin egy JRuby On Rails alapú widget, ami a SonarQube felületén a Settings / Configuration / LDAP Group Synchronizer menüpont alatt érhető el az adminisztrátor szerepben lévő felhasználók számára.


A plugin, a sonar.properties-ben megadott LDAP beállításokat használja és a felületen megjelenő gombbal indíthatjuk el az aktualizálást. Tervezem a kiegészítőm továbbfejlesztését azzal, hogy a SonarQube szerver indulásakor is automatikusan végrehajtson egy szinkronizálást a ServerStartHandler kiterjesztési pont segítségével.


Az elkészített plugin forráskódját feltöltöttem a github-ra. Ha továbbfejlesztési ötleted lenne hozzá, welcome...