#automatyzacjaRestAssured01-Java+Maven+RestAssured = Czy taki połączenie daje rade w testach api ?

Rest-assured

Siema Pany i Panewy !
W dzisiejszym wpisie poruszymy temat testów rest api.
Nie będzie to narzędziówka typu postman czy soapui, gdzie klikacie i jest fajnie i aplikacja robi wszystko za was.
Nie no tak naprawdę, wystarczy poczytać mądrego internetu i wszystko jest !!!
Jest to tak samo do ogarnięcia, jak we wyżej wspomnianych narzędziach.
Wymagania jest lekka znajomość kodowania
Każdy kto próbował zrobić coś więcej w soapui np. wie, że trzeba sobie popisać skrypty w groovym, by osiągnąć coś więcej, niż to co oferuje ‘wyklikanie’ w narzędziu.
Ale tak jak mówię, nawet wklejenie całego kodu, który tutaj udostępnię to może być jakaś forma nauki.
Więc taka praca i wiedza, jak wiadomo plusuje.
Nawet jeśli nie czujecie się w kodowaniu za mocni, to warto próbować możliwie najprostszych podstaw.
Trzeba się uczyć cały czas rzeczy prostych jak i tych, którym trzeba poświęcić więcej czasu.
W świecie testów automatycznych jeśli ogarniacie jakieś podstawy z javy np. to przesiadając się na inny język np. c#, pythona czy cypressa to i tak ogarniecie, nie ma tak, że się nie da.
Kwestia przestawienia się na inną składnie, sposób kodowania.
Także uczcie lub chociaż próbujcie czy to w robocie czy w domu.
Dobra to taki wstęp, czas na praktykę!

Rest Assured – cóż to takiego ?

Strona / dokumentacja znajduje się tutaj – > https://rest-assured.io/
W skrócie to biblioteka, dzięki której pisanie testów, będzie przyjemne jak nigdy !
W połączeniu z Javą, można różnorako wykorzystać potencjał tego frameworka. Nie będziemy posługiwać się interface GUI, tylko trzeba trochę poczytać i pokodować. Dlatego w tym wpisie pokażę wam, że jakieś totalne podstawy to mniej niż godzina roboty ?
Ale tak naprawdę to co uzyskamy w narzędziach w których ‘wyklikamy’ testy zrobimy to samo albo i więcej wykorzystując wspomniane narzędzie.
Dobra ten blog to praktyka, więc bez zbędnego gadania, zzzatem zzzaczynamy !

Konfiguracja oraz narzędzia potrzebne do projektu

Projekt Rest Assured wykorzystamy oczywiście w Javie + Maven.
Potrzebny też jest Inteligej, nie będę tu pokazywać konfiguracji i instalacji, gdyż już to robiłem w następującym wpisie :
https://gregkaqa.pl/index.php/2019/12/25/automatyzacjajava01-instalacja-i-konfiguracja-ide-intellij-idea-w-wersji-community/

Myślę, że opisany tam proces instalacji i konfiguracji został przedstawiony w sposób łopatologiczny, przez co każdy to ogarnie.

Robimy projekt odpalamy Intelji idea i tworzymy nowy projekt.


Nowy projekcik maven, jak wolicie gradle to róbcie. Ja w tym wpisie pokazuje mavena.
Ale to wiecie, co kto lubi jedni powiedzą tak inni siak.
Ja akurat tutaj użyje mavena, ale jeśli dacie znać mogę pokazywać i na gradle.


Odpala nam się domyślnie pom.xml i tu wklejamy :

<dependencies>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>4.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-path</artifactId>
<version>4.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>xml-path</artifactId>
<version>4.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-schema-validator</artifactId>
<version>4.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>spring-mock-mvc</artifactId>
<version>4.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>spring-web-test-client</artifactId>
<version>4.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>

Ja to wklejam tak, wolę to zrobić teraz pewnie sobie potestuje te biblioteczki.

