
Testarea este un aspect crucial al dezvoltării software, deoarece ajută la asigurarea calității și fiabilității produsului final. Cu toate acestea, când vine vorba de testarea unui mediu de dezvoltare integrat (IDE) care funcționează pe mai multe mașini și platforme, sarcina devine și mai dificilă. Cum rulați teste pe diferite mașini, le mențineți sincronizate și păstrați experiența de creare a testelor?
În această postare, vom analiza de ce și cum am implementat testarea distribuită pentru instrumentele noastre de dezvoltare la distanță și Code With Me.
De ce avem nevoie de testare distribuită pentru IDE-urile noastre
Majoritatea IDE-urilor pe care le dezvoltăm la JetBrains se bazează pe Platforma IntelliJ. Pentru a le asigura calitatea și funcționalitatea, efectuăm teste amănunțite. Din punct de vedere istoric, ne-am împărțit testele în două categorii:
Testele unitare, bazate pe cadrul junit sau testng, sunt cel mai comun mod de a testa logica. În aceste teste, pornim IDE-ul în modul headless – fără o interfață de utilizare și cu unele componente suprascrise. IDE rulează în cadrul procesului de testare unitară, permițându-ne să scriem cu ușurință codul de testare și să-l depanăm ulterior.
Testele UI Scripting sunt concepute pentru a testa interfața utilizator a IDE-ului. Aceste teste pornesc un proces IDE separat cu o interfață de utilizare și un container de componente real și comunică cu acesta folosind un sistem de comandă. Există relativ puține dintre aceste teste, deoarece rulează o perioadă semnificativă de timp și sunt mai dificil de scris. Pentru a crea aceste teste, o comandă specială trebuie implementată în cadrul aplicației și poate fi apelată doar după nume.
Aceste metode de testare au fost suficiente pentru dezvoltarea și menținerea calității Platformei IntelliJ de mulți ani. Cu toate acestea, odată cu introducerea de noi produse, cum ar fi Code With Me și Remote Development, au apărut noi provocări de testare. Aceste produse vă permit să vă conectați la un alt IDE care rulează pe alt computer.
Dezvoltarea la distanță vă permite să rulați un IDE pe o mașină la distanță, de obicei în modul headless, și să vă conectați la acesta folosind un client subțire pe o mașină locală.
Code With Me presupune că aveți deja un IDE cu un proiect deschis și vă permite să vă conectați la acesta de pe alt computer pentru a colabora la proiect. Acceptă mai mulți participanți.
În ambele scenarii există două sau mai multe procese IDE care rulează simultan. Niciunul dintre cadrele de testare existente nu acceptă acest scenariu, așa că a trebuit să dezvoltăm unul nou!
Construirea unui nou cadru de testare pentru IDE-uri distribuite
Pentru a testa eficient instrumentele noastre de dezvoltare la distanță și Code With Me, trebuia să creăm un cadru de testare care să ne ofere capacitatea de a:
Rulați mai multe procese IDE în diferite medii, posibil chiar și pe mașini diferite. Un caz de testare tipic este rularea unui IDE pe server pe Linux și conectarea clientului la acesta din Windows.
Rulați IDE-uri atât în mod UI, cât și în mod non-UI.
Scrieți cu ușurință codul de testare.
Depanați eficient codul de testare.
În scenariul nostru, nu este posibilă rularea IDE-urilor în cadrul procesului de testare unitară. Cu toate acestea, vrem în continuare să putem scrie și depana teste cât mai ușor posibil.
Avem deja un protocol RD special, care a fost dezvoltat inițial pentru ca Rider să conecteze procesul backend ReSharper la procesul IntelliJ Frontend. Mai târziu a fost folosit și în Code With Me și apoi în Remote Development pentru a conecta backend-ul IntelliJ la IntelliJ Thin Client. De ce să nu folosiți același protocol și aici? Este o soluție dovedită care poate fi integrată cu ușurință în cadrul nostru de testare.
Procesul de testare unitară de bază, fie junit, fie testng, este inițiat de IDE. Acest proces de testare unitară va genera alte procese IDE – unul pentru server și altele pentru clienți. Pentru dezvoltarea la distanță, va exista un singur client. Cu toate acestea, pentru Code With Me ar putea exista mai mulți clienți. Toate sunt conectate între ele și la procesul de testare unitară prin protocolul RD.
Noul cadru de testare a fost denumit „Cadru de testare distribuit”, deoarece este conceput pentru a rula teste care sunt distribuite pe mai multe procese sau mașini.
Testul constă în apeluri multiple care corespund diferitelor IDE-uri testate. Fiecare apel folosește API-ul IDE obișnuit, dar codul este executat în alte procese. Cum funcţionează asta?Metoda startServerAndClient rulează două procese IDE prin construirea unei căi de clasă. Acesta creează calea de clasă IDE implicită din toate modulele de bază și apoi îi adaugă borcane de testare specifice.
Procesul de testare stabilește ulterior o conexiune cu ele folosind protocolul RD și așteaptă ca IDE-urile să fie complet încărcate.
Apoi, trimite clasa de testare și metoda de testare specifică pentru a fi executate către toate IDE-urile conectate.
IDE-urile creează o clasă de testare (este deja prezentă în încărcătorul de clasă) și execută metoda de testare specificată.
Apoi, un test execută singur metoda de testare specificată.
Cheia este metoda perform. Este invocat de mai multe ori – o dată de procesul de testare unitară și din nou de procesele IDE. Când este apelat de un proces IDE, acesta stochează acțiunea într-o coadă. În procesul de testare unitară, acesta trimite un semnal către IDE-ul corespunzător, care apoi procedează la executarea acțiunii solicitate din coadă.
Acest cadru vă permite să scrieți cod pentru testarea cu mai multe procese ca și cum ar fi pentru un singur proces. Dar ce zici de depanare? IDE-urile moderne sunt echipate cu caracteristici avansate și pot atașa un depanator la procesul de testare unitară. Cu toate acestea, este posibil să nu fie posibilă setarea punctelor de întrerupere în cadrul metodelor perform, deoarece acestea sunt executate în procese separate, iar depanatorul IntelliJ nu are capacitatea de a rezolva această problemă.
Nici măcar IDE-urile puternice precum IntelliJ IDEA nu au capacitatea de a porni depanare pentru procesele începute de IDE. Cu toate acestea, în calitate de dezvoltatori IDE, putem rezolva această problemă!
Am dezvoltat un handler HTTP care ascultă cererile și atașează un depanator la procesul solicitat. L-am încorporat în devkit, o secțiune specializată de cod care le permite dezvoltatorilor IntelliJ să lucreze mai eficient.
În cadrul de testare, executăm următorul cod imediat după începerea procesului IDE.
Concluzie
Prin introducerea acestui cadru de testare inovator, am revoluționat modul în care testele sunt scrise și depanate pentru aplicațiile noastre distribuite. Cadrul este conceput pentru a face procesul cât mai fluid și fără efort posibil pentru dezvoltatori.
Uneori, a investi puțin timp în îmbunătățirea sculelor poate avea un impact semnificativ asupra productivității întregii echipe. În acest caz, a fost nevoie de doar 2-3 zile de muncă pentru a crea acest cadru, iar acum echipa noastră este capabilă să economisească ore de timp, să fie mai încrezătoare atunci când scrie aceste tipuri de teste și să se concentreze pe furnizarea de cod de înaltă calitate.
![]()
Etiam magna arcu, ullamcorper ut pulvinar et, ornare sit amet ligula. Aliquam vitae bibendum lorem. Cras id dui lectus. Pellentesque nec felis tristique urna lacinia sollicitudin ac ac ex. Maecenas mattis faucibus condimentum. Curabitur imperdiet felis at est posuere bibendum. Sed quis nulla tellus.
63739 street lorem ipsum City, Country
+12 (0) 345 678 9
info@company.com
