A projekt célja a fejlesztői tesztek segítése RestAssured + Weld + JUnit 5 használatával.

Előnyök:

  • Java alapok, fejlesztőknek egyszerű, ismert környezet.

  • Használhatóak a projekt által kigenerált DTO osztályok.

    • Nem szükséges kézzel összeállítani a request XML/JSON body-t.

    • Tesztek aktív állapotban tartása.

  • Futtatható IDE-ből vagy maven-en keresztül konzolon és CI toolon.

Hátrányok:

  • Elsőre bonyorultabb teszt struktúrát követel

1. Maven struktúra

1.1. Project repository

A tesztek a projekttel egy repositoryba kerülhetnek, a fő pom alatt külön testsuite modulba. Érdemes a "testsuite" csomópontot inaktiválható profilba rakni, például:

Fő projekt pom.xml
<profiles>
  <profile>
    <id>ci</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <modules>
      <module>project-testsuite</module>
    </modules>
  </profile>
</profiles>
Ajánlott példa project maven struktúra
project-backend
+-- project-bom
+-- project-common
+-- project-sample
\-- project-testsuite

1.2. Testsuite module

A testsuite modulon belül a child pomok követik a projekt szerinti strukúrát. Azaz ha pl. a projecten egy service a project-backend/project-sample/project-sample-service modulban található, akkor a service-hez tartozó tesztek project-backend/project-testsuite/project-testsuite-sample/project-testsuite-sample-service pom alá kerülnek.

A service-hez tartozó testsuite maven module-t további almodulokra bontjuk a service-ben található REST interface-eknek megfelelően, ezekbe az almodulokba kerülnek az operációnként külön teszt osztályok.

Példa testsuite modul felépítése
project-backend
+-- project-bom
+-- project-common
+-- project-sample
|   \-- project-sample-service
|       \-- src/main/java/
|           \-- hu.icellmobilsoft.project.sample.service.rest
|               +-- IUserRest.java //<1>
|               |   +-- postUser() //<2>
|               |   \-- putUser() //<3>
|               \-- ISampleRest.java //<4>
|                   \-- getSample() //<5>
\-- project-testsuite
    +-- project-testsuite-common
    \-- project-testsuite-sample
        \-- project-testsuite-sample-service
            +-- project-testsuite-sample-service-user-rest //<1>
                \-- src/test/java/
                    \-- hu.icellmobilsoft.project.testsuite.sample.service.rest
                        +-- PostUserIT //<2>
                        \-- PutUserIT //<3>
            \-- project-testsuite-sample-service-sample-rest //<4>
                \-- src/test/java/
                    \-- hu.icellmobilsoft.project.testsuite.sample.service.rest
                        \-- GetSampleIT //<5>
1 sample-service IUserRest interface-e. A testsuite-ban külön pom tartozik hozzá: project-testsuite-sample-service-user-rest
2 IUserRest.postUser() operáció. Testsuite-ban a user-rest pom alatt saját tesztosztály tartozik hozzá: PostUserIT
3 IUserRest._putUser() operáció. Testsuite-ban a user-rest pom alatt saját tesztosztály tartozik hozzá: PutUserIT
4 sample-service ISampleRest interface-e. A testsuite-ban külön pom tartozik hozzá: project-testsuite-sample-service-sample-rest
5 IUserRest._getSample() operáció. Testsuite-ban a sample-rest pom alatt saját tesztosztály tartozik hozzá: GetSampleIT

2. Konfigurációs paraméterek

A tesztek microprofile-config segítségével paraméterezhetőek, ehhez elegendő, ha a teszt osztály kiterjeszti a BaseConfigurableWeldIT vagy a BaseWeldUnitType absztrakt osztályt; majd a megszokott módon CDI-on keresztül inject-eljük a kívánt konfig paramétert. A konfigurációs paraméterek META-INF/roaster-defaults.yml konfigurációs yaml fájlon keresztül beállíthatóak. A roaster-defaults.yml yaml mellé létrehozhatunk külön profile-okra alkalmazandó yml-oket is roaster-{profile}.yml néven, a futtandó profil(oka)t valamely default mp-config forráson keresztül állíthatjuk be a profile kulccsal. Megadható több profil is vesszővel (,) elválasztva. Ilyenkor a konfig kulcsok felolvasása mindig a legelső profil-al kezdődik és az utolsó találatig tart.

Amennyiben szükséges a mp-config megengedi uj config-source-ok felvételét. Így ha a projekt igényli lehetséges az ETCD-ből vagy DB-ből felolvasott konfigok használata.

Példa:

META-INF/roaster-defaults.yml
roaster:
    test:
        sample:
            url: http://roaster-default.hu
            port: 8083
            pass: secret
META-INF/roaster-local.yml
roaster:
    test:
        sample:
            url: http://localhost
            port: 8084
META-INF/roaster-sandbox.yml
roaster:
    test:
        sample:
            url: http://roaster-sandbox.hu
GetSampleIT.java
@DisplayName("Testing Sample Rest")
@Tag(TestSuiteGroup.RESTASSURED)
public class GetSampleIT extends BaseConfigurableWeldIT {

    @Inject
    @ConfigProperty(name = "roaster.test.sample.url")
    private String sampleUrl;
    @Inject
    @ConfigProperty(name = "roaster.test.sample.port")
    private Integer samplePort;
    @Inject
    @ConfigProperty(name = "roaster.test.sample.pass")
    private Integer samplePass;
Profile futtatás
~/project-backend/project-testsuite$ mvn verify -Dprofile=sandbox,local (1)
1 profile futtatás: beolvasott yaml-ok sorrendje: roaster-sandbox.yml, roaster-local.yml, roaster-defaults.yml

Felolvasott értékek:

  • sampleUrl = http://roaster-sandbox.hu (roaster-sandbox.yml konfigból)

  • samplePort = 8084 (roaster-sandbox.yml-ben nincs, ezért roaster-local.yml konfigból)

  • samplePass = secret (roaster-sandbox.yml és roaster-local.yml-ben nincs, ezért roaster-defaults.yml konfigból)

3. Modulok:

3.1. API

Az API modul használatához csak be kell hivatkozni a pom.xml-ben

pom.xml
<dependency>
    <groupId>hu.icellmobilsoft.roaster</groupId>
    <artifactId>roaster-api</artifactId>
</dependency>

3.1.1. API használata

3.1.1.1. BaseBuilder

A request builder-ek közös ősének van szánva ez az osztály.

Példa implementáció
public class ExampleQueryRequestBuilder extends BaseBuilder<ExampleQueryRequest> {

    public Foo getFoo() {
        if (getDto() == null) {
            setDto(createEmpty());
        }
        return getDto().getFoo();
    }

    @Override
    public ExampleQueryRequest createEmpty() {
        return new ExampleQueryRequest();
    }
}

3.2. Jaxrs

A Jaxrs modul használatához csak be kell hivatkozni a pom.xml-ben

pom.xml
<dependency>
    <groupId>hu.icellmobilsoft.roaster</groupId>
    <artifactId>roaster-jaxrs</artifactId>
</dependency>

3.2.1. Jaxrs használata

A teszt fájlok a JakartaEE JAX-RS specifikációt követik, konktrétan a RestEasy implementációját használák.

3.2.1.1. RestAssured default beállításai

Alapértelmezetten XML vagy JSON formátumra van támogatás a rendszerben.

JSON response beállítások
  • A response HTTP status 200 és "application/json" accept.

XML response beállítások
  • A response HTTP status 200 és "application/xml" accept.

3.2.1.2. ResponseProcessor
Implementálása

Egy adott endpoint tesztelésének segítésére született meg a hu.icellmobilsoft.roaster.jaxrs.response.ResponseProcessor absztrakt osztály. Leszármazástatáskor meg kell adni a Response típusát generikus paraméterben, valamint implementálni kell 2 String-et visszaadó metódust, hogy az endpoint-ot azonosítsuk:

  • baseUriKey: A Roaster konfigurációban használt kulcs, ami megadja az endpoint baseUri-jét

