Hej alle! I dag vil vi gerne præsentere vores produkt for IT-samfundet — en IDE til arbejde med API'er . Nogle af jer kender måske allerede til os fra . Men der har ikke været en omfattende anmeldelse af værktøjet, så vi udbedrer denne ærgerlige mangel.

Motivation
Vi vil gerne starte med at fortælle, hvordan vi kom til at lave vores eget værktøj til avanceret arbejde med API'er. Lad os begynde med en liste over funktionaliteter, som produktet, der efter vores mening fortjener betegnelsen "IDE til arbejde med API'er", bør have:
- Oprettelse og udførelse af anmodninger og scripts (sekvenser af anmodninger)
- Skrivning af forskellige typer tests
- Generering af tests
- Håndtering af API-dokumentation, inklusive import fra formater som Swagger, OpenAPI, WADL osv.
- Mocking af anmodninger
- God support for et eller flere programmeringssprog til skrivning af scripts, inklusive integration med populære biblioteker
- osv.
Listen kan udvides efter behov. Det er vigtigt ikke kun at skabe selve IDE'en, men også en bestemt infrastruktur, såsom cloud-synkronisering, kommandolinjeværktøjer, online overvågning osv. I de senere år har trends ikke kun dikteret et kraftfuldt funktionalitet, men også et brugervenligt interface.
Hvem har brug for et sådant værktøj? Åbenbart alle, der på en eller anden måde er involveret i udvikling og testning af API'er — udviklere og testere =). For de førstnævnte er det ofte tilstrækkeligt at udføre enkeltanmodninger og simple scripts, mens det for testere er et af de vigtigste værktøjer, der udover dette bør inkludere en kraftfuld mekanisme til at skrive tests med mulighed for at køre dem i CI.
Så, i overensstemmelse med disse retningslinjer, begyndte vi at udvikle vores produkt. Lad os se, hvad vi har opnået på dette stadium.
Hurtig start
Lad os starte med den første introduktion til applikationen. Du kan downloade den . I øjeblikket understøttes alle 3 hovedplatforme — Windows, Linux, MacOS. Download, installer, start. Ved første opstart kan du se følgende vindue:

Klik på plus-tegnet øverst i indholdsområdet for at oprette din første anmodning. Fanen med anmodningen ser således ud:

Lad os se nærmere på det. Forespørgselsgrænsefladen ligner meget grænsefladen fra populære REST-klienter, hvilket gør overgangen fra sådanne værktøjer lettere. Lad os udføre den første forespørgsel på url

Umiddelbart ser response-panelet heller ikke ud til at bringe nogen overraskelser. Men jeg vil gerne påpege nogle punkter:
- Response-kroppen præsenteres som et træ, hvilket både tilføjer information og gør det muligt at tilføje nogle interessante funktioner, som jeg nævner nedenfor.
- Der er en faneblad for Assertions, hvor en liste over test for denne forespørgsel vises.
Som det kan ses, kan vores værktøj også bruges som en praktisk REST-klient. Men vi ville ikke være her, hvis dets funktioner kun omfattede at sende forespørgsler. Nedenfor vil jeg forklare de grundlæggende begreber og funktionalitet i TestMace.
Grundlæggende begreber og muligheder
Node
Funktionaliteten i TestMace er opdelt efter forskellige typer noder. I eksemplet ovenfor har vi vist arbejdet med RequestStep-noden. Men der er nu også tilgængelige følgende typer noder i applikationen:
- RequestStep. Dette er noden, som kan bruges til at oprette en forespørgsel. Som et underordnet element kan den kun have én Assertion-node.
- Assertion. Noden bruges til at skrive tests. Den kan kun være en underordnet node for RequestStep-noden.
- Folder. Giver mulighed for at gruppere Folder og RequestStep-noder inden for sig.
- Project. Dette er rodenoden, der automatisk oprettes, når et projekt oprettes. Ellers gentager den funktionaliteterne fra Folder-noden.
- Link. Et link til en Folder- eller RequestStep-node. Giver mulighed for at genbruge forespørgsler og scripts.
- osv.
Noderne er placeret i scratches (panelet nederst til venstre, der bruges til hurtigt at oprette 'engangs' forespørgsler) og i project (panelet øverst til venstre), som vi vil se nærmere på.
Projekt
Når du starter applikationen, kunne du have bemærket den ensomme række Project i øverste venstre hjørne. Dette er roden af projektets træ. Når projektet starts, oprettes et midlertidigt projekt, hvis sti afhænger af dit operativsystem. På ethvert tidspunkt kan du flytte projektet til et sted, der passer dig.
Hovedformålet med projektet er at gemme arbejdet i filsystemet og synkronisere det gennem versionskontrolsystemer, køre scripts i CI, gennemgå ændringer osv.
Variabler
Variabler er en af de centrale mekanismer i applikationen. De af jer, der arbejder med værktøjer som TestMace, har måske allerede en idé om, hvad der er på spil. Så, variabler er en måde at gemme fælles data og kommunikere mellem noder. Et eksempel kunne være miljøvariabler i Postman eller Insomnia. Men vi har taget et skridt videre og videreudviklet ideen. I TestMace kan variabler sættes på nodeniveau. Enhver. Der eksisterer også en mekanisme til at arve variabler fra forfædre og til at overskrive variabler i efterkommere. Derudover er der et antal indbyggede variabler, hvis navne starter med $. Her er nogle af dem:
$prevStep— henvisning til variablerne fra den foregående node$nextStep— henvisning til variablerne fra den næste node$parent— det samme, men kun for en forfader$response— svar fra serveren$env— de nuværende miljøvariabler$dynamicVar— dynamiske variabler, der oprettes under udførelsen af scenariet eller anmodningen
$env — dette er i bund og grund almindelige variabler på Project-node niveau, men sæt variablerne ændres afhængigt af det valgte miljø.
Adgang til en variabel sker gennem ${variable_name}
Som værdi for variablen kan der være en anden variabel, eller endda et helt udtryk. For eksempel, som en variabel kan url være et udtryk af typen
http://${host}:${port}/${endpoint}.
Det skal bemærkes, at der er mulighed for at tildele variabler under udførelsen af scriptet. For eksempel, der opstår ofte behov for at gemme autorisationsoplysninger (token eller hele headeret), som kom fra serveren efter en vellykket login. TestMace giver mulighed for at gemme sådanne data i dynamiske variabler fra en af forfædrene. For at undgå kollisioner med allerede eksisterende "statiske" variabler, er dynamiske variabler placeret i et separat objekt. $dynamicVar.
Scenarier
Ved at bruge alle ovennævnte funktioner kan du udføre hele scenarier af anmodninger. For eksempel, oprettelse af en enhed -> anmodning om enhed -> sletning af enhed. I dette tilfælde kan du for eksempel bruge Folder-noden til at gruppere flere RequestStep-noder.
Autoudfyldning og fremhævelse af udtrykkets værdi
For convenience when working with variables (and more), auto-completion is essential. And of course, highlighting the value of the expression makes it easier and more convenient to clarify what a certain variable equals. This is one of those cases where it's better to see once than to hear a hundred times:

It should be noted that auto-completion is implemented not only for variables but also, for example, for headers, specific header values (like auto-completion for the Content-Type header), protocols, and much more. The list is constantly expanding as the application grows.
Undo/redo
Canceling/repeating changes is very handy, but for some reason, it's not implemented everywhere (API tools are no exception). But we're not like that!) Undo/redo is implemented throughout the entire project, allowing not only to cancel the editing of a specific node but also its creation, deletion, movement, etc. The most critical operations require confirmation.
Creating tests
The Assertion node is responsible for creating tests. One of its main features is the ability to create tests without programming, using built-in editors.
The Assertion node consists of a set of assertions. Each assertion has its type, and at present, there are several types of assertions.
Compare values — simply compares 2 values. There are several comparison operators: 'equals', 'not equals', 'greater', 'greater or equal', 'less', 'less or equal'.
Contains value — checks for the presence of a substring within a string.
XPath — checks that a specific value is present according to the selector in XML.
JavaScript assertion — an arbitrary script in JavaScript that returns true if successful and false if it fails.
I should note that only the last one requires programming skills from the user; the other 3 assertions are created using a graphical interface. Here's, for example, how the dialog for creating a compare values assertion looks:

The cherry on top is the quick creation of assertions from the response; just take a look at this!

However, such assertions have obvious limitations, and when faced with them, you can use JavaScript assertions. Here, TestMace also provides a comfortable environment with auto-completion, syntax highlighting, and even a static analyzer.
API description
TestMace giver dig ikke kun mulighed for at bruge API'et, men også at dokumentere det. Beskrivelsen har en hierarkisk struktur, der passer godt ind i resten af projektet. Derudover er det i øjeblikket muligt at importere API-beskrivelse fra Swagger 2.0 / OpenAPI 3.0 formater. Beskrivelsen er ikke bare dødt vægt; den integreres tæt med resten af projektet, især med autocomplete til URLs, HTTP-overskrifter, forespørgselsparametre og mere, og i fremtiden planlægger vi at tilføje tests for at sikre, at svaret stemmer overens med API-beskrivelsen.
Node-sharing
Case: Du ønsker at dele en problematisk forespørgsel eller endda et helt scenarie med en kollega eller blot vedhæfte det til en fejlrapport. TestMace dækker også dette scenario: applikationen giver mulighed for at serialisere enhver node og endda et undertræ til en URL. Copy-paste, og du har nemt flyttet forespørgslen til en anden maskine eller et andet projekt.
Menneskelæsbart format til projektlagring
I øjeblikket gemmes hver node i en separat fil med .yml-endelsen (som i tilfældet med Assertion noden) eller i en mappe med nodens navn og en index.yml fil i den.
Her er, hvordan en forespørgselsfil ser ud, som vi lavede i gennemgangen ovenfor:
index.yml
children: []
variables: {}
type: RequestStep
assignVariables: []
requestData:
request:
method: GET
url: 'https://next.json-generator.com/api/json/get/NJv-NT-U8'
headers: []
disabledInheritedHeaders: []
params: []
body:
type: Json
jsonBody: ''
xmlBody: ''
textBody: ''
formData: []
file: ''
formURLEncoded: []
strictSSL: Inherit
authData:
type: inherit
name: Scratch 1Som du kan se, er alt meget klart. Hvis ønskes, kan dette format redigeres komfortabelt manuelt.
Hierarkiet af mapper i filsystemet afspejler fuldstændigt hierarkiet af noderne i projektet. For eksempel mappes et scenarie som:

I filsystemet til følgende struktur (kun hierarkiet af mapper vises, men essensen er klar)

Dette letter gennemgangen af projektet.
Import fra Postman
Efter at have læst det ovenstående, vil nogle brugere måske ønsker at prøve (er det ikke rigtigt?) det nye produkt eller (hvem ved?) bruge det fuldt ud i deres projekt. Men migreringen kan blive stoppet af en masse arbejde i samme Postman. Til sådanne tilfælde understøtter TestMace import af samlinger fra Postman. I øjeblikket understøttes import uden tests, men vi udelukker ikke, at vi også vil støtte dem i fremtiden.
Planer
Jeg håber, at mange af dem, der har læst indtil nu, finder vores produkt attraktivt. Men det er ikke alt! Arbejdet med produktet er i fuld gang, og her er nogle af de funktioner, vi planlægger at tilføje snart.
Sky-synkronisering
En af de mest efterspurgte funktioner. I øjeblikket tilbyder vi at bruge versionskontrolsystemer til synkronisering, for hvilket vi gør formatet mere venligt for denne type opbevaring. Men ikke alle passer til denne arbejdsmetode, så vi planlægger at tilføje en mere almindelig synkroniseringsmekanisme gennem vores servere.
flagen -k til integration med
Som nævnt tidligere, så kan IDE-niveau produkter ikke undgå forskellige integrationer med allerede eksisterende applikationer eller workflows. CLI er netop nødvendigt for at integrere tests skrevet i TestMace i processen for kontinuerlig integration. Arbejdet med CLI er i fuld gang, i de tidlige versioner vil der være en projektstart med en simpel konsollrapport. På sigt planlægges det at tilføje rapportering i JUnit-format.
Plugin-system
På trods af al styrken i vores værktøj er mængden af sager, der kræver løsning, ubegribelig. I sidste ende er der opgaver, der er specifikke for et bestemt projekt. Derfor planlægger vi at tilføje et SDK til plugin-udvikling, så enhver udvikler kan tilføje funktionalitet efter behov.
Udvidelse af sortimentet af nodetyper
Dette udvalg af noder dækker ikke alle tilfælde, der er nødvendige for brugeren. Noder, der planlægges at blive tilføjet:
- Script-node — transformerer og placerer data ved hjælp af js og den relevante API. Ved at bruge denne type node kan man lave ting som pre-request og post-request scripts i Postman.
- GraphQL-node — support for graphql
- Custom assertion-node — giver mulighed for at udvide det eksisterende sæt af assertions i projektet
Naturligvis er dette ikke den endelige liste, den vil løbende blive opdateret, også takket være jeres feedback.
FAQ
Hvordan adskiller I jer fra Postman?
- Konceptet med noder, der næsten uendeligt kan skalere projektets funktionalitet
- Menneskelæsbar format for projektet, der gemmes i filsystemet, hvilket forenkler arbejdet med versionskontrolsystemer
- Muligheden for at oprette tests uden programmering og mere avanceret understøttelse af js i testeditoren (autofuldførelse, statisk analyse)
- Avanceret autoudfyldning og fremhævning af nuværende variabelværdier
Er det et open-source produkt?
Nej, koden er i øjeblikket lukket, men vi overvejer at åbne kilden i fremtiden.
Hvordan lever I?)
Ved siden af den gratis version planlægger vi at udgive en betalt version af produktet. Den vil primært indeholde funktioner, der kræver server-side, såsom synkronisering.
Konklusion
Vores projekt bevæger sig hurtigt mod en stabil release. Men produktet kan allerede bruges, og de positive tilbagemeldinger fra vores tidlige brugere bekræfter dette. Vi indsamler aktivt feedback, for uden tæt samarbejde med fællesskabet er det umuligt at bygge et godt værktøj. Du kan finde os her:
Vi ser frem til jeres ønsker og forslag!
Kilde: habr.com
