W tym zadaniu poćwiczymy to, co już poznaliśmy w poprzednich lekcjach, a będą to metody POST i GET. Obie z tych metod wykonamy w tym zadaniu wywołując poznane już metody w 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.
Wersja Javy
W zależności od tego której wersji Javy używasz, mogą się pojawić drobne rozbieżności w sytuacji, w których pobieramy jakąś informację z odpowiedzi metodą get(), a następnie ją „wypluwamy” w konsoli metodą println, np.:
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"));
W idealnym świecie
W idealnym świecie ten test raczej rozbilibyśmy raczej na dwa różne testy. W jednym potwierdzalibyśmy, że obiekt się stworzył na podstawie tego, co dostalibyśmy w odpowiedzi na naszego POSTa. W drugim testowalibyśmy niezależnie pobieranie obiektów korzystając pewnie z zawsze takiej samej bazy danych. Piszę „raczej”, bo w przypadku odpowiedzi z POSTa nadal nie wiemy np. że dana wartość realnie zmieniła się w bazie. Nie dalibyśmy też prawdopodobnie kilku różnych asercji w środku zarówno po POST jak i po GET. Ponieważ realia naszej pracy nie zawsze osadzone są w idealnym świecie (a najczęściej nie są), może się zdarzyć, że w swojej pracy będziesz pisać podobne testy jak ten w dzisiejszym zadaniu. Natomiast jeżeli będzie możliwość testować tworzenie i pobieranie obiektów osobno, to polecam właśnie takie podejście.
Zadanie: metody POST i GET
Polecenie
Napisz test (tak, jeden test), w którym stworzysz nowy produkt o nazwie „Test Me 123”. Następnie dobierz się za pomocą API do tego stworzonego produktu i potwierdź po pierwsze, że możesz ten produkt pobrać, a po drugie, że ma prawidłową nazwę. Na koniec upewnij się jeszcze, że produkt ten występuje też na liście wszystkich produktów.
Rozwiązanie
Lepiej nie podglądać przed rozwiązaniem zadania ⚠️
Zastanówmy się jakie dotychczas poznane elementy musimy połączyć:
- tworzenie produktu,
- pobranie ID nowo utworzonego obiektu z response’a po stworzeniu tego produktu ,
- pobranie pojedynczego obiektu i potwierdzenie, że możemy go pobrać i że ma prawidłową nazwę (czy jakąkolwiek inną informację o tym produkcie, której się spodziewamy),
- pobranie listy produktów (pamiętając o parametrach) i sprawdzenie, czy gdzieś w nich pojawił się oczekiwany produkt.
Przypominam, że podstawowym sprawdzeniem odpowiedzi jest jego kod. Jeśli kod odpowiedzi nie jest taki, jakiego się spodziewamy, to najprawdopodobniej nie ma sensu sprawdzać dalej. Więc zawsze napisz asercję dla kodu odpowiedzi.
Witajcie,
próbuję podać na wszelkie możliwe sposoby w body jsona nazwę zmiennej zadeklarowanej wyżej, jednak za każdym razem dostaję 400 zamiast 201. Czy da się jakoś "podciągnąć" zmienne pod jsona?
Hej, wyglada mi na to, że nie masz ciapciakow (to [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
Pomogło, szkoda, że temat "ciapków" mnie pokonał...
Miałem ten sam error z integerem i stringiem we wcześniejszej lekcji i rozwiązałem go trochę inaczej: zamiast używać dodatkowej metody toString(), zamieniłem używanego przez Ciebie get() na getString() - i tu rodzi się moje pytanie: pod względem poprawności czy dobrych praktyk jest jakaś różnica?
Ja użyłem natywnej metody Integera, a Ty RestAss [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
Cześć, nie wiem czy lepiej pytać na SLACK czy tutaj więc zapytam pod konkretną lekcją 🙂 W zadaniu poprosiłeś by wylistować produkty i sprawdzić czy jest w tej liście produkt który stworzyliśmy. A czy nie lepsze/szybsze rozwiązanie jest takie by właśnie skorzystać z
queryParam("include", newId)
.Pytam z ciekawości. Może takie rozwiązanie niesie za sobą jakieś minusy których teraz nie dostrzegam
Dobrze, ze pytasz pod lekcja 🙂
Lepszym rozwiazan [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.