  • path: Az endpoint path. Pl.: http://localhost/foo/bar esetén: /foo/bar

Opcionálisan az osztály többi metódusa is felülírható, hogy a request-et vagy a response foldolgozását személyre szabhassuk.

Használata

A ResponseProcessor implementáció getOctetStream, postMultipartJson, postMultipartXml, stb. metódusait használva tudjuk meghívni az endpoint-ot és automatán parse-olni a választ.

3.2.1.3. ConfigurableResponseProcessor

Annak érdekében, hogy ne kelljen minden rest végponthoz külön ResponseProcessor-t implementálni, létrejött a ConfigurableResponseProcessor osztály, ami konfigurációból olvassa ki a szükséges értékeket például a baseUriKey-t és a path-t.

Használata

A konfigurációban fel kell venni közös prefix alá a baseUriKey-t és a path-t. Opcionálisan itt headers is megadható. YAML formátum esetén ez így néz ki:

testsuite:
    rest:
        exampleService:
            example:
                baseUriKey: example-project.example-service.url
                path: /rest/exampleService/example/{id}
            headerExample:
                baseUriKey: example-project.example-service.url
                path: /rest/exampleService/example/{id}
                headers:
                    - "X-LANGUAGE: hu"
                    - "User-Agent: roaster/0.8 restassured"

A tesztosztályba a ConfigurableResponseProcessor-t a @RestProcessor qualifier-rel lehet inject-álni a konfig prefixet megadva:

import hu.icellmobilsoft.roaster.jaxrs.response.producer.impl.ConfigurableResponseProcessor;

class ExampleTest {
    @Inject
    @RestProcessor(configKey = "testsuite.rest.exampleService.example") (1)
    private ConfigurableResponseProcessor<ExampleResponse> responseProcessor;

    @Inject
    @RestProcessor(
            configKey = "testsuite.rest.exampleService.example",
            expectedStatusCode = HttpStatus.SC_BAD_REQUEST (2)
    )
    private ConfigurableResponseProcessor<ExampleResponse> badRequestResponseProcessor;

    void test() {
        MultipartFormDataOutput multipartbody = new MultipartFormDataOutput();
        multipartbody.addFormData("part1", "part1Body", javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE);
        multipartbody.addFormData("part2", "part2Body", javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE);
        String response = processor.postMultipartJson(multipartbody, String.class, "jsonEntityId");
        Assertions.assertEquals(JsonUtil.toJson(RESPONSE_DTO), response);
    }
}
1 Alap ConfigurableResponseProcessor inject példa
2 Opcionálisan az elvárt válasz státusz kód is megadható az annotációban (default: 200 OK)
3 ConfigurableResponseProcessor-ban a query paramétereket is meg lehet adni
Saját implementáció

Ha az adott projekten belül ki szeretnénk egészíteni a ConfigurableResponseProcessor működését (pl: login, vagy egyéb projekt specifikus header kezeléshez), azt első lépésben az AbstractConfigurableResponseProcessor implementálásával tehetjük meg:

import hu.icellmobilsoft.roaster.jaxrs.response.producer.spi.AbstractConfigurableResponseProcessor;

@Dependent
public class CustomConfigurableResponseProcessor<RESPONSE> extends AbstractConfigurableResponseProcessor<RESPONSE> {

    // Felülírunk amit kell...
}

Ezek után egy CDI producer-t kell létrehozni, ami kiszolgálja a konfigurált példányokat:

import hu.icellmobilsoft.roaster.jaxrs.response.producer.spi.AbstractConfigurableResponseProcessorProducer;

@Dependent
public class CustomConfigurableResponseProcessorProducer<RESPONSE> extends AbstractConfigurableResponseProcessorProducer<LoginConfigurableResponseProcessor<RESPONSE>> {
    @Override
    @Produces (1)
    @RestProcessor(configKey = "")
    public CustomConfigurableResponseProcessor<RESPONSE> createCustomResponseProcessor(InjectionPoint injectionPoint) {
        return super.createConfiguredResponseProcessor(injectionPoint);
    }

    @Override
    protected CustomConfigurableResponseProcessor<RESPONSE> getBaseResponseProcessor() { (2)
        return CDI.current().select(CustomConfigurableResponseProcessor.class).get();
    }
}
1 Létre kell hozni egy producer-t (a createCustomResponseProcessor-t meghívva már egy bekonfigurált példányt kapunk)
2 Felül kell írni a getBaseResponseProcessor-t, hogy a mi típusunkat adja vissza (ezt fogja a createCustomResponseProcessor konfigurálni)

Ez után már használhatjuk is a saját impelmentációnkat, akár a default megoldással együtt, egy tesztben is:

import hu.icellmobilsoft.roaster.jaxrs.response.producer.impl.ConfigurableResponseProcessor;

class ExampleTest {
    @Inject
    @RestProcessor(configKey = "testsuite.rest.exampleService.example")
    private CustomConfigurableResponseProcessor<ExampleResponse> customResponseProcessor;
...
}

3.2.2. Microprofile Rest Client

Maga a Microprofile Rest Client a Jaxrs alapokat használja, így a jaxrs implementációk is natívan támogatják. RestEasy esetében például itt: MicroProfile Rest Client olvasható konkrétabb leírás.

A Roaster dependency támogatást nyújt a MicroProfile Rest Client használathoz.

Egyszerű MicroProfile Rest Client API minta
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

import hu.icellmobilsoft.coffee.dto.common.commonservice.BaseRequest;
import hu.icellmobilsoft.coffee.dto.exception.BaseException;

@RegisterRestClient
public interface TestMpRestApi {

    @POST
    @Path("/mp/rest/client/post")
    @Produces(value = { MediaType.APPLICATION_JSON })
    @Consumes(value = { MediaType.APPLICATION_JSON })
    String testPost(BaseRequest baseRequest) throws BaseException;
}
MicroProfile Rest Client API használata
TestMpRestApi testMpRestApiImpl = RestClientBuilder.newBuilder()
    // set URI
    .baseUri(URI.create(System.getProperty(URI_KEY)))
    // build API interface
    .build(TestMpRestApi.class);
String response = testMpRestApiImpl.testPost(DtoHelper.createBaseRequest());

3.3. RestAssured

A RestAssured modul használatához csak be kell hivatkozni a pom.xml-ben

pom.xml
<dependency>
    <groupId>hu.icellmobilsoft.roaster</groupId>
    <artifactId>roaster-restassured</artifactId>
</dependency>

3.3.1. RestAssured használata

A teszt fájlok a következő mintát követik:

@DisplayName("Testing XY service hu.icellmobilsoft.project.sample.service.rest.test.ISampleTestRest.postSampleRquest")
@Tag(TestSuiteGroup.RESTASSURED)
public class PostSampleRequestIT extends BaseConfigurableWeldIT {

    @Inject
    @ConfigProperty(name = "service.sample.uri")
    private String baseUri;

    @Inject
    @JSON
    private RequestSpecification requestSpecification;

    @Inject
    @JSON
    private ResponseSpecification responseSpecification;

    @ParameterizedTest
    @CsvSource({ "1, 1, 2", "2, 3, 5", })
    @ExplicitParamInjection
    void test(int a, int b, int expectedSum) {
      Assertions.assertEquals(expectedSum, a + b);
    }

    @Test
    @DisplayName("Testing opg generator json rest")
    void testSampleRest() {
        SampleRequest body = new SampleRequest();

        SampleResponse actual = RestAssured
                // given
                .given()//
                .spec(requestSpecification)//
                .config(restAssuredConfig).body(body) //
                .baseUri(baseUri) //
                // when
                .when()//
                .log().all()//
                .post("/sample")
                // then
                .then()//
                .log().all()//
                .spec(responseSpecification)//
                .extract().response().getBody().as(SampleResponse.class);
        Assertions.assertEquals(FunctionCodeType.OK, actual.getFuncCode());
    }
}
3.3.1.1. RestAssured default beállításai

Alapértelmezetten XML vagy JSON formátumra van támogatás a rendszerben. A beállításokat a következő osztályok kezelik:

  • RestAssuredConfigProducer

  • RequestSpecificationProducer

  • ResponseSpecificationProducer

Mind szabadon módosíthatóak az implementáló projekten.

JSON default beállításai
  • A request content-type és accept "application/json".

  • A response HTTP status 200 és "application/json" accept.

