Hackerrank megoldások JUnit Rule-lal

A JUnit Rule-ok gyakran méltánytalanul mellőzött osztályai a JUnit keretrendszernek. A rule-ok használatával pedig kibővíthetjük a teszteseteinket újrafelhasználható funkciókkal. Léteznek már előre megírt rule-ok, mint a TemporaryFolder rule fájlműveletek teszteléséhez, vagy az ExpectedException rule, melynek használatával az elvárt kivételekre tudunk pontosabb feltételeket megfogalmazni. Természetesen saját rule-okat is írhatunk, ha szabadidőnket erre áldozzuk, ahelyett, hogy a kora őszi erdőt járnánk szarvasbőgést hallgatva.

A Hackerrank egy olyan oldal, ahol különböző nehézségű programozási feladatok vannak a kezdőtől a profiig, melyek megoldásával pontokat gyűjthetünk. Választhatunk különböző témakörök közül, használhatunk különböző programozási nyelveket. A feladatok angolul vannak leírva, és több teszt eset is tartozik hozzájuk, jellemzőjük, hogy a standard bemenetről kell beolvasni a teszt adatokat, és a standard kimenetre kell a megoldást kiírni. A tesztesetek (bemenet és kimenet) fájlként letölthetőek.

Természetesen nem túl kényelmes a megoldásokat a weboldal beviteli mezőjében megírni, sokkal jobb kedvenc fejlesztőeszközünkben. Java esetén JUnit teszteket is használhatunk, ekkor azonban a Hackerranken publikált kódvázat kell átalakítanunk. Ahhoz, hogy ezt a lépést ne kelljen megtennünk, és egyszerűen másolhassuk le a kódot, készítettem egy JUnit rule-t, mely a standard inputra irányítja a példa bemenetet tartalmazó állomány tartalmát, naplózza a standard kimenetre az írásokat, és szabályos assert hívással összehasonlítja a kimenetre írt tartalmat a megoldást tartalmazó állomány tartalmával.

Így ezen poszt bemutatja a JUnit rule-ok használatát, valamint egy eszközt biztosít, mellyel kényelmesebben lehet Hackerrank feladatokat megoldani.

Naplózás

Szintén egy régi tartozásomat szeretném letudni, méghozzá a naplózó keretrendszerek ismertetését. Az egyik legrégebbi keretrendszer a Log4J, melyet Ceki Gülcü kezdett el fejleszteni. Bizonyos Apache projekteken belül az Apache Commons Logging volt elterjedt. Valamint bekerült naplózás a JDK-ba is, bár kicsit későn reagált az igényekre, a java.util.logging csomagba került, ezért gyakran hívjuk JUL-nak is. Mivel az eltérő library-k eltérő naplózó keretrendszereket definiáltak függőségként, ezért egy alkalmazás fejlesztésekor sajnos több naplózó rendszer is bekerült az alkalmazásba.

Erre a problémára megoldásként hozta létre szintén Ceki Gülcü az SLF4J keretrendszert, mely egy egyszerű API a különböző naplózó keretrendszerek elé. Van egy egyszerű implementációja is (SimpleLogger), de az összes többi keretrendszerhez van illesztése. Mindenképpen érdemes ezt használnunk, hiszen ekkor bármikor cserélhetjük alatta az implementációt.

A Log4J fejlesztése közben tanultak alapján alkotta meg Ceki Gülcü a következő keretrendszert, Logback néven.

Hogy még bonyolultabb legyen a helyzet, kijött a Log4J 2 is, melybe a Logbackből átemeltek pár dolgot, de úgy, hogy közben javítottak is rajta, olyan dolgokat, melyeket a Logbackben nem lehetett annak architektúrális megkötései miatt.

Ebben a posztban nézzük meg pár trükköt a naplózó keretrendszerek használatával kapcsolatban.

(Ennek kapcsán frissítettem egy régi Log4J cikkem, mely elérhető a GitHub-on, valamint van Log4J példa projekt is. A poszt további része természetesen a Logbacket is tárgyalja.)

SonarQube

Bár a SonarQube (korábban egyszerűen csak Sonar) a Java fejlesztés alap eszköztárába tartozik, mégsem írtam még róla, így ezzel a poszttal ezt szeretném bepótolni.