I po chwili indeksowania wszystko działa.
Alt enter rozwiazujemy importa
Mamy zaimportowane adnotacje z Junit bomba.
Wybieramy edit configuration tam gdzie jest PierwszyTest run debug.
Wskazujemy klase i use classpath for module nasz folder projektu.
Jak dobrze ustawiliście, no to jest git test przeszedł.

Dobra jakieś ala ‘testy’.

Nie ma asercji metoda jest oznaczona jako test, ale nie testuje a jedyne pokazuje wam gety, także testy muszą coś robić.
Porównywać, sprawdzać itp. Tak jakby pierwszy test to proste sprawdzenie czy kod odpowiedzi jest 200 czyli ok, wtedy test jest oznaczony jako zielony czyli ok.
Zobaczcie też na te znaczki zielone i czerwone obok linii kodu, dzięki nim, jeśli nasze testy są niezależne tzn. jeden nie jest zależy od drugiego, to można je puszczać pojedynczo zamiast odpalać całość.

Prosta akcja wpisujemy 400, wiemy i spodziewamy się 200tki i mamy błąd. Nasza konsolka daje nam info, dlaczego tak jest.
Was 200, a my oczekiwaliśmy 400 zatem ten pierwszytest potraktowany został jako fail, no i fajnie.

Nie będę tu śmiecił bloga dlatego na samym jego dole dam kod z tej klasy java oraz mavena. Czy nie wiem pomyśli się o jakimś githubie, tylko tyle plików, że nie ma po co robić XD

Tutaj przykładowa zabawa asercjami, oczywiście nie będę się tu rozpisywać i dokładnie każdej opisywać.
Tu wykorzystane : equalTo równa się dokładnie takiemu ciągowi znaków, constains czyli wśród tekstu zawiera podany ciąg znaków, na screenie wykorzystałem ignorowanie wielkości liter oraz zawiera tylko kawałek z tego co dostajemy, a dostajemy ogólnie z api : California.
Jest dużo więcej różnych fajnych metoda weryfikacyjnych i warto poczytać i odpowiednio dobrać mam, do tego co chcemy osiągnąć np. hasItems.

Sprawdźmy API, które wymaga autoryzacji

Do tych wykorzystanych wcześniej metod, publicznych metoda nie jest wymagana autoryzacja, ale często w projektach trzeba albo podać usera hasło albo tokeny.
Autoryzacja pierwsza to ‘basic’, inne aktualnie najbardziej popularne to oauth2 czy np. starsza wersja outh1.
Są też autoryzacje, gdzie robimy geta z np. jakimś ciągiem znaków przypisanym do konta, wysyłamy żądanie i w zwrotce otrzymujemy dopiero token.

Dobra nie chce mi się długo szukać dlatego spróbujemy zrobić Imgura, który to był wykorzystany we wpisie o Postmanie.

https://api.imgur.com/oauth2 Tutaj instrukcja jak się zautoryzować.

https://api.imgur.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=REQUESTED_RESPONSE_TYPE&state=APPLICATION_STATE

Przerabiamy ten link wyżej zamiast REQUESTED_RES… wpisujemy token oraz zamiast your client id przeklejamy id clienta, które dostaliśmy jak rejestrowaliśmy aplikacje, mamy tam też secret.

https://imgur.com/?state=APPLICATION_STATE#access_token=tokenktorywygnerowalo&expires_in=315360000&token_type=bearer&refresh_token=61464ablablbablalalbve85fb&account_username=dropek&account_id=553tajemnica
Właśnie ta wartość access_token będzie nas interesowała.

Nie wiem jak to w javie ogarnąć u mnie wyskoczyło po prostu allow kliknąłem i połączyło mi konto i dostałem tokena, w takim linku jak wyżej. W Postmanie wyskakuje po prostu okienko tutaj trzeba by było kombinować. No ale widzicie jak macie autoryzacje tokenem i także posiadacie token to jest izi pizi.
Ja natomiast ręcznie przykleiłem z przeglądarki token, to tylko w celu oszczędności czasu na wpis. Bo nie ma czegoś takiego, że się nie da.
Trzeba tylko poszukać, pomyśleć jak to ogarnąć.