  • A default beállításokat a Jackson2ObjectMapperFactoryImpl foglalja össze.

Ha igény van egy saját ObjectMapperConfig-ra, mint ami a ObjectMapperConfigProducer-ben keletkezik, akkor minta megoldásnak használható például:

@Inject
@JSON
private RestAssuredConfig restAssuredConfig;

((Jackson2ObjectMapperFactoryImpl) restAssuredConfig.getObjectMapperConfig().jackson2ObjectMapperFactory()).getObjectMapper()
        .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
XML default beállításai
  • Kódolás UTF-8.

  • A request content-type és accept "application/xml".

  • A response HTTP status 200 és "application/xml" accept.

3.3.1.2. ResponseProcessor
Implementálása

Egy adott endpoint tesztelésének segítésére született meg a ResponseProcessor absztrakt osztály. Leszármazástatáskor meg kell adni a Response típusát generikus paraméterben, valamint implementálni kell 2 String-et visszaadó metódust, hogy az endpoint-ot azonosítsuk:

  • baseUriKey: A Roaster konfigurációban használt kulcs, ami megadja az endpoint baseUri-jét

  • path: Az endpoint path. Pl.: http://localhost/foo/bar esetén: /foo/bar

Opcionálisan az osztály többi metódusa is felülírható, hogy a request-et vagy a response foldolgozását személyre szabhassuk. Például a createRequestSpecification metódust felülírva módosíthatjuk a request header-öket, sütiket, stb.

Használata

A ResponseProcessor implementáció getJson, postJson, getXml, postXml metódusait használva tudjuk meghívni az endpoint-ot és automatán parse-olni a választ.

Példa
public class ExampleQueryResponseProcessor extends ResponseProcessor<ExampleQueryResponse> {

    @Override
    public String baseUriKey() {
        return "example-project.example-service.url"; // értéke pl.: http://localhost:8080
    }

    @Override
    public String path() {
        return "/example/foo/{id}";
    }

    @Override // Példa extra header hozzáadására
    protected RequestSpecification createRequestSpecification(RequestSpecification initRequestSpecification) {
        return super.createRequestSpecification(initRequestSpecification)
                .header("Authorization", "Basic dXNlcjpwYXNz");
    }

    public ExampleQueryResponse queryWithJson(String id) {
        return getJson(ExampleQueryResponse.class, id);
    }

    public ExampleQueryResponse queryWithXml(String id) {
        return getXml(ExampleQueryResponse.class, id);
    }
}
3.3.1.3. ConfigurableResponseProcessor

Annak érdekében, hogy ne kelljen minden rest végponthoz külön ResponseProcessor-t implementálni, létrejött a ConfigurableResponseProcessor osztály, ami konfigurációból olvassa ki a szükséges értékeket például a baseUriKey-t és a path-t.

Használata

A konfigurációban fel kell venni közös prefix alá a baseUriKey-t és a path-t. Opcionálisan itt headers is megadható. YAML formátum esetén ez így néz ki:

testsuite:
    rest:
        exampleService:
            example:
                baseUriKey: example-project.example-service.url
                path: /rest/exampleService/example/{id}
            headerExample:
                baseUriKey: example-project.example-service.url
                path: /rest/exampleService/example/{id}
                headers:
                    - "X-LANGUAGE: hu"
                    - "User-Agent: roaster/0.5 restassured"

A tesztosztályba a ConfigurableResponseProcessor-t a @RestProcessor qualifier-rel lehet inject-álni a konfig prefixet megadva:

import hu.icellmobilsoft.roaster.restassured.response.producer.impl.ConfigurableResponseProcessor;

class ExampleTest {
    @Inject
    @RestProcessor(configKey = "testsuite.rest.exampleService.example") (1)
    private ConfigurableResponseProcessor<ExampleResponse> responseProcessor;

    @Inject
    @RestProcessor(
            configKey = "testsuite.rest.exampleService.example",
            expectedStatusCode = HttpStatus.SC_BAD_REQUEST (2)
    )
    private ConfigurableResponseProcessor<ExampleResponse> badRequestResponseProcessor;

    void test() {
        responseProcessor.setQueryParams(Map.of("foo", "42")); (3)
        ExampleResponse response = responseProcessor.getJson(ExampleResponse.class, "XXX");
        // asserts...
    }
}
1 Alap ConfigurableResponseProcessor inject példa
2 Opcionálisan az elvárt válasz státusz kód is megadható az annotációban (default: 200 OK)
3 ConfigurableResponseProcessor-ban a query paramétereket is meg lehet adni
Saját implementáció

Ha az adott projekten belül ki szeretnénk egészíteni a ConfigurableResponseProcessor működését (pl: login, vagy egyéb projekt specifikus header kezeléshez), azt első lépésben az AbstractConfigurableResponseProcessor implementálásával tehetjük meg:

import hu.icellmobilsoft.roaster.restassured.response.producer.spi.AbstractConfigurableResponseProcessor;

@Dependent
public class LoginConfigurableResponseProcessor<RESPONSE> extends AbstractConfigurableResponseProcessor<RESPONSE> {
    @Inject
    private LoginHandler loginHandler;

    @Override
    protected RequestSpecification createRequestSpecification(RequestSpecification initRequestSpecification) {
        loginHandler.login();
        return super.createRequestSpecification(initRequestSpecification)
                .headers(loginHandler.loginHeaders());
    }
}

Ezek után egy CDI producer-t kell létrehozni, ami kiszolgálja a konfigurált példányokat:

import hu.icellmobilsoft.roaster.restassured.response.producer.spi.AbstractConfigurableResponseProcessorProducer;

@Dependent
public class LoginConfigurableResponseProcessorProducer<RESPONSE> extends AbstractConfigurableResponseProcessorProducer<LoginConfigurableResponseProcessor<RESPONSE>> {
    @Override
    @Produces (1)
    @RestProcessor(configKey = "")
    public LoginConfigurableResponseProcessor<RESPONSE> createLoginResponseProcessor(InjectionPoint injectionPoint) {
        return super.createConfiguredResponseProcessor(injectionPoint);
    }

    @Override
    protected LoginConfigurableResponseProcessor<RESPONSE> getBaseResponseProcessor() { (2)
        return CDI.current().select(LoginConfigurableResponseProcessor.class).get();
    }
}
1 Létre kell hozni egy producer-t (a getConfiguredResponseProcessor-t meghívva már egy bekonfigurált példányt kapunk)
2 Felül kell írni a getBaseResponseProcessor-t, hogy a mi típusunkat adja vissza (ezt fogja a getConfiguredResponseProcessor konfigurálni)

Ez után már használhatjuk is a saját impelmentációnkat, akár a default megoldással együtt, egy tesztben is:

import hu.icellmobilsoft.roaster.restassured.response.producer.impl.ConfigurableResponseProcessor;

class ExampleTest {
    @Inject
    @RestProcessor(configKey = "testsuite.rest.exampleService.example")
    private LoginConfigurableResponseProcessor<ExampleResponse> loginResponseProcessor;

    @Inject
    @RestProcessor(
            configKey = "testsuite.rest.exampleService.example",
            expectedStatusCode = HttpStatus.SC_UNAUTHORIZED
    )
    private ConfigurableResponseProcessor<ExampleResponse> noLoginResponseProcessor;
}

3.4. REDIS

A REDIS modul használatához csak be kell hivatkozni a pom.xml-ben

pom.xml
<dependency>
    <groupId>hu.icellmobilsoft.roaster</groupId>
    <artifactId>roaster-redis</artifactId>
</dependency>

3.4.1. REDIS Konfigurációs paraméterek

A microprofile-config segítségével paraméterezhetőek a REDIS eléréséhez szükséges adatok.

Példák:

META-INF/microprofile-config.properties
coffee.redis.default.host=example.com
coffee.redis.default.port=6379
coffee.redis.default.password=redispass
coffee.redis.default.database=0
coffee.redis.default.pool.maxtotal=128
coffee.redis.default.pool.maxidle=32
META-INF/roaster-defaults.yml
coffee:
    redis:
        default:
            host: example.com
            port: 6379
            password: redispass
            database: 0
            pool:
                maxtotal: 128
                maxidle: 32

3.4.2. REDIS használata

Először is injektálni kell a handler osztályt.

Handler injektálása
    @Inject
    private RedisHandler redisHandler;
3.4.2.1. RedisHandler műveletei

A RedisHandler-en keresztül érhetőek el a műveletek, amik meghívásakor mindig létrejon CDI-t használva, a redisConfigKey által meghatározott adatokkal egy RedisService, aminek továbbítva vannak a műveletek.

A redisConfigKey a microprofile-config.properties-ben megadott kulcsokban szereplő harmadik tag, pl: coffee.redis.default.host → default

RedisService-től átvett műveletek:

