
Cześć wszystkim, z tej strony ! Możliwe, że wielu z was zna nas z . Dla tych, którzy dopiero się dołączyli: opracowujemy IDE do pracy z API TestMace. Najczęściej zadawane pytanie podczas porównywania TestMace z konkurencyjnymi produktami to „Czym różnicie się od Postmana?”. Postanowiliśmy, że nadeszła pora, aby odpowiedzieć szczegółowo na to pytanie. Poniżej przedstawiamy nasze zalety w porównaniu z .
Podział na węzły
Jeśli korzystasz z Postmana, wiesz, że interfejs zapytań zawiera wszystkie potrzebne funkcje. Są tam zarówno skrypty, jak i testy, oraz same zapytania. Ułatwia to pracę dla początkujących, jednak w przypadku większych scenariuszy takie podejście nie jest elastyczne. Co jeśli chcesz stworzyć kilka zapytań i przeprowadzić agregację? Co jeśli chcesz wykonać skrypt bez zapytania lub kilka logicznie rozdzielonych skryptów po kolei? W końcu, dobrze byłoby oddzielić testy od zwykłych skryptów użytkowych. Poza tym, podejście „dodajemy wszystkie funkcje do jednego węzła” jest nie skalowalne - interfejs szybko staje się przeciążony.
TestMace z założenia dzieli wszystkie funkcje na różne typy węzłów. Chcesz zrobić zapytanie? Oto węzeł. Chcesz napisać skrypt? Oto węzeł. Potrzebne testy? Proszę — węzeł. Ach tak, możesz także wszystko to owinąć w węzeł. I wszystko to łatwo łączy się ze sobą. Takie podejście jest nie tylko bardzo elastyczne, ale także, zgodnie z zasadą pojedynczej odpowiedzialności, pozwala korzystać tylko z tego, co naprawdę potrzebujesz w danym momencie. Po co mi skrypty i testy, jeśli chcę po prostu wykonać zapytanie?
Czytelny format projektu
Między TestMace a Postmanem istnieje różnica koncepcyjna w sposobie przechowywania. W Postmanie wszystkie zapytania są przechowywane gdzieś w lokalnej pamięci. Jeśli zachodzi potrzeba udostępnienia zapytań między wieloma użytkownikami, należy skorzystać z wbudowanej synchronizacji. W rzeczywistości jest to powszechnie akceptowane podejście, które ma swoje wady. A co z bezpieczeństwem danych? Polityka niektórych firm może nie pozwalać na przechowywanie danych u osób trzecich. Uważamy jednak, że TestMace może zaproponować coś lepszego! A nazwą tego udoskonalenia jest „czytelny format projektu”.
Zacznijmy od tego, że w TestMace istnieje pojęcie „projektu”. Aplikacja została zaprojektowana z myślą o przechowywaniu projektów w systemach kontroli wersji: struktura drzewa projektu niemal jednoznacznie odwzorowuje strukturę folderów, jako format przechowywania używany jest yaml (bez zbędnych nawiasów i przecinków), a reprezentacja plikowa każdego węzła jest szczegółowo opisana w dokumentacji z komentarzami. W większości przypadków nie będziesz musiał do niej zaglądać — wszystkie nazwy pól mają logiczne nazwy.
Co to daje użytkownikowi? Umożliwia bardzo elastyczne zmienianie przepływu pracy zespołu, korzystając ze znanych podejść. Na przykład programiści mogą przechowywać projekt w tym samym repozytorium, co backend. W gałęziach, oprócz zmiany samej bazy kodu, programista może poprawić istniejące scenariusze zapytań i testy. Po zatwierdzeniu zmian w repozytorium (git, svn, mercurial — co wolisz) CI (twoje ulubione, nie narzucone przez nikogo) uruchamia nasze narzędzie konsolowe , a raport uzyskany po wykonaniu (na przykład w formacie junit, który również jest wspierany w testmace-cli) jest wysyłany do odpowiedniego systemu. Oznacza to, że wcześniej wymieniony problem z bezpieczeństwem już nie stanowi problemu.
Jak widać, TestMace nie narzuca swojej ekosystemu i paradygmatu. Zamiast tego łatwo integruje się z już ustalonymi procesami.
Zmienne dynamiczne
TestMace podąża za koncepcją no-code: jeśli problem można rozwiązać bez użycia kodu, staramy się to umożliwić. Praca ze zmiennymi to właśnie ten funkcjonalność, gdzie w większości przypadków można obyć się bez programowania.
Przykład: otrzymaliśmy odpowiedź z serwera i chcemy zapisać część odpowiedzi w zmiennej. W Postmanie napisalibyśmy w skrypcie testowym (co samo w sobie jest dziwne) coś w stylu:
var jsonData = JSON.parse(responseBody);
postman.setEnvironmentVariable("data", jsonData.data);Jednak naszym zdaniem pisanie skryptu dla tak prostego i często używanego scenariusza wydaje się zbędne. Dlatego w TestMace istnieje możliwość przypisania zmiennej części odpowiedzi, korzystając z interfejsu graficznego. Zobacz, jak to jest proste:

A teraz przy każdym żądaniu ta dynamiczna zmienna będzie aktualizowana. Możesz jednak mieć wątpliwości, argumentując, że podejście Postmana jest bardziej elastyczne i pozwala nie tylko na przypisanie, ale także na wykonanie pewnej wstępnej obróbki. Oto jak można zmodyfikować poprzedni przykład:
var jsonData = JSON.parse(responseBody);
postman.setEnvironmentVariable("data", CryptoJS.MD5(jsonData.data));Cóż, w TestMace jest na to węzeł, który pokrywa ten scenariusz. Aby odtworzyć poprzedni przypadek, ale już w wykonaniu TestMace, należy po żądaniu utworzyć węzeł script i jako skrypt użyć następującego kodu:
const data = tm.currentNode.prev.response.body.data;
tm.currentNode.parent.setDynamicVar('data', crypto.MD5(data));Jak widać, kompozycja węzłów znowu się sprawdziła. A w tak prostej sytuacji, jak opisano powyżej, możesz nawet po prostu przypisać wyrażenie ${crypto.MD5($response.data)} do zmiennej tworzonej za pomocą interfejsu graficznego!
Tworzenie testów przez GUI
Postman pozwala na tworzenie testów poprzez pisanie skryptów (w przypadku Postmana jest to JavaScript). To podejście ma same zalety — praktycznie nieograniczona elastyczność, dostępność gotowych rozwiązań itd.
Jednak rzeczywistość często wygląda tak (to nie my tacy, życie takie), że tester nie ma umiejętności programowania, a wartością dla zespołu chciałby być już teraz. W takich przypadkach, zgodnie z koncepcją no-code, TestMace pozwala na tworzenie prostych testów za pośrednictwem interfejsu graficznego, bez pisania skryptów. Oto, jak wygląda proces tworzenia testu, który porównuje wartości pod kątem równości:

Jednak tworzenie testów w edytorze graficznym nie wyklucza możliwości . Tutaj są te same biblioteki, co w węźle script, a do pisania testów.
Możliwość uruchomienia już istniejącego scenariusza za pomocą linku (węzeł Link)
Często zdarzają się sytuacje, gdy pewne żądanie lub nawet cały scenariusz należy wykonać kilka razy w różnych częściach projektu. Przykładami takich żądań mogą być niestandardowa wieloetapowa autoryzacja, doprowadzenie środowiska do pożądanego stanu itd. Generalnie mówiąc w terminach języków programowania, chciałoby się mieć funkcje, które można wykorzystywać ponownie w różnych częściach aplikacji. W TestMace tę funkcję spełnia węzeł. Korzystanie z niego jest bardzo proste:
1) stwórz żądanie lub skrypt
2) utwórz węzeł typu Link
3) w parametrach wskaż link do skryptu stworzonego w kroku pierwszym
W bardziej zaawansowanej wersji, możesz wskazać, które dynamiczne zmienne ze skryptu powinny być przekazywane na poziom wyżej w stosunku do linku. Brzmi skomplikowanie? Powiedzmy, że stworzyliśmy Folder o nazwie create-post, w którym do danego węzła przypisuje się dynamiczną zmienną postId. Teraz w węźle Link create-post-link możesz wyraźnie wskazać, że zmienna postId jest przypisywana do nadrzędnego create-post-link. Ta mechanika (znowu, mówiąc językiem programistów) może być używana do zwracania wyniku z „funkcji”. Generalnie super, DRY na pełnej wysokości i znowu żadna linijka kodu nie ucierpiała.

Jeśli chodzi o Postman, to prośba o funkcjonalność ponownego wykorzystania żądań , i podobno nawet istnieją , że nad tym problemem pracują. W obecnej formie Postman oczywiście ma możliwość zmiany przepływu wykonania, co teoretycznie może pozwalać na realizację podobnego zachowania, ale to raczej brudna sztuczka niż naprawdę działające podejście.
Inne różnice
- Większa kontrola nad zakresem widoczności zmiennych. Najmniejszym zakresem, w którym można zdefiniować zmienną w Postman, jest kolekcja. TestMace pozwala zdefiniować zmienne dla dowolnego żądania lub folderu. W Postman funkcja Share collection pozwala eksportować tylko kolekcje, podczas gdy w TestMace udostępnianie działa dla dowolnego węzła.
- TestMace wspiera , które domyślnie mogą być przekazywane do podrzędnych żądań. W Postman w tej sprawie istnieje , które zostało nawet zamknięte, ale jako rozwiązanie proponuje się... . W TestMace wszystko to konfiguruje się za pomocą GUI i można opcjonalnie wyłączyć dziedziczone nagłówki w konkretnych potomkach.
- Cofnij/Odtwórz. Działa nie tylko podczas edytowania węzłów, ale także przy przenoszeniu, usuwaniu, zmienianiu nazw i innych operacjach, które zmieniają strukturę projektu.
- Pliki dołączone do żądań stają się częścią projektu i są przechowywane razem z nim, przy tym doskonale synchronizują się, w przeciwieństwie do Postman. (Tak, już nie musisz za każdym razem ręcznie wybierać plików przy każdym uruchomieniu i przesyłać ich kolegom w archiwach).
Funkcje, które są już na horyzoncie
Nie mogliśmy się oprzeć pokusie uchylenia rąbka tajemnicy dotyczącej nadchodzących wydań, zwłaszcza gdy funkcjonalność jest bardzo smakowita i już przechodzi fazę przedpremierowego dopracowywania. Oto poznajcie.
Funkcje
Jak wiadomo, do generowania wartości w Postmanie używane są tzw. dynamiczne zmienne. a zdecydowana większość funkcji służy do generowania fałszywych wartości. Na przykład, aby wygenerować losowy adres email, należy napisać:
{{$randomEmail}}Jednak ponieważ są to zmienne (choć dynamiczne), nie można ich używać jak funkcji: nie są parametryzowane, co oznacza, że nie można wziąć hasha z ciągu.
W TestMace planujemy dodać „uczciwe” funkcje. Bezpośrednio w ${} będzie można nie tylko odwołać się do zmiennej, ale także wywołać funkcję. Tzn. jeśli trzeba będzie wygenerować słynny fałszywy adres email, po prostu napiszemy
${faker.internet.email()}Oprócz tego, że jest to funkcja, można zauważyć możliwość wywołania metody obiektu. Zamiast dużej płaskiej listy dynamicznych zmiennych, mamy zestaw logicznie pogrupowanych obiektów.
A co jeśli chcemy obliczyć hash z ciągu? Nic prostszego!
${crypto.MD5($dynamicVar.data)}Można zauważyć, że jako parametry można nawet przekazywać zmienne! W tym miejscu dociekliwy czytelnik może poczuć się zaniepokojony…
Użycie JavaScript w wyrażeniach
… I nie bez powodu! Kiedy zaczęto formułować wymagania dla funkcji, nagle doszliśmy do wniosku, że w wyrażeniach należy umożliwić pisanie poprawnego javascriptu. Dlatego teraz możesz pisać wyrażenia w stylu:
${1 + '' + crypto.MD5('asdf')}I to wszystko bez skryptów, prosto w polach wejściowych!
Co do Postmana, to tutaj można używać tylko zmiennych, a przy próbie napisania choćby minimalnego wyrażenia, walidator się sprzeciwia i odmawia jego obliczenia.
![]()
Zaawansowane uzupełnianie
Na chwilę obecną TestMace ma standardowe uzupełnianie, które wygląda następująco:

Tutaj oprócz uzupełnianego ciągu wskazane jest, do czego należy dany ciąg. Mechanizm ten działa tylko w wyrażeniach otoczonych nawiasami ${}.
Jak można zauważyć, dodano wizualne wskaźniki, które wskazują na typ zmiennej (na przykład, ciąg, liczba, tablica itd.). Można również zmieniać tryby autouzupełniania (na przykład, można wybrać autouzupełnianie zmiennymi lub nagłówkami). Ale nawet to nie jest najważniejsze!
Po pierwsze, autouzupełnianie działa nawet w wyrażeniach (gdzie to możliwe). Oto jak to wygląda:

I po drugie, teraz autouzupełnianie jest dostępne także w skryptach. Zobacz, jak to działa!

Nie ma sensu porównywać tej funkcjonalności z Postmanem — tam autouzupełnianie ogranicza się tylko do statycznych list zmiennych, nagłówków i ich wartości (popraw mnie, jeśli coś pominąłem). Skrypty nie są autouzupełniane 🙁
Podsumowanie
W październiku minął rok od rozpoczęcia prac nad naszym produktem. W tym czasie udało nam się zrobić wiele rzeczy i w niektórych aspektach dogoniliśmy naszych konkurentów. Jakby nie było, naszym celem jest stworzenie naprawdę wygodnego narzędzia do pracy z API. Przed nami jeszcze wiele pracy, oto przybliżony plan rozwoju naszego projektu na najbliższy rok: .
Twoje uwagi pomogą nam lepiej zorientować się w obfitości funkcji, a twoje wsparcie daje nam siłę i pewność, że robimy to, co jest potrzebne. Dziś przypadkiem przypada ważny dzień dla naszego projektu — dzień publikacji TestMace na . Proszę, wspieraj nasz projekt, to dla nas bardzo ważne. Tym bardziej, że na naszej stronie PH dzisiaj jest kusząca oferta i jest ona ograniczona.
Źródło: habr.com