Dobra to skoro działa nam metoda z autoryzacją to już do końca tego wpisu pokażę inne przykłady też z imgura.

W asercjach może wam wyskakiwać null i myślicie co jest nie tak w mordę jeża [*] ? Okazuj się że musicie patrzeć jak gałęzie odpowiedzi się “rozchodzą”.

daliśmy data.email to już ogarnęło 🙂

Dobra gety, getami czas na posty.

Więc tak tutaj mamy identyczną sytuację jak get, potrzebujemy autoryzacji no to kopiujemy jak małpka poprzednią metodę.
Pamiętamy, że get zmieniamy na post.
Dodatkowo jeśli z printem tak zrobicie, to dostaniecie komunikat o wymaganych parametrach. Owa metowa wymaga parametrów id obrazka oraz treść komentarza.
Jak zapisujemy w javie metody ? Bo w postmanie nawalamy wszystko klikając 😀 Sam import już ‘generuje’ pola, które tylko uzupełniamy.
Czyli tak host/metoda?parametr=wartosc&parametr2=wartosc2
I tak to wygląda kolejny parametr to znak &.

No i zakomentowałem znak & i mamy pokazany błąd, że brakuje parama i ogarniemy co mamy dodać, żeby nam dana metoda zadziałała.

Dobra zrobimy usuwanie komentarza czyli metodę delete i to będzie na tyle w tym wpisie 😀 🙁

Konsola zawsze nam wskaże co tam nie ogarnaliśmy.

No i co ? Posugerowałem się dokumentacją, oczywiście błędy dopisałem po swojemu też nic to nie dało mimo, że 200 i niby okej.
Dopiero takie coś :

/image/8yAXAmD/comment/idkomentarza

Usuwa komentarz, sprawdzajcie w trybie incognito, ponieważ się cachuje i będziecie fisiować, że wam nie działa.

https://imgur.com/gallery/8yAXAmD

No i jakieś tam przykłady są.
Generalnie różnica między postmanami i innymi tego typu, że początki bywają trudne, trzeba ogarnąć o co w tym chodzi, dlaczego dostajemy 200 jak to i tak nie działa XD.

Podsumowanie frameworka

Restassured w porównaniu z javką to bardzo fajne, unikalne i co najważniejsze darmowe narzędzie / framework do testów restapi.
Czy można zrobić to samo co postmanem i soapem ?
Można asercje nawet nie asercje a chamskie porównywanie do zmiennych. Ja też robiłęm połączenie z bazą danych i porównywanie w tym i w soapie. Wiecie co ? Więcej się namęczyłęm w groovym (w tym są skrytym soapowe) niż tutaj, wiadomo jedni lubią pythona inni groovy a jeszcze inni jave. Wiadomo to co tu pokazałem, niejako robiłem już w postmanie, nie chodzi o metody, tylko tego imgura.
Ale pokazałem, to po to bo wiele firm, ludzi, liderów myśli, że wszystko co się kodzi jest trudniejsze od wyklikiwanego programu.
Ja tego rest assured na oczy nie widziałem siadłem chwile i coś wykminiłem w pracy, w tym wpisie to samo.
Naprawdę polecam sprawdzać wszystko i wyklikiwalne i koderka.
Może się okazać, że Postman jest spoko i nie trzeba kombinować z kodowaniem.
Także zostawiam kod javy na spodzie strony.
Dzięki za przeczytanie, sprawdźcie moje inne wpisy, mogą okazać się dla Was interesujące.
Następny wpis albo to albo kontynuacja Postmana, Soapa ruszy się później chyba.
Pozdrawiam trzymajcie się, cześć !

Jak zawsze na dole strony kod

import groovy.util.logging.Slf4j;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.Test;

import static com.sun.deploy.trace.Trace.println;
import static io.restassured.RestAssured.given;
import static jdk.nashorn.internal.runtime.regexp.joni.Config.log;
import static org.hamcrest.Matchers.*;