  • getRedisData(redisConfigKey, valueKey, class)

  • getRedisDataOpt(redisConfigKey, valueKey, class)

  • setRedisData(redisConfigKey, valueKey, redisData)

  • setRedisDataExp(redisConfigKey, valueKey, secondsToExpire, redisData)

  • removeRedisData(redisConfigKey, valueKey)

  • removeAllRedisData(redisConfigKey, List<valueKey>)

  • removeAllRedisData(redisConfigKey)

művelet hívásokra példa
String data = redisHandler.getRedisData("default", "1234", String.class);
String newData = redisHandler.setRedisData("default", "1234", "new data");
redisHandler.removeAllRedisData("default");

3.5. Oracle DB

A Oracle DB modul használatához csak be kell hivatkozni a pom.xml-ben

pom.xml
<dependency>
    <groupId>hu.icellmobilsoft.roaster</groupId>
    <artifactId>roaster-oracle</artifactId>
</dependency>

3.5.1. Oracle DB Konfigurációs paraméterek

A microprofile-config segítségével paraméterezhetőek az Oracle DB eléréséhez szükséges adatok.

Példák:

META-INF/microprofile-config.properties
roaster.datasource.oracle.application.url=jdbc:oracle:thin:@//oracle.icellmobilsoft.hu:1521/sample
roaster.datasource.oracle.application.user=db_user
roaster.datasource.oracle.application.password=db_pass
META-INF/roaster-defaults.yml
roaster:
    datasource:
        oracle:
            application:
                url: jdbc:oracle:thin:@//oracle.icellmobilsoft.hu:1521/sample
                user: db_user
                password: db_pass
                maximumPoolSize: 10 (1)
1 (Opcionális) a connection pool max mérete (default: 5)

3.5.2. OracleJDBCSelectorService használata

Először is injektálni kell a service osztályt.

OracleJDBCSelectorService injektálása
    @Inject
    @DBConnection(configKey = DBConstants.Schema.APPLICATION)
    private OracleJDBCSelectorService service;
3.5.2.1. OracleJDBCSelectorService műveletei

A OracleJDBCSelectorService-en keresztül érhetőek el a műveletek, amik meghívásakor, ha még nem létezik nyitott kapcsolat, létrehoz egy újat az adatbázissal, majd a művelet végén be is zárja azt.

A selecttel kezdődő metódusok, csak SELECT-tel kezdődő sql utasításokat fogadnak be! A selectFirst pedig, ha több találat jön DBből, akkor csak az első sort adja vissza.
  • selectFirstStringValue(sql select string, columnName)

  • selectFirstIntegerValue(sql select string, columnName)

  • selectFirstBooleanValue(sql select string, columnName)

  • selectFirstBigDecimalValue(sql select string, columnName)

  • selectFirstDateValue(sql select string, columnName)

  • selectRowCount(sql select string)

  • selectFirstObject(sql select string, converter)

  • selectAllObjects(sql select string, converter)

művelet hívásokra példa
String name = service.selectFirstStringValue("SELECT * FROM EXAMPLE WHERE X__ID = '0'", "NAME");
int rowCount = service.selectRowCount("SELECT * FROM EXAMPLE WHERE X__ID = '0'");
List<Example> exampleList = service.selectAllObjects("SELECT * FROM EXAMPLE", exampleConverter::convert);
Converter-re példa
private T convert(ResultSet rs) throws BaseException {
    try {
        T t = new T();
        t.setId(rs.getString("X__ID"));
        t.setName(rs.getString("NAME"));
        return t;
    } catch (SQLException e) {
        throw new TechnicalException(e.getLocalizedMessage());
    }
}
3.5.2.2. Kapcsolat kezeléshez szükséges metódusok
  • getJdbcConnection()

  • setJdbcConnection(JDBCConnection)

  • close

3.6. TM4J

A modul célja, hogy az automatán futtatott tesztesetek eredménye automatikusan jelentve legyen egy bekonfigurált TM4J (Test Management for Jira) szerverre.

3.6.1. Konfiguráció

META-INF/roaster-defaults.yml
roaster:
   tm4j:
      enabled: true (1)
      projectKey: ABC (2)
      testCycleKey: ABC-C1 (3)
      environment: sandbox (4)
      server/mp-rest/url: https://jira.example.com (5)
      server/basicAuthToken: ZXhhbXBsZS11c2VyOnNlY3JldA== (6)
      server/userName: (7)
      server/password:
      cycle:
         foo: ABC-C2 (8)
         bar: ABC-C3
1 A TM4J szerver hívást lehet kikapcsolni ezzel a flag-gel (default: false)
2 Jira project key. Ez szokott a Jira issue-k prefixe is lenni.
3 TM4J test cycle key. Pl.: ABC-C1 ahol az ABC a project key.
4 (Opcionális) A neve az aktuális környezetnek, ahol a tesztek futnak. (Jira-ban létre kell hozni)
5 TM4J szerver url
6 base64(userName + ":" + password)
7 A szerver autentikációs adatok megadásához lehet használni a server/userName + server/password vagy a server/basicAuthToken paramétert
8 Teszt tag-enként eltérő TM4J test cycle-ök megadási lehetősége. Ha a teszt meg van tag-elve egy olyan tag-gel (JUnit 5-ben @Tag("foo")), ami itt szerepel, akkor a default test cycle (testCycleKey konfig kulcs) helyett az itt megadott cycle-be fog report-álni. Ha több tag van egy teszten, akkor mindegyik cycle-be bekerül az eredmény.
Biztonsági okokból célszerű a basicAuthToken-t és a jelszót nem a konfigurációs fájlba beleírni, hanem parancssori argumentumként átadni a maven-nek.
Pl.: $ mvn test -Droaster.tm4j.server/password=secret

3.6.2. Használtata JUnit 5-tel

A modul használatához hozzá kell adni az alábbi maven függőséget a pom.xml-hez:

pom.xml
<dependency>
    <groupId>hu.icellmobilsoft.roaster</groupId>
    <artifactId>roaster-tm4j-junit5</artifactId>
</dependency>

Ez után már csak fel kell annotálni azokat a teszt osztályokat/metódusokat amelyek eredményét jelenteni szeretnénk:

@ExtendWith(Tm4jExtension.class) // TM4J extension aktiválása a tesztosztályon
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class ExampleTest extends BaseWeldUnitType {
    @Test
    @TestCaseId("ABC-T1") // TM4J teszteset összerendelés
    void testOne() {
        assertTrue(1 + 1 == 2);
    }
}

3.7. Zephyr Scale Cloud

A modul célja, hogy az automatán futtatott tesztesetek eredménye automatikusan jelentve legyen egy felhőben futó JIRA felületen Zephyr Scale Cloud környezeten.

3.7.1. Konfiguráció

META-INF/roaster-defaults.yml
roaster:
   zephyr:
      enabled: true (1)
      projectKey: ABC (2)
      testCycleKey: ABC-C1 (3)
      environment: sandbox (4)
      server/mp-rest/url: https://jira.example.com (5)
      server/authToken: ZXhhbXBsZS11c2VyOnNlY3JldA== (6)
      server/email: tim@examplemail.com (7)
      server/apiToken: dGltQGV4YW1wbGVtYWlsLmNvbTpteUFwaUtleQ== (8)
      cloud/bearerToken: jwtBearerToken (9)
      cycle:
         foo: ABC-C2 (10)
         bar: ABC-C3
1 A TM4J szerver hívást lehet kikapcsolni ezzel a flag-gel (default: false)
2 Jira project key. Ez szokott a Jira issue-k prefixe is lenni.
3 TM4J test cycle key. Pl.: ABC-C1 ahol az ABC a project key.
4 (Opcionális) A neve az aktuális környezetnek, ahol a tesztek futnak. (Jira-ban létre kell hozni)
5 Remote Jira szerver url
6 base64(email + ":" + apiToken)
7 Jira felhasználóhoz kötött email cím. Ezzel a felhasználóval kell kigenerálni az apiToken-t és a bearerToken-t.
8 ApiToken a remote Jira funkcionalitások használatához. Jira profil felületen kell kigenerálni.
9 Zephyr Scale Bearer Token. Remote Jira felületen, a saját fülén kell generálni.
10 Teszt tag-enként eltérő TM4J test cycle-ök megadási lehetősége. Ha a teszt meg van tag-elve egy olyan tag-gel (JUnit 5-ben @Tag("foo")), ami itt szerepel, akkor a default test cycle (testCycleKey konfig kulcs) helyett az itt megadott cycle-be fog report-álni. Ha több tag van egy teszten, akkor mindegyik cycle-be bekerül az eredmény.

A tokenek generálásáról részletesebb leírás az alább linkeken:

Biztonsági okokból célszerű az authToken-t és az api tokeneket nem a konfigurációs fájlba beleírni, hanem parancssori argumentumként átadni a maven-nek.
Pl.: $ mvn test -Droaster.zephyr.server/authToken=secret

3.7.2. Használtata JUnit 5-tel

A modul használatához hozzá kell adni az alábbi maven függőséget a pom.xml-hez:

pom.xml
<dependency>
    <groupId>hu.icellmobilsoft.roaster</groupId>
    <artifactId>roaster-zephyr-junit5</artifactId>
</dependency>

Ez után már csak fel kell annotálni azokat a teszt osztályokat/metódusokat amelyek eredményét jelenteni szeretnénk:

@ExtendWith(ZephyrExtension.class) // Zephyr extension aktiválása a tesztosztályon
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class ExampleTest extends BaseWeldUnitType {
    @Test
    @TestCaseId("ABC-T1") // Zephyr teszteset összerendelés
    void testOne() {
        assertTrue(1 + 1 == 2);
    }
}

3.8. Selenide

A Selenide modul használatához csak be kell hivatkozni a pom.xml-ben

pom.xml
<dependency>
    <groupId>hu.icellmobilsoft.roaster</groupId>
    <artifactId>roaster-selenide-api</artifactId>
</dependency>

A Selenide modul nem használható Internet Explorerrel!!

3.8.1. Selenide Konfigurációs paraméterek

A microprofile-config segítségével paraméterezhetőek a Selenide valamint a WebDriver paraméterei.

Példák:

META-INF/microprofile-config.properties
roaster.selenide.homepage=https://google.com
roaster.selenide.timeout=3000
roaster.selenide.selenium.url=https://localhost:9999/wd/hub
roaster.selenide.browser.type=chrome
roaster.selenide.browser.headless=true
roaster.selenide.browser.device=Galaxy S5
roaster.selenide.browser.decision.width=1024
roaster.selenide.browser.decision.height=768
META-INF/roaster-defaults.yml
# Minimal Roaster config for Selenide
roaster:
  selenide:
    homepage: https://google.com # böngészőben megnyíló oldal címe
    timeout: 3000 # alap timeoutja a WebDrivernek
    selenium:
      url: # wd hub linkje ha remote webdriverrel szükséges futtatni a teszteket
    browser:
      type: chrome # lehetséges értékek: chrome, edge, opera, safari
      headless: false
      device: # Galaxy S5 vagy iPad Pro (Lehetőségeket lásd itt: https://github.com/DevExpress/device-specs/blob/master/devices.md)
      decision:
        width: # példa 1024
        height: # példa: 768

Fontos megjegyezni, hogyha a roaster.selenide.selenium.url nincs kitöltve, akkor nem remote módban indul.

Fontos megjegyezni, hogyha a roaster.selenide.browser.device kivan töltve, akkor chrome böngésző indul el, és a device-hoz beírt nevű eszközt emulálva próbál a chrome elindulni. Fontos ehhez a beállításhoz megjegyezni, hogy mivel az emulált eszköznek fix képernyő nagysága van, az lesz használva, ilyenkor nem veszi figyelembe a felbontási beállításokat.

Fontos megjegyezni, hogyha a roaster.selenide.browser.device.width és roaster.selenide.browser.device.height ki van töltve akkor a böngésző nem lesz a képernyőhöz igazítva.

3.8.2. Használati példa

GoogleIcellMobilsoftTest példa osztály
@Tag(TestSuiteGroup.SELENIDE)
@Disabled("Only for testing!!!")
public class GoogleIcellMobilsoftTest extends BaseSelenideTestCase {

