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).
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".
Heja, to jest problem samego mavena, w zasadzie zw [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
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]
Tak, to moj projekt jechal na poczatku na javie 1. [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
Mam dokładnie ten sam problem ale niestety ani jedna ani druga zaproponowana przez Ciebie opcja nie działa.
Opisz proszę swój problem bardzo dokładnie step [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
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?
Hej,
0) 200 nie powinno przychodzić przy stworzo [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
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.
Cześć prośba o pomoc,
w kodzie dostaje 401,
kod:
.
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
Popatrzylem, popatrzylem i nie widze nic rzucajaco [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
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
Super - wrzuć proszę screenshot Postmana z tabem [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
Link:
https://snipboard.io/kARwtb.jpg
Dobra, to teraz dwa dodatkowe pytania na zbadanie: [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
Tak otwiera się ale pojawia się komunikat "Połączenie nie jest prywatne" i dopiero po zatwierdzeniu w zaawansowanych przechodzi.
https://snipboard.io/Qlw7e8.jpg
Ale po zatwierdzeniu jest ok? masz sklep z produkt [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
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
Halko! Podrzuciłam Ci instrukcje co robić na mai [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
Cześć, dzięki za pomoc działa ;]