/*@Test
    public void pierszytest(){
        given().contentType(ContentType.JSON).when().get("http://www.wp.pl").then().statusCode(400);
        given().when().get(host2).print();
        given().when().get(host1).print();
           given().contentType(ContentType.JSON).when()
                .get(host3).then()
                .assertThat().body("region",containsString("alif"));
                 given().contentType(ContentType.JSON).when()
                .get(host3).then()
                .assertThat().body("region", equalTo("California"));
                  given().contentType(ContentType.JSON).when()
                .get(host3).then().assertThat()
                .body("region", containsStringIgnoringCase("california"));



    }*/

@Slf4j
public class PierwszyTest {
    public String host1 = "http://ergast.com/api/f1/2017/circuits.json";
    public String host2 = "https://postman-echo.com/get?foo1=bar1&foo2=bar2";
    public String host3 = "https://ipinfo.io/8.8.8.8";
    public String clientid = "72e2da95954d320";
    public String imgurtoken = "7f67af828b89637dabd4568d062b02631a16891d";
    public String imgururl = "https://api.imgur.com/3/";

    /*@Test
    public void imgurTest(){
        //given().auth().oauth2
       // given().post("https://api.imgur.com/oauth2/authorize?client_id=" + clientid + "&response_type=token&state=APPLICATION_STATE").print(); // coś takiego nam nie przejdzie

    given().auth().oauth2(imgurtoken).contentType(ContentType.JSON).accept(ContentType.JSON).when().get(imgururl + "account/me/images").print();

         given().auth().oauth2(imgurtoken).contentType(ContentType.JSON).accept(ContentType.JSON).when().get(imgururl + "account/me/settings").print();
      //  given().auth().oauth2(imgurtoken).contentType(ContentType.JSON).accept(ContentType.JSON).when().get(imgururl + "account/me/settings").then().body("email", containsStringIgnoringCase("[email protected]"));
        // musi byc drzewo po kolei dlatego dajemy latwo printem obczaic ze glowną 'galezia jest data kropkujemy i potem podglaz


    }*/
    @Test
    public void imgurTestv2(){
        given().auth().oauth2(imgurtoken).contentType(ContentType.JSON).accept(ContentType.JSON).when().get(imgururl + "account/me/settings").print();
        given().auth().oauth2(imgurtoken).contentType(ContentType.JSON).accept(ContentType.JSON).when().get(imgururl + "account/me/settings").then().body("email", containsStringIgnoringCase("[email protected]"));
        // musi byc drzewo po kolei dlatego dajemy latwo printem obczaic ze glowną 'galezia jest data kropkujemy i potem podglaz
        given().auth().oauth2(imgurtoken).contentType(ContentType.JSON).accept(ContentType.JSON).when().get(imgururl + "account/me/settings").then().body("data.email", containsStringIgnoringCase("[email protected]"));
        given().auth().oauth2(imgurtoken).contentType(ContentType.JSON).accept(ContentType.JSON).when().get(imgururl + "account/me/settings").then().body("data.email", containsStringIgnoringCase("[email protected]"));

    }

    @Test
    public void imgurTestv3(){
        String id = "8yAXAmD";
        String com = "Brak smaku życia :D:(";

        given().auth().oauth2(imgurtoken).contentType(ContentType.JSON).accept(ContentType.JSON)
                .when().post(imgururl + "comment"+"?"+"image_id=" + id +
                //"&" +
                "comment=" + com).print();

    }

    @Test
    public void imgurTestv4(){
        Integer commentid = 1979329875;
        given().auth().oauth2(imgurtoken).contentType(ContentType.JSON).accept(ContentType.JSON)
                .when().delete(imgururl + "/image/8yAXAmD/comment/" + commentid.toString());
        given().auth().oauth2(imgurtoken).contentType(ContentType.JSON).accept(ContentType.JSON)
                //.when().delete(imgururl + "/comment?ID="+ commentid.toString()).print();
                .when().delete(imgururl + "/image/8yAXAmD/comment/" + commentid.toString()).print();
    }
}

W końcu ogarnę albo tu wstawianie tylko pojedyńczych plików .java albo gita, zobaczymy.

Napisz komentarz