    @Test
    @DisplayName("Search 'icellmobilsoft' word on Google.com")
    @Disabled("Only for testing!!!")
    public void testGoogleWithIcellmobilsoftSearch() {
        // You don't have to use Selenide.open(<url>), it come from configuration, and do it automatically
        SelenideElement qInput = Selenide.$("input[name='q']");
        qInput.setValue("icellmobilsoft").pressEnter();

        SelenideElement result = Selenide.$("div[id='search']");
        ElementsCollection resultList = result.$$("div[class='g'] a[href='https://icellmobilsoft.hu/hu/'");
        resultList.first().shouldHave(Condition.visible);
    }
}

3.8.3. Selenide Angular modul

A modul célja az Angular-ban használt komplexebb komponensek támogatása.

Használatához a következő maven modult kell bekötni:

pom.xml
<dependency>
    <groupId>hu.icellmobilsoft.roaster</groupId>
    <artifactId>roaster-selenide-angular</artifactId>
</dependency>

Jelenleg támogatott komponensek:

3.8.3.1. <mat-checkbox>
példa
MatCheckbox checkbox = new MatCheckbox(Selenide.$(MatCheckbox.TAG_NAME));
assertFalse(checkbox.getValue());
checkbox.toggle();
assertTrue(checkbox.getValue());
3.8.3.2. <mat-radio-group>
példa
MatRadioGroup radioGroup = new MatRadioGroup(Selenide.$(MatRadioGroup.TAG_NAME));
assertTrue(radioGroup.getSelected().isEmpty());
radioGroup.select("Option 2");
assertEquals("Option 2", radioGroup.getSelected().orElseThrow());
assertIterableEquals(List.of("Option 1", "Option 2"), radioGroup.getOptions());
3.8.3.3. <mat-select>
példa
MatSelect multiSelect = new MatSelect(Selenide.$("#select-multiple " + MatSelect.TAG_NAME));
multiSelect.select("Onion", "Pepperoni");
assertIterableEquals(List.of("Onion", "Pepperoni"), multiSelect.getSelected());
multiSelect.select("Tomato");
assertIterableEquals(List.of("Tomato"), multiSelect.getSelected());
assertEquals(6, multiSelect.getOptions().size());
3.8.3.4. <mat-slide-toggle>
példa
MatSlideToggle checkbox = new MatSlideToggle(Selenide.$(MatSlideToggle.TAG_NAME));
assertFalse(checkbox.getValue());
checkbox.toggle();
assertTrue(checkbox.getValue());

3.9. Hibernate

A Hibernate modul használatához első sorban be kell hivatkozni a pom.xml-ben a következő függőséget:

pom.xml
<dependency>
    <groupId>hu.icellmobilsoft.roaster</groupId>
    <artifactId>roaster-hibernate</artifactId>
</dependency>

Ezen kívül szükséges még hozzá a megfelelő jdbc driver hozzáadása, mely felhasználási helyenként eltérhet. Javasolt a következők használata:

pom.xml Oracle19 esetén
        <dependency>
            <groupId>com.oracle.ojdbc</groupId>
            <artifactId>ojdbc10</artifactId>
            <version>19.3.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.oracle.ojdbc</groupId>
            <artifactId>orai18n</artifactId>
            <version>19.3.0.0</version>
        </dependency>
pom.xml Mysql esetén
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
pom.xml H2 esetén
        <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.200</version>
        </dependency>
pom.xml PostgreSQL esetén
        <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
        <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.18</version>
        </dependency>

Ezen kívül a következő konfigurációkat kell elvégezni:

3.9.1. Hibernate Konfigurációs paraméterek

A hibernate használatához projekt szinten szükséges létrehozni a resource-ok közt a META-INF mappában a persistence.xml-t. Ha a defaultPU névvel van létrehozva (ahogy a példában), akkor az EntityManager extra annotáció nélkül inject-telhető.

Példák:

META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">

