Jeśli tworzysz JSONowe API napewno na pamięć znasz obsługę takich narzędzi jak Postman, Insomnia, Curl. Jednak tworząc zapytania za ich pomocą nie jest możliwe, aby przechowywać testy API w repozytorium i zarządzać nimi za pomocą kontroli wersji. Ja też myślałem, że się nie da, aż do czasu, gdy trafiłem na to nagranie: https://www.youtube.com/watch?v=n8KCuKhDSZY. Narzędzia od JetBrains posiadają wbudowany genialny plugin – HttpClient. W tym poście przygotowałem dla Ciebie krótki pokaz jego możliwości z wykorzystaniem Ruby Mine i Ruby on Rails. Testy API w repozytorium? Da się! I to bardzo!
Jako środowisko demonstracji posłużę się prostą aplikacją napisaną w Ruby on Rails. Stworzenie tego prostego API z symulowaną autoryzacją zajęło mi 7 minut! Specjalnie mierzyłem sobie czas. Dlatego właśnie kocham RoR! Ale do rzeczy.
Aplikacja ma prostą strukturę. Głównym aktorem jest użytkownik, który może posiadać książki i samochody. Kolekcjoner. Powiedzmy, że to taka typowa aplikacja katalogowa. W dużym uproszczeniu.
Strukturę danych stworzyłem poniższymi migracjami.
Definicja modeli:
I kontrolery.
Routing:
I <strong>ApplicationController</strong>
, w którego wrzuciłem właściwie całą logikę.
W API możemy:
- Sprawdzić, czy aplikacja działa (akcja
home
). - Pobrać wszystkie książki danego użytkownika z bazy.
- Pobrać wszystkie samochody danego użytkownika z bazy.
- Pobrać listę wszystkich użytkowników w bazie.
- Zalogować się do aplikacji i uzyskać token autoryzacyjny
Dostęp do danych konkretnego użytkownika jest zabezpieczony tokenem, który powinien być dostarczony w headerze Authorization
.
Przed odpaleniem utworzyłem w bazie kilku użytkowników, kilka książek i kilka samochodów.
Zaczynamy przygodę z HttpClientem. Wystarczy utworzyć plik z rozszerzeniem .http
a RubyMine ogarnie resztę i dostosuje interfejs do odpalania zapytań.
Utworzyłem plik api_test.http
.
Pierwsze zapytania. Sprawdzam, czy API działa. Wystarczy tylko jedna linijka:
GET http://localhost:3000
I rezultat:
Dobra, ale zapewne na jednym zapytaniu się nie skończy. Na szczęście nie muszę za każdym razem wpisywać adresu w kolejnych zapytaniach, co więcej mogę mieć skonfigurowane adresy dla różnych środowisk i odpalać mojego klienta w jednym z nich.
Dodaję plik http-client.env.json
, w którym ustawiam środowisko i zmienną url
.
{
"development": {
"url": "http://localhost:3000"
}
}
I teraz zamiast naklepanego adresu url mogę użyć zmiennej. IDE mi wszystko pięknie podpowiada.
Kolejne zapytania oddzielamy trzema hashami: ###
Pora na logowanie
Dodaję nowy request, tym razem typu POST. Zobacz jak łatwo definiuję headery i parametry.
Autoryzacja się powiodła i w odpowiedzi dostałem auth_token
. Teraz pora go przechwycić, przypisać do zmiennej i wykorzystywać w kolejnych zapytaniach. Służy do tego kod, który umieszczamy w klamrach z procentem {% %}
, a jest to po prostu JavaScript.
POST{{url}}/login
Accept: application/json
Content-Type: application/json
{
"email": "user1@email.com",
"password": "password"
}
> {%
auth_token = response.body['auth_token']
client.global.set("token", auth_token)
%}
###
GEThttp://{{url}}/users/1
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{token}}
Możemy teraz autoryzować nasze zapytania za pomocą tokena:
HttpClient ma też coś dla fanów testów. Można pisać testy automatyczne do zapytań! Testy te odpalają się razem z zapytaniami, a ich rezultat jest widoczny w runnerze w IDE.
###
GEThttp://{{url}}/users/1
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{token}}
> {%
client.test("Get User",function() {
client.assert(response.body['books_count'] === 5, "Books count returned is wrong")
})
client.test("Status",function() {
client.assert(response.status === 200, "Response status is not 200")
})
%}
Co teraz? Git commit, git push. I pyk mamy wersjonowane testy API.
Repozytorium z powyższym kodem znajdziesz tutaj.
Zobacz też jak w prosty sposób wyświetlać przejrzyste rezultaty testów w formie dokumentacji.