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:
<profiles>
<profile>
<id>ci</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<modules>
<module>project-testsuite</module>
</modules>
</profile>
</profiles>
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.
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:
roaster:
test:
sample:
url: http://roaster-default.hu
port: 8083
pass: secret
roaster:
test:
sample:
url: http://localhost
port: 8084
roaster:
test:
sample:
url: http://roaster-sandbox.hu
@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;
~/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:
|
3. Modulok:
3.1. API
Az API modul használatához csak be kell hivatkozni a pom.xml-ben
<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
<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.
-
A response HTTP status 200 és "application/json" accept.
-
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.
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;
}
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
<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
<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:
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
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.
@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)
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
<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:
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
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.
@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)
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);
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ó
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:
<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ó
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:
<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
<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:
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
# 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
@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:
<dependency>
<groupId>hu.icellmobilsoft.roaster</groupId>
<artifactId>roaster-selenide-angular</artifactId>
</dependency>
Jelenleg támogatott komponensek:
3.8.3.1. <mat-checkbox>
MatCheckbox checkbox = new MatCheckbox(Selenide.$(MatCheckbox.TAG_NAME));
assertFalse(checkbox.getValue());
checkbox.toggle();
assertTrue(checkbox.getValue());
3.8.3.2. <mat-radio-group>
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>
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>
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:
<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:
<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>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
<!-- 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:
<?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:
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
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
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
<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:
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 auserKey
-t használjuk auserName
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ültexpectedOpenapiVersion
paraméterrel, hogy projekt szinten lehessen állítani. Túlterheléssel megmaradt az eredeti szintaxis is, ezt hívva alapértelmezetten3.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ábbiakban3.0.1
helyett3.0.3
OpenAPI verzióra futtat assertet. Amennyiben ez projekt szinten nem felel meg aOpenAPITestHelper.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
-
A Selenide upgrade okozhat problémát. Lásd: Selenide changelog
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áltpublic YamlConfigSource(String name, InputStream stream, int defaultOrdinal) throws IOException
hívás@Deprecated
lett ezért ettől a verziótól apublic 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.
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:
-
pom.xml-ben le kell cserélni a roaster-tm4j-junit5 modult a roaster-zephyr-junit5 modulra.
-
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.
-
A roaster yml fájlokban le kell váltani a tm4j konfigurációt a zephyr configurációra.
-
Ki kell generálni felhős jira-ban a teszteket feltöltő user accountjával az api kulcsokat jira-hoz és zephyr-hez
-
server/authToken értékének a base64(email + ":" + jiraApiToken) műveletből megkapott kulcsot kell beállítani
-
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.
-
-
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:
-
Bump com.google.guava:guava 31.1-jre → 32.1.1-jre (CVE-2023-2976)
-
com.codeborne:selenide: 6.10.3 → 6.18.0
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 aGENERATE_STATISTICS
konfigurációs kulcsok az eddigi beégetttrue
érték helyettfalse
é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ítanitrue
é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:
-
com.codeborne:selenide: 6.18.0 → 6.19.1
-
hu.icellmobilsoft.coffee:coffee: 2.3.0 → 2.7.0 , szükséges változásokat lásd:
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.