    <persistence-unit name="defaultPU">
        <mapping-file>META-INF/jpa-entity.xml</mapping-file>
    </persistence-unit>
</persistence>
A persistence.xml-be szükséges megadni az entitásokat mindenképpen! További egyedi beállításhoz egyszerű leírás itt található: https://vladmihalcea.com/jpa-persistence-xml/ Ami a microprofile-config-on keresztül megadásra kerül azok lesznek használva, felülírva a persistence.xml -ben lévő azonos property-ket. Ha egy adott rész nincs a microprofile-config-on beállítva, de a persistence.xml-ben igen, akkor a megadottak lesznek érvényesek.

A microprofile-config segítségével paraméterezhetőek a Hibernate beállítási adatok:

Példák:

META-INF/microprofile-config.properties
roaster.hibernate.defaultPU.jdbc.driver=oracle.jdbc.OracleDriver
roaster.hibernate.defaultPU.jdbc.url=jdbc:oracle:thin:@//localhost:1521/XE
roaster.hibernate.defaultPU.jdbc.user=db_username
roaster.hibernate.defaultPU.jdbc.password=*****
roaster.hiberante.defaultPU.jdbc.log_warnings=true
roaster.hibernate.defaultPU.hibernate.default_schema=user_schema
roaster.hibernate.defaultPU.hibernate.dialect=org.hibernate.dialect.Oracle12cDialect
roaster.hibernate.defaultPU.hibernate.show_sql=true
roaster.hibernate.defaultPU.hibernate.format_sql=true
roaster.hiberante.defaultPU.hibernate.log_session_metrics=true
roaster.hiberante.defaultPU.hibernate.generate_statistics=true
META-INF/roaster-defaults.yml
  roaster:
    hibernate:
      defaultPU:
        jdbc:
          driver: oracle.jdbc.OracleDriver
          url: jdbc:oracle:thin:@//localhost:1521/XE
          user: db_username
          password: *****
          log_warnings: true
        hibernate:
          default_schema: user_schema
          dialect: org.hibernate.dialect.Oracle12cDialect
          show_sql: true
          format_sql: true
          log_session_metrics: true
          generate_statistics: true

3.9.2. Használati példa

HibernateTest példa osztály
public class HibernateTest extends BaseWeldUnitType {

    @Inject
    // A háttérben ez érvényesedik: @HibernatePersistenceConfig(persistenceUnitName = "defaultPU")
    private EntityManager userEntityManager;

    @Inject
    @HibernatePersistenceConfig(persistenceUnitName = "otherPu")
    private EntityManager otherEntityManager;

    @Test
    public void testEntityManager() {
        Assertions.assertNotNull(userEntityManager);
        SecurityUser securityUser = userEntityManager.find(SecurityUser.class, "0");
        Assertions.assertNotNull(securityUser);
        Assertions.assertNotNull(otherEntityManager);
        OtherEntity other = userEntityManager.find(OtherEntity.class, "0");
        Assertions.assertNotNull(other);
    }


    @Test
    public void testUseEntityManager() {
        Assertions.assertNotNull(userEntityManager);

        User user = userEntityManager.find(User.class,"FD34123");
        Assertions.assertNotNull(user);

        CriteriaBuilder builder = userEntityManager.getCriteriaBuilder();
        CriteriaQuery<User> criteriaQuery = builder.createQuery(User.class);
        Root<User> root = criteriaQuery.from(User.class);
        criteriaQuery.select(root);
        List<Order> os = new ArrayList<>();
        os.add(builder.asc(root.get(User_.creationDate)));
        criteriaQuery.orderBy(os);
        TypedQuery<User> query = userEntityManager.createQuery(criteriaQuery);
        List<User> resultList = query.getResultList();
        // Assertions resultList

        CriteriaQuery<Long> countCriteriaQuery = builder.createQuery(Long.class);
        Root<User> countRoot = countCriteriaQuery.from(User.class);
        countCriteriaQuery.select(builder.count(countRoot));
        TypedQuery<Long> countQuery = userEntityManager.createQuery(countCriteriaQuery);
        Long count = countQuery.getSingleResult();
        // Assertions count
    }

}

3.10. Mongo DB

A Mongo DB modul használatához csak be kell hivatkozni a pom.xml-ben

pom.xml
<dependency>
    <groupId>hu.icellmobilsoft.roaster</groupId>
    <artifactId>roaster-mongodb</artifactId>
</dependency>

3.10.1. Konfigurációs paraméterek

A microprofile-config segítségével paraméterezhetőek a mongodb eléréséhez szükséges adatok.

Példa:

META-INF/roaster-defaults.yml
coffee:
    mongodb:
        default: (1)
            database: foobar
            uri: mongodb://user:pass@localhost:27017/?ssl=false (2)
1 Ez a configKey, amit a @MongoClientConfiguration annotációban kell használni
2 https://docs.mongodb.com/manual/reference/connection-string/

A database és url megadása kötölező. További hangolási beállítások is léteznek, melyekről a coffee dokumentációban lehet olvasni.

3.10.2. Használata

class MongoExampleIT extends BaseConfigurableWeldIT {

    @Inject
    @MongoClientConfiguration(configKey = "default")
    private Instance<MongoDbClient> mongoDbClientInstance;

    @Test
    void test() throws BaseException {
        MongoDbClient mongoDbClient = mongoDbClientInstance.get();

        // collection megadása
        mongoDbClient.initRepositoryCollection("example_collection");

        // egy elem beszúrása
        Object object = Map.of("foo", "bar");
        BasicDBObject dtoDocument = MongoUtil.jsonToBasicDbObject(MongoJsonUtil.toJson(object));
        mongoDbClient.insertOne(dtoDocument);

        // a beszúrt elem id-jának lekérdezése
        String id = dtoDocument.getString("_id");

        // keresés filter-rel
        BasicDBObject filter = new BasicDBObject();
        filter.put("_id", new ObjectId(id));
        BasicDBObject result1 = mongoDbClient.findFirst(filter);
        System.out.println(result1);

        // keresés id-val
        BasicDBObject result2 = mongoDbClient.findById(id);
        System.out.println(result2);
    }
}

4. Migrációs leírás

Következő szekció a verzió kiadások közötti változásokat írja le.

4.1. 0.1.0 → 0.2.0

4.1.2. Változások

4.1.2.1. roaster-restassured
  • A default JSON object mapper az idő értékeket ISO formátumra serializálja az eddigi "1600871093.907000000" helyett.

  • Megszünt a deprecated lehetőség

@Inject
private RestAssuredConfig restAssuredConfig;

Ezentúl már csak @JSON qualifier-el lehet használni

@Inject
@JSON
private RestAssuredConfig restAssuredConfig;
  • Weld konténer enableDiscovery() módban fut, nem szükséges külön hozzáadni az osztályokat.

  • hu.icellmobilsoft.roaster.restassured.BaseConfigurableWeldIT.configureWeld() depreceted lett.

4.1.2.2. Átállás

Az IT tesztekből ki kell venni az eddig manualisan hozzáadott bean-eket, egyébként "Bean name is ambiguous." hibaüzenetet kapunk.

@Deprecated
@Override
protected void configureWeld(Weld weld) {
    weld.addBeanClasses(SampleAction.class);
}
4.1.2.3. roaster-weldunit
  • Weld konténer enableDiscovery() módban fut, nem szükséges külön hozzáadni az osztályokat.

  • hu.icellmobilsoft.roaster.weldunit.BaseWeldUnitType.configureWeld() depreceted lett.

4.1.2.4. Átállás

A unit tesztekből ki kell venni az eddig manualisan hozzáadott bean-eket, egyébként "Bean name is ambiguous." hibaüzenetet kapunk.

@Deprecated
@Override
protected void configureWeld(Weld weld) {
    weld.addBeanClasses(SampleAction.class);
}

4.2. 0.2.0 → 0.3.0

4.2.1. Változások

4.2.1.1. Általános

coff:ee frissítés 1.2.1 → 1.3.0

4.2.1.2. roaster-hibernate

Az EntityManagerProducer osztályban az EntityManagerFactory injectálás törlésre került és a produceDefaultEntityManager() metódus magában állítja elő, amikor szükség van rá. Így mostantól már csak akkor jön létre alapértelmezett beállításokkal EntityManagerFactory, ha @HibernatePersistenceConfig annotáció nélkül injectálunk EntityManager-t.

4.2.1.3. Átállás

A változtatások nem eredményeznek átállási munkálatokat, visszafelé kompatibilis.

4.2.1.4. roaster-tm4j
  • Bugfix: Több teszt maven futtatása során már nem jön exception