A SonarQube egy olyan komplex szoftverrendszer, mely azt biztosítja, hogy folyamatosan nyomon tudjuk követni a kódunk minőségét (ezt Continuous Code Quality-nek nevezi). A projektünkre statikus kódelemzőket lehet futtatni, melyek elemzik a forráskódot, és annak feltérképezésével próbálnak hibás részeket keresni. (Ezek általában rossz programozási gyakorlatok, az idők során kialakult programozási konvencióknak ellentmondó kódrészletek, vagy tipikus - nem olyan gyakorlott fejlesztők által elkövetett típushibák). A SonarQube-ot először Java nyelvre fejlesztették, de már több, mint húsz programozási nyelvet támogat (, akár egy projekten belül, pl. Java backend, és JavaScript frontend). A SonarQube ezen elemzések eredményét képes hisztorikusan tárolni, így nyomon követhető, hogy idővel hogyan alakul a kódunk minősége. Ezen kívül képes a tesztlefedettséget is tárolni, hogy az automatikus tesztek futása során mely utasítások lettek végrehajva, és mely osztályokra, metódusokra, végrehajtási ágakra nincs tesztünk. Ezeket az információkat nem csak tárolni tudja, hanem egy intuitív felületen képes ezeket meg is jeleníteni. A SonarQube tetszőleges számú projekt adatait képes tárolni és megjeleníteni. Nyílt forráskódú, de licensz is vásárolható, mellyel támogatást kapunk, illetve más nyelvhez is elemzőket.

Nézzük meg, hogy milyen komponensekből áll a SonarQube, hogyan lehet telepíteni, és hogyan elemezhetünk ki vele egy projektet, és hogyan integrálható a fejlesztőeszközünkkel (IDEA, Eclipse és NetBeans).

Issues

Twelve-factor app

Az idén rendezett HOUG 2016 szakmai napon is előadhattam, előadásomat “Üzemeltethető Java alkalmazások” címmel tartottam. Fő téma a Twelve-factor app és a Cloud native volt. Az előadás diái itt megtekinthetőek.

Az előadás húsz perce alatt csak ízelítőt tudtam adni a Twelve-factor app állításaiból, és azok implementációs kérdéseiről Java és főleg Spring Boot környezetben. A Twelve-factor app a Heroku (Platform as a Service) fejlesztőinek ajánlása felhőbe telepíthető alkalmazások fejlesztésére. Azonban én ajánlom ezen útmutatások, legjobb gyakorlatok betartását akár privát környezetben futó egyszerű alkalmazások fejlesztésénél is, ugyanúgy, mint privát vagy publikus felhőben üzemelő microservice architektúrával összerakott rendszerek esetében.

Ebben a posztban kitérek mind a tizenkét pontra, és ismertetem ennek implementációs vetületeit Java, Spring, de főleg Spring Boot környezetben, sőt személyes tapasztalataimat is megosztom. Ettől függetlenül érdemes elolvasnia, azoknak is, akik más környezetben fejlesztenek.

A szakmai napra egy kis példa alkalmazás is készült, mely elérhető GitHubon.

Viczián István a HOUG konferencián

HOUG 2016 szakmai nap meghívó

A HOUG idén is megrendezi őszi szakmai napját. A rendezvény időpontja 2016. október 11., a helyszín Magyar Telekom Székház, 1013 Budapest, Krisztina körút 55. A rendezvényen való részvétel (idén utoljára) ingyenes, de előzetes regisztrációhoz kötött.

A program 9:00-kor kezdődik Dr. Magyar Gábor, a HOUG elnökének megnyitójával, majd Molnár Balázs tart egy előadást “My Life and Cloud” címmel.

Utána a program három szekcióban folytatódik, mint Java & Middleware, BI & Applications, valamint DB & Infrastructure. A részletes programról itt tájékozódhatsz. Lesz szó Oracle Middleware megoldásokról, Oracle Commerce Platformról, WebLogic Serverről, microservice-ekről, JSON-ről, Dockerről, cloudról. Sőt lesz egy Java Coding Workshop is.

Én is adok elő 10:10-től “Üzemeltethető Java alkalmazások” címmel.

Manapság a microservices architektúrák elterjedésével, a felhős megoldások térnyerésével és a DevOps gondolkodásmód divatba jöttével egyre nagyobb az igény arra, hogy a Java alkalmazások könnyen üzemeltethetők legyenek. Bár régóta válasz erre a JMX, nem terjedt el annyira, és az igények túlnőttek rajta.

Az üzemeltetők (különösen, ha az üzemeltetésben fejlesztők is részt vesznek) nem fekete dobozként akarnak tekinteni az alkalmazásra, hanem megfigyelni, sőt, beavatkozni is szeretnének. Látni akarják, hogy az alkalmazás külső kapcsolatai (pl. adatbázis, cache, sorok, webszolgáltatások, stb.) rendben vannak-e. Az alkalmazás milyen paraméterekkel lett elindítva. Különböző értékeket, statisztikákat akarnak kinyerni. Ezeket már meglévő monitoring eszközökbe akarják bekötni. Sőt, support keretében akár éleseben futó alkalmazás működésébe beavatkozni.

Lássuk, hogy erre milyen eszközök vannak, milyen elvárásaink lehetnek, és hogyan tudunk akár saját metrikákat, eseményeket definiálni. Lesz szó RESTful webszolgáltatásokról, Spring Bootról, Metricsről, parancssorról, stb.

Regisztrálj te is, és gyere el!