• Przejdź do głównej nawigacji
  • Przejdź do treści
  • Przejdź do głównego paska bocznego
  • Przejdź do stopki
Testelka.pl

Testelka.pl

Testelka.pl - o technologiach w testowaniu oprogramowania

  • Kursy
    • DARMOWY: Java dla testerów
    • Selenium w Javie
    • Selenium w C#
    • Testy API w REST Assured
    • Selektory CSS
    • XPath
  • Materiały na raz
  • Blog
  • O Eli
  • Zaloguj się
  • DOŁĄCZ

API w REST Assured 4. Pierwszy test API – metoda GET

Strona główna > Kursy > Testy API w REST Assured > API w REST Assured 4. Pierwszy test API – metoda GET

W tej lekcji napiszemy pierwszy test API ale już nie w Postmanie, a przy użyciu REST Assured.

Dokumentacja do sklepu

Po poprawnym postawieniu aplikacji dokumentację do niej znajdziesz pod localhost/fakestore/dokumentacja/. Tam też znajdziesz np. klucze potrzebne do uwierzytelnienia.

Error:java: error: release version 5 not supported

Jeżeli zobaczysz ten błąd w trakcie uruchamiania swojego testu, zajrzyj tutaj. Znajdziesz tam informacje jak rozwiązać ten problem.

Wersja Javy

W zależności od tego której wersji Javy używasz, mogą się pojawić drobne rozbieżności w działaniu poniższej linijki i podobnych sytuacji, w których pobieramy jakąś informację z odpowiedzi metodą get(), a następnie ją „wypluwamy” w konsoli metodą println:

System.out.println(response.jsonPath().get("name"));

Jeżeli nie zadziała Ci to, co pokazuję (będzie się podkreślało na czerwono i po najechaniu zobaczysz „Ambiguous method call”) możesz zamiast get() użyć metody getString():

System.out.println(response.jsonPath().getString("name"));

Pierwszy test API: linki i materiały

OAuth

W tej lekcji poznamy kolejną metodę przekazywania danych do logowania, a mianowicie OAuth1. Jest to sposób autoryzacji, który poprzez haszowanie przesyłanych danych nadaje się do wykorzystania w nieszyfrowanej komunikacji po http (bez “s”). Rezygnujemy z korzystania z https w przypadku naszego sztuczno-sklepu, ze względu na problemy z certyfikatami przy lokalnym jego postawieniu. Użycie OAuth jest w naszym przypadku prostsze. Będzie to też doskonała okazja, żeby zobaczyć i użyć innych metod autoryzacyjnych.

Pierwszy test API

Po bardzo poważnej zmianie, jaką jest zmiana motywu Postmana na ciemny (!) wyślemy z niego zapytanie o konkretny produkt (pojedynczy obiekt). Z takim działającym testem przeniesiemy się już do kodu i przepiszemy go używając REST Assured. 

Zaczniemy od stworzenia projektu mavenowego, dodania potrzebnych zależności, w tym także tych, które będą nam potrzebne do używania OAuth. Więcej o tym mówię w filmie. Stworzymy też nową klasę testową. Zainicjalizujemy tam pola klasy wartościami, z których skorzysta nasz pierwszy test API.

Odpowiedź

W teście stworzymy sobie obiekt klasy implementującej interfejs Response zwracany przez metodę get(). Poznacie (lub przypomnicie sobie) podejście BDD (Behavior-Driven Development), czyli gherkinową notację Given-When-Then. To jej będziemy używać do budowania obiektu. Na razie poprzestaniemy na przygotowaniu, czyli metodzie given() i akcji, czyli metodzie when().  Żeby test był testem dodam także prostą asercję sprawdzającą kod odpowiedzi. To czy sprawdzanie samego kodu odpowiedzi w testach jest wystarczające pozostawiam każdej i każdemu z Was do rozważenia we własnym sercu i umyśle. Na pewno pod uwagę trzeba wziąć przede wszystkim co chcemy testem sprawdzić.