  • Bugfix: TM4J Executed by értékét újra töltik a tesztek

  • TM4J environment értékét töltik a tesztek config paraméter alapján

4.2.1.5. Átállás
  • A tesztosztályt (vagy ősét) fel kell annotálni a következővel: @TestInstance(TestInstance.Lifecycle.PER_CLASS)

  • roaster.tm4j.environment config paraméterben megadott értéket létre kell hozni TM4J felületen amennyiben nem létezik

4.3. 0.3.0 → 0.4.0

4.3.1. Változások

4.3.1.1. Általános

coff:ee frissítés 1.3.0 → 1.5.0

4.3.1.2. roaster-tm4j
  • Bugfix: TM4J Executed by értékét töltésére a userKey-t használjuk a userName helyett.

4.3.1.3. roaster-restassured
  • A ResponseProcessor kiegészült a putXml, és putJson metódusokkal

4.3.1.4. Átállás

A változtatások nem eredményeznek átállási munkálatokat, visszafelé kompatibilis.

4.3.1.5. roaster-api
  • A FileUtil átkerült az újonnan létrehozott roaster-common-util-ba.

4.3.1.6. Átállás

A FileUtil-t érintő dependency és package változásokat szükséges átvezetni.

4.3.1.7. roaster-selenide
  • Bugfix: Konfigurációs paraméter felolvasásának javitása: headless browser run

  • Selenide verzió frissítés 5.15.0 → 5.22.2

4.4. 0.4.0 → 0.5.0

4.4.1. Változások

4.4.1.1. Általános

coff:ee frissítés 1.5.0 → 1.6.0

4.4.1.2. roaster-restassured
  • Microprofile konfigból állítható injektálható ResponseProcessor (@RestProcessor, ConfigurableResponseProcessor)

  • Az OpenAPITestHelper osztály testOpenAPI metódusa kiegészült expectedOpenapiVersion paraméterrel, hogy projekt szinten lehessen állítani. Túlterheléssel megmaradt az eredeti szintaxis is, ezt hívva alapértelmezetten 3.0.3 az elvárt openapi verzió.

  • Az OpenAPITestHelper osztályba bevezetésre került két felülírható metódus decorateRequestSpecification, decorateValidatableResponse. Default működés esetén request és response logolást intézi, projekt szinten kikapcsolható/konfigurálható a logolás az osztály leszármaztatásával.

    Példa response log kikapcsolásra
    @Model
    @Alternative
    @Priority(Interceptor.Priority.APPLICATION + 10)
    public class ProjectOpenApiTestHelper extends OpenAPITestHelper {
    
        @Override
        protected ValidatableResponse decorateValidatableResponse(ValidatableResponse validatableResponse) {
    //      return validatableResponse.log().all();
            return validatableResponse;
        }
    }
4.4.1.3. Átállás
  • OpenAPITestHelper.testOpenAPI(java.lang.String) a továbbiakban 3.0.1 helyett 3.0.3 OpenAPI verzióra futtat assertet. Amennyiben ez projekt szinten nem felel meg a OpenAPITestHelper.testOpenAPI(java.lang.String, java.lang.String) metódussal felülírható az elvárt verzió.

    Példa response log kikapcsolásra
        @Test
        @DisplayName("Testing Sampple service /openapi")
        void testOpenapi() {
    //    Default openapi test expected openapi version = 3.0.3
    //    openAPITestHelper.testOpenAPI(projectSampleServiceBaseUri);
    //    Openapi test with custom openapi version
          openAPITestHelper.testOpenAPI(projectSampleServiceBaseUri, "3.0.0");
        }

4.5. 0.5.0 → 0.6.0

4.5.1. Változások

4.5.1.1. Általános
BOM verzió emelések
  • coff:ee 1.6.0 → 1.8.0

  • microprofile 3.3 → 4.0

  • smallrye-config 1.8.5 → 2.0.2

Átállás

A változtatások nem eredményeznek átállási munkálatokat, visszafelé kompatibilis.

4.5.1.2. roaster-restassured
  • A ResponseProcessor kiegészült a deleteXml, és deleteJson metódusokkal

4.5.1.3. Átállás

A változtatások nem eredményeznek átállási munkálatokat, visszafelé kompatibilis.

4.5.1.4. roaster-selenide
  • Selenide upgrade 5.22.2 → 6.1.2

4.5.1.5. Átállás
4.5.1.6. roaster-selenide-angular
  • Létrejött a modul, benne a következő komponensekkel: MatCheckbox, MatRadioGroup, MatSelect, MatSlideToggle

4.5.1.7. Átállás

A változtatások nem eredményeznek átállási munkálatokat, visszafelé kompatibilis.

roaster-mongodb
  • Létrejött a modul

Átállás

A változtatások nem eredményeznek átállási munkálatokat, visszafelé kompatibilis.

roaster-oracle
  • DB connection pool került bevezetésre; létrejött a maximumPoolSize konfig kulcs

Átállás

A változtatások nem eredményeznek átállási munkálatokat, visszafelé kompatibilis.

4.6. 0.6.0 → 0.7.0

4.6.1. Változások

4.6.1.1. Általános
BOM verzió emelések
  • junit5 v5.6.2 → v5.8.2

  • selenide v6.1.2 → v6.3.0

4.6.1.2. roaster-common-config
  • A RoasterYmlConfigSourceProvider-ben használt public YamlConfigSource(String name, InputStream stream, int defaultOrdinal) throws IOException hívás @Deprecated lett ezért ettől a verziótól a public YamlConfigSource(String name, String source, int ordinal) hívása történik

4.6.1.3. Átállás

A változtatások nem eredményeznek átállási munkálatokat, visszafelé kompatibilis.

4.6.1.4. roaster-tm4j
  • A MissingResourceException javításra került

4.6.1.5. Átállás

A változtatások nem eredményeznek átállási munkálatokat, visszafelé kompatibilis.

4.7. 0.7.0 → 0.8.0

4.7.1. Újdonságok

Létrejött egy új modul: roaster-jaxrs. A fő célja hogy JAXRS szintú specifikációt használva megoldásokat nyújcson olyan igényekre, melyek a roaster-restassured nem tud. Ilyen például a multipart kezelés, vagy a microprofile-rest-client lehetősége, ami sok customizálást tud pótolni. A roaster-jaxrs modulhoz készült leírás Jaxrs és testsuite is.

4.7.2. Változások

4.7.2.1. Általános
  • hu.icellmobilsoft.roaster.common.util.FileUtil kiegészült InputStream olvasó paraméterekkel, hibakezelést megoldja maga a funkció.

BOM verzió emelések
  • coffee v1.8.0 → v1.10.2

  • deltaspike 1.9.1 → 1.9.6

4.7.2.2. roaster-restassured
  • A HealthCheckTestHelper módosult, a továbbiakban az általános /health végpont hívás mellett lehetőség van a tipizált probe hivásokat használni:

    • /health/ready

    • /health/live

    • /health/started

  • Az új roaster-jaxrs modul dependencia-ként lett bekötve, mivel a konfigurációjuk és a használatuk közös (azonos osztályok). Ez okoz apró változásokat a java path elérésében.

4.7.2.3. Átállás

A változtatás igényel apró változásokat, mégpedig a következő java path-ok változtak:

  • hu.icellmobilsoft.roaster.restassured.response.producer.ManagedResponseProcessorConfig → hu.icellmobilsoft.roaster.jaxrs.response.producer.ManagedResponseProcessorConfig

  • hu.icellmobilsoft.roaster.restassured.response.producer.ResponseProcessorConfig → hu.icellmobilsoft.roaster.jaxrs.response.producer.ResponseProcessorConfig

  • hu.icellmobilsoft.roaster.restassured.response.producer.RestProcessor → hu.icellmobilsoft.roaster.jaxrs.response.producer.RestProcessor

Egyébként nincs semmi működési változás, minden más érintettlen, visszafelé kompatibilis.

4.7.2.4. roaster-redis

A Coff:ee frissítése változást okozott a hu.icellmobilsoft.roaster.redis.RedisHandler osztályban (coffee-ban kivezetésre került a RedisService). Apró változásokat okozott az átvezetés, és mégpedig hogy a metódusok visszatérése Optional értékkel jön az eddigi String vagy void helyett.

4.7.2.5. Átállás

A változtatás apró korrekciókat igényelhet a visszatérési értekek típusánál, egyébként visszafelé kompatibilis.

4.8. 0.8.0 → 0.9.0

4.8.1. Változások

4.8.1.1. Általános
BOM verzió emelések
  • jackson-datatype-jsr310 2.13.3 → 2.13.4

  • jackson-jaxrs-json-provider 2.13.3 → 2.13.4

  • jackson-annotations 2.13.3 → 2.13.4

  • jackson-databind 2.13.3 → 2.13.4.2

  • commons-text 1.8 → 1.10.0

  • coffee v1.10.2 → v1.12.1

4.8.1.2. Átállás

A változtatások nem eredményeznek átállási munkálatokat, visszafelé kompatibilis.

4.8.1.3. roaster-jaxrs
  • Dependencybe bekerült a jakarta.servlet:jakarta.servlet-api. Ez egy kötelező API, amit például a Resteasy dependencyk használnak. Hiányában egy nem informatív hibaüzenettel száltak el a tesztek.

4.8.1.4. Átállás

A változtatások nem eredményeznek átállási munkálatokat, visszafelé kompatibilis.

4.9. 0.9.0 → 0.10.0

4.9.1. Változások

4.9.1.1. roaster-tm4j
  • Teszt tag-enként eltérő TM4J test cycle-ök megadási lehetősége a roaster.tm4j.cycle.{0} konfig kulcs segítségével

  • roaster-restassured modullal való közös használata miatti exception javításra került

4.9.1.2. Átállás

A változtatások nem eredményeznek átállási munkálatokat, visszafelé kompatibilis.

4.9.1.3. JDK 17 support

A projekt mostmár támogatja a java 17 verziót, így használható ilyen java alapon lévő projektben is. A problémás részek legtöbb helyen dependency frissítéssel és javadoc bővítéssel megjavult.

java 11 && 17

A roaster továbbra is java 11-el lesz kompilálva, de kap fordítási és tesztelési ellenőrzéseket java 17-re is. Így minimalizálni fogjuk a java verzió külömbségi problémákat.

BOM verzió emelések:
  • org.jboss.weld:weld-junit5 2.0.1.Final → 2.0.2.Final

  • org.jboss.weld:weld-core-impl 3.1.5.Final → 3.1.9.Final

  • io.smallrye.config 2.0.2 → 2.13.0

  • com.google.guava:guava 30.1.1-jre → 31.1-jre (a használt selenide verzió már nem kompatibilis a régivel)

4.10. 0.10.0 → 0.11.0

4.10.1. Változások

4.10.1.1. roaster-zephyr
  • Megjelent a Roaster Zephyr modul. Segítségével felhős jira használata esetén Zephyr Scale tesztuffatások eredményeit lehet megjeleníteni a felületen. Használatához a következő változtatásokat kell eszközölni:

    1. pom.xml-ben le kell cserélni a roaster-tm4j-junit5 modult a roaster-zephyr-junit5 modulra.

    2. A tesztosztályokban le kell cserélni az extension-t a ZephyrExtension-re és a zephyr csomagban található @TestCaseId annotációt kell használni a teszteken.

    3. A roaster yml fájlokban le kell váltani a tm4j konfigurációt a zephyr configurációra.

      1. Ki kell generálni felhős jira-ban a teszteket feltöltő user accountjával az api kulcsokat jira-hoz és zephyr-hez

      2. server/authToken értékének a base64(email + ":" + jiraApiToken) műveletből megkapott kulcsot kell beállítani

        1. Alternatívan megadható a server/email és a server/apiToken kulcsoknak külön-külön a jira user email címe és a generált api token, ilyenkor nem szabad megadni authTokent.

      3. cloud/bearerToken értékének a Zephyr Scale Cloud felületén kigenerált JWT tokent kell megadni

4.11. → 2.0.0

4.11.1. Verzió emelések

rest-assured: 3.3.0 → 5.0.0 (jakarta-s dto-k xml marshall/unmarshall-ja miatt)

4.11.2. WARNING

4.11.2.1. roaster-hibernate

Hibernate 6 válással a kongiurációk is megváltoztak a hu.icellmobilsoft.roaster.hibernate.producer.EntityManagerFactoryProducer osztályban. Valamire volt alapból leírás, de a következő kettő további figyelmet kell hogy kapjon:

...
        props.put(Environment.CDI_BEAN_MANAGER, beanManager); (1)

...
        props.put(Environment.USE_NEW_ID_GENERATOR_MAPPINGS, false); (2)
...
1 Valószinű natív támogatást kapott (https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html#beans-cdi)
2 Megszünt, nemtudni mit kell tenni…​

4.11.3. BUG

4.11.3.1. roaster-testsuite-tm4j

Valami probléma (Dependency, Jakarta upgrade) miatt a

  • hu.icellmobilsoft.roaster.testsuite.tm4j.Tm4jIT

  • hu.icellmobilsoft.roaster.testsuite.tm4j.Tm4jTagCycleIT

tesztek ki lettek kapcsolva amíg nem valaki nem javítja a hibát:

2022-12-27 10:19:32 5.14.0 WARNING Failed to invoke TestWatcher [hu.icellmobilsoft.roaster.tm4j.junit5.Tm4jExtension] for method [hu.icellmobilsoft.roaster.testsuite.tm4j.Tm4jIT#dummyTest()] with display name [dummyTest()]
java.lang.IllegalStateException: RestClientProxy is closed
	at org.jboss.resteasy.microprofile.client.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:98)
	at jdk.proxy2/jdk.proxy2.$Proxy95.headTestCase(Unknown Source)
	at hu.icellmobilsoft.roaster.tm4j.common.client.RestTm4jService.isTestCaseExist(RestTm4jService.java:96)
	at hu.icellmobilsoft.roaster.tm4j.common.RestTm4jReporter.lambda$4(RestTm4jReporter.java:122)
	...

4.12. 2.0.0 → 2.1.0

4.12.1. Változások

4.12.1.1. Általános
BOM verzió emelések:
4.12.1.2. Hibernate
  • Az EntityManagerFactoryProducer osztályban beégetett logolással és statisztika generálással kapcsolatos konfigurációs értékek már a roaster konfigurációs fájlból töltődnek: LOG_SESSION_METRICS, LOG_JDBC_WARNINGS, GENERATE_STATISTICS.

4.12.1.3. Átállás
  • A LOG_SESSION_METRICS, LOG_JDBC_WARNINGS és a GENERATE_STATISTICS konfigurációs kulcsok az eddigi beégett true érték helyett false értékkel állítódnak be, ha nincsenek felvéve a roaster konfigurációs fájlban. Így ha ezeket engedélyezni szeretnénk, akkor szükséges őket felvenni és beállítani true értékkel.

4.12.1.4. roaster-tm4j/roaster-testsuite-tm4j

Dependency, Jakarta upgrade miatti bug fix

  • hu.icellmobilsoft.roaster.testsuite.tm4j.Tm4jIT

  • hu.icellmobilsoft.roaster.testsuite.tm4j.Tm4jTagCycleIT

4.12.1.5. roaster-zephyr

Dependency, Jakarta upgrade miatti bug fix

  • hu.icellmobilsoft.roaster.testsuite.zephyr.ZephyrIT

  • hu.icellmobilsoft.roaster.testsuite.zephyr.ZephyrTagCycleIT

4.12.2. roaster-selenide

Selenide verzió frissítés miatt kikerült a driverManagerEnabled kapcsolhatósága

4.13. 2.1.0 → 2.2.0

4.13.1. Változások

4.13.1.1. Általános
  • license-maven-plugin -ba javítva lett a projectName Roaster-re

  • törölve lettek a @Vetoed annotációk.

BOM verzió emelések:

4.13.2. roaster-selenide

Vágólap tartalmának elérése Chrome böngészőből, local és remote futtatás során is

4.13.3. roaster-hibernate

Persistence contextenként csak egyszer jön létre EntityManagerFactory és cachelve marad amíg @ApplicationScoped EntityManagerFactoryProducer példány él a containerben. A korábbi EntityManager injection során a database connection poolban lévő kapcsolatok elfogytak, mert minden EntityManagerFactory saját connection poolt hozott létre.