W filmie pokazuję też jak pobierać informacje z naszego obiektu reprezentującego odpowiedź. Można pracować na całej odpowiedzi albo tylko na poszczególnych jej elementach. Którego podejścia będziecie użyć w prawdziwym życiu, to już zależy od Was. Standardowo zapytany o to, które jest lepsze odpowiem: to zależy.

Co poćwiczyć?

Zadaniem domowym jest zmiana tego co mamy. Spróbuj wywołać inne kody odpowiedzi, w tym kod 403. Pobaw się też trochę odpowiedzią z API, poćwicz trochę wyciąganie różnych informacji pojedynczo (tak jak zrobiłem to z „name” w filmie).

Pierwszy test API – kod

Ukryta treść

Nie masz aktywnej subskrypcji. Wykup subskrypcję albo zaloguj się, by móc zobaczyć pełną lekcję.

Reader Interactions

Komentarze

Nie masz aktywnej subskrypcji. Wykup subskrypcję albo zaloguj się, by móc komentować.

Komentarze

  1. Łukasz napisał

    12 marca, 2020 o 3:06 pm

    Mam problem z pobraniem zależności przez Intellij. Po uzupełnieniu pliku pom.xml, zgodnie z wzorem wszystkie zależności oznaczone są na czerwono oraz przykładowo otrzymuję komunikat "Dependency 'com.github.scribejava:scribejava-apis:2.5.3' not found".

    Odpowiedz
    • Kuba Rosiński napisał

      12 marca, 2020 o 4:36 pm

      Heja, to jest problem samego mavena, w zasadzie zw [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
  2. Damian Wasilczyk napisał

    22 kwietnia, 2020 o 10:09 pm

    Działa wszystko, poza linijką:
    System.out.println(response.jsonPath().get("name"));

    Wpisywałem z palca, próbowałem skopiować - za każdym razem podkreślone na czerwono z adnotacją:
    Ambiguous method call. Both
    println
    (char[])
    in PrintStream and
    println
    (String)
    in PrintStream match

    Przy kompilacji:
    [quote]Error:(29, 19) java: reference to println is ambiguous
    both method println(char[]) in java.io.PrintStream and method println(java.lang.String) in java.io.PrintStream match[/quote]

    Odpowiedz
    • Kuba Rosiński napisał

      23 kwietnia, 2020 o 9:49 am

      Tak, to moj projekt jechal na poczatku na javie 1. [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
      • Sławomir Świetlik napisał

        2 maja, 2020 o 10:08 pm

        Mam dokładnie ten sam problem ale niestety ani jedna ani druga zaproponowana przez Ciebie opcja nie działa.

        Odpowiedz
        • Kuba Rosiński napisał

          2 maja, 2020 o 10:43 pm

          Opisz proszę swój problem bardzo dokładnie step [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

          Odpowiedz
  3. Krzysztof Przybyla napisał

    24 czerwca, 2020 o 12:26 am

    Jak najlepiej zrobić assercję na response.statusCode(), jeśli w odpowiedzi spodziewam się statusu 200 lub 409(obiekt został stworzony lub już istnieje)? Jest jakiś elegancki sposób na ogarnięcie tego?

    Odpowiedz
    • Kuba Rosiński napisał

      24 czerwca, 2020 o 8:57 am

      Hej,
      0) 200 nie powinno przychodzić przy stworzo [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
      • Krzysztof Przybyla napisał

        24 czerwca, 2020 o 11:07 am

        Dzięki za odpowiedź Kuba. Co do 200 przy tworzeniu obiektu to wiem, że tak nie powinno być, niestety developerzy u mnie w zespole są innego zdania...
        Tak jak napisałeś, potrzebuję tej asercji w ramach przygotowania danych przed właściwym testem, sama funkcjonalność jest sprawdzana mnóstwem innych testów.

        Odpowiedz
  4. typowy napisał

    23 lipca, 2020 o 1:03 pm

    Cześć prośba o pomoc,
    w kodzie dostaje 401,
    kod:

     
    import io.restassured.response.Response;
    import org.junit.jupiter.api.Test;
    
    import static io.restassured.RestAssured.given;
    
    public class FirstGet {
        private String username = "ck_8da07afd3503a4242e95a2d5bad99cc2fb55c552";
        private String password = "cs_e57e8cadc42ca42064c44239853dda9aa2e77474";
        private String url = "http://localhost/fakestore/wp-json/wc/v3/";
        private String productsEndpoint = "products";
        private String productFuerta = "393";
        @Test
        public void firstGetTest() {
            Response response = given()
                    .port(8080)
                    .auth()
                    .oauth(username, password, "", "")
                    .when()
                    .get(url + productsEndpoint + "/" + productFuerta);
    
            System.out.println(response.prettyPeek()); // prettyPeek - ładnie wypisze response
        }
    } 

    .

    Odpowiedź:

    HTTP/1.1 401 Unauthorized
    Date: Thu, 23 Jul 2020 10:59:52 GMT
    Server: Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.8
    X-Powered-By: PHP/7.4.8
    X-Robots-Tag: noindex
    Link: ; rel="https://api.w.org/"
    X-Content-Type-Options: nosniff
    Access-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages
    Access-Control-Allow-Headers: Authorization, Content-Type
    Vary: Origin
    Content-Length: 140
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Content-Type: application/json; charset=UTF-8

    {
    "code": "woocommerce_rest_authentication_error",
    "message": "Nieprawidłowy podpis - podany podpis jest niezgodny.",
    "data": {
    "status": 401
    }
    }
    io.restassured.internal.RestAssuredResponseImpl@346a361

    Process finished with exit code 0

    Postman - OAuth 1.0 po usunięci "s" dostaje "Could not send request", z "s" działa i zwraca produkt
    Console:
    GET http://localhost/fakestore/wp-json/wc/v3/products/393?oauth_consumer_key=ck_8da07afd3503a4242e95a2d5bad99cc2fb55c552&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1595502710&oauth_nonce=wHRISb0ZMTu&oauth_version=1.0&oauth_signature=YH2dFwICU4MbSIhB2o3Iroa1DI0=
    Error: connect ECONNREFUSED 127.0.0.1:80
    Request Headers
    User-Agent: PostmanRuntime/7.26.1
    Accept: */*
    Postman-Token: b6ba60e2-6aca-4ba2-a3f5-afaf1d8cee2a
    Host: localhost
    Accept-Encoding: gzip, deflate, br

    Odpowiedz
    • Kuba Rosiński napisał

      23 lipca, 2020 o 4:12 pm

      Popatrzylem, popatrzylem i nie widze nic rzucajaco [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
      • typowy napisał

        24 lipca, 2020 o 9:25 am

        Cześć dzięki za podjęcie tematu
        Postman:
        {
        "code": "woocommerce_rest_authentication_error",
        "message": "Nieprawidłowy podpis - podany podpis jest niezgodny.",
        "data": {
        "status": 401
        }
        }

        Kod:
        22:22 GMT
        Server: Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.8
        X-Powered-By: PHP/7.4.8
        X-Robots-Tag: noindex
        Link: ; rel="https://api.w.org/"
        X-Content-Type-Options: nosniff
        Access-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages
        Access-Control-Allow-Headers: Authorization, Content-Type
        Vary: Origin
        Content-Length: 140
        Keep-Alive: timeout=5, max=100
        Connection: Keep-Alive
        Content-Type: application/json; charset=UTF-8

        {
        "code": "woocommerce_rest_authentication_error",
        "message": "Nieprawidłowy podpis - podany podpis jest niezgodny.",
        "data": {
        "status": 401
        }
        }
        io.restassured.internal.RestAssuredResponseImpl@631e06ab

        Odpowiedz
        • Kuba Rosiński napisał

          24 lipca, 2020 o 11:21 am

          Super - wrzuć proszę screenshot Postmana z tabem [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

          Odpowiedz
          • typowy napisał

            24 lipca, 2020 o 11:48 am

            Link:
            https://snipboard.io/kARwtb.jpg

          • Kuba Rosiński napisał

            24 lipca, 2020 o 12:44 pm

            Dobra, to teraz dwa dodatkowe pytania na zbadanie: [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

          • typowy napisał

            24 lipca, 2020 o 1:04 pm

            Tak otwiera się ale pojawia się komunikat "Połączenie nie jest prywatne" i dopiero po zatwierdzeniu w zaawansowanych przechodzi.

            https://snipboard.io/Qlw7e8.jpg

          • Kuba Rosiński napisał

            24 lipca, 2020 o 3:12 pm

            Ale po zatwierdzeniu jest ok? masz sklep z produkt [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

          • typowy napisał

            24 lipca, 2020 o 4:09 pm

            FakeStore działa:
            https://snipboard.io/95UMfc.jpg
            ale po zmianie zakładki na stronie np. na "sklep" znowu trzeba w zaawansowanych potwierdzać.

            Testowałem poniższe opcje:
            http://localhost:8080/fakestore/wp-json/wc/v3/products/393
            http://localhost:8080/fakestore/wp-json/wc/v2/products/393
            {
            "code": "woocommerce_rest_authentication_error",
            "message": "Nieprawidłowy podpis - podany podpis jest niezgodny.",
            "data": {
            "status": 401
            }
            }

            http://localhost/fakestore/wp-json/wc/v3/products/393
            http://localhost/fakestore/wp-json/wc/v2/products/393
            Error: connect ECONNREFUSED 127.0.0.1:80

            https://localhost:8080/fakestore/wp-json/wc/v3/products/393
            https://localhost:8080/fakestore/wp-json/wc/v2/products/393
            Error: write EPROTO 3074956808:error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER:../../third_party/boringssl/src/ssl/tls_record.cc:242:

            https://localhost/fakestore/wp-json/wc/v2/products/393
            https://localhost/fakestore/wp-json/wc/v3/products/393
            działa w Postmanie, w kodzie nie

          • Ela Sądel napisał

            27 lipca, 2020 o 9:14 am

            Halko! Podrzuciłam Ci instrukcje co robić na mai [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

          • typowy napisał

            27 lipca, 2020 o 12:41 pm

            Cześć, dzięki za pomoc działa ;]

Pierwszy Sidebar

LEKCJE W KURSIE

  • Lokalna aplikacja do testów za pomocą LocalWP lub XAMPP
  • Czym jest API?
  • Pierwsze zapytanie do API
  • Pierwszy test API - metoda GET
  • Tworzenie obiektów w API - metoda POST
  • Zadanie: tworzenie i pobieranie obiektów
  • Usuwanie i zmiana obiektów - metody DELETE i PUT
  • CRUD: wspólne elementy żądań
  • CRUD: PUT i PATCH oraz niezależność testów
  • Jak szperać w JSONie?
  • Zadanie: żądania w pętli
  • Asercje
  • Serializacja i deserializacja
  • Zadanie: serializacja i deserializacja
  • Organizacja projektu testowego
  • Zadanie: organizacja projektu testowego

Footer

Elzbieta Natalia Sadel
Calle Marzo 9 1 D
41009 Sevilla
Hiszpania
NIF: Y7882076J

Zostań trenerem!

Regulamin
Polityka prywatności
Polityka wsparcia w ramach członkostwa

Koszulki i torby dla testerów

Pomoc
Kontakt

Poskładane z 💛 przez Automatela.pl

Ta strona korzysta z ciasteczek aby świadczyć usługi na najwyższym poziomie. Dalsze korzystanie ze strony oznacza, że zgadzasz się na ich użycie.ZgodaNie wyrażam zgodyPolityka prywatności