​Modelima-vođeno automatsko generisanje testova

Modelima-vođeno softversko inženjerstvo zasniva se na eksploataciji modela sistema ili određenog domena, sa ciljem automatizovanja procesa razvoja softvera [6]. U ovom kontekstu, modeli se mogu iskoristiti na različite načine – za generisanje dokumentacije, izvršivog koda, ali i verifikaciju i validaciju. Između ostalog, modelima-vođen pristup ima puto potencijala što se testiranja u autmobilskoj industriji tiče.

Recimo, kompanija BMW je razvila domenski-specifičnu notaciju sličnu dijagramima aktivnosti, a na osnovu ovih modela se automatski generišu izvršivi testovi [7]. U ovom članku, naš fokus je na primeni metamodela test case-ova za generisanje GMock testova.

Metamodel predstavlja “kalup” koji služi za kreiranje konkretnih instanci modela. Za ovu svrhu, koristićemo Eclipse Modeling Framework (EMF) [8] , koji da je mogućnost da se na osnovu opisa metamodela u XMI formatu generiše skup alata i Java adapterskih klasa za manipulaciju modelima. Jezgro EMF-a je Ecore tehnologija za metamodeliranje. Osim toga, na osnovu Ecore metamodela se generiše i Eclipse okruženje za kreiranje instance modela. Slika 3 prikazuje metamodel koji smo razvili sa svrhom generisanja GMock testova.

Slika 3 Automotive Mock Test Generation Metamodel (AMTG metamodel)

Kao što se može videti, metamodel prati notaciju i strukturu GMock testova. Entitet najvišeg nivoa je TestCase. On predstavlja test slučaj koji može imati jednu ili više test metoda (TestMethod). Dalje, svaka test metoda ima jedno ili više očekivanja (Expectation), koja obuhvataju pozive funkcija (FunctionCall) MockObject-a. Osim toga, test sadrži i pozive metoda realnih objekata (RealObject), koji korste mock objekte. Osim toga, svaki poziv metode realnog objekta ima skup argumenata, koji dalje sadrže naziv, ali i vrednost. Između ostalog, svaka test metoda ima boolean atribut sequence, od čije vrednosti zavisi da li se gleda redosled poziva mock metoda prilikom testiranja ili ne.

Korišćenjem ovog metamodela, EMF automatski generiše kompletan editor korisničkih modela u Eclipse-u. Ovde korisnik ima mogućnost da upotrebom grafičkog korisničkog interfejsa specificira strukturu i parametre testova. Na Slici 4 je prikazan snimak ekrana iz okruženja za modelovanje prilikom konstrukcije testa iz Listinga 7.

Slika 4 Konstruisanje gMock testa iz automatski generisanog okruženja na osnovu AMTG metamodela

Što se generisanja koda tiče, implementirana je klasa MockTestGenerator koja ima dve ključne metode – loadTestModel(File model_file) – Listing 9. i generateTestCode(TestCase tc) – Listing 10. Prva metoda na iz zadatog fajla modela sa ekstenzijom .amtg vraća entitet najvišeg nivoa – TestCase. Sa druge strane, druga metoda generiše GMock test na osnovu reference TestCase objekta i vraća ga kao string.

 

Listing 9 Metoda za čitanje modela testa iz fajla

Metoda za generisanje koda obilazi fajl i generiše odgovarajuće sekcije GMock testa. Prvo pronađe sve test metode i generiše liniju poziva makroa, sa odgovarajućim nazivima (part1). Posle toga, pribave se svi Mock objekti iz modela i generiše kod za deklaraciju (part2). Zatim, obilaze se sva očekivanja iz test metode i prikupljaju parametri o tipu očekivanja i metoda mock objekata na koje se odnose (part 3). Konačno, generiše se linija poziva funkcije realnog objekta koji se oslanja na mock-ove (part 4). Na kraju, proverava se i sequence svojsta, pa zavisno od toga dodaje linija za omogućavanje sekvencijalnog poziva mock metoda pre konkatenacije part1-part4.

Listing 10 Metoda za čitanje generisanje GMock testa korišćenjem modela

Za generisanje testa iz Listinga 6 bilo je potrebno oko 0.0052 sekundi, dok 0.0049 za test iz Listinga 7. Ova razlika se objašnjava time što je u prvom testu i redosled poziva od značaja, pa se generiše i linija za InSequence objekat. Prema tome, ovakav pristup zasita ima potencijala za ubrzavanje procesa ručnog kreiranja testova interakcije u gMock-u, s obzirom da je za ručno kreiranje ovakvih testova bilo potrebno oko 15 minuta. Iako predloženi pristup takođe obuhvata modeliranje testova u grafičkom okruženju, ipak ovaj ručni korak značajno kraće traje od postupka kompletnog pisanja testa.

Zaključak

U ovom članku, proučena je primena GTest framework-a za implementaciju jediničnih testova za C++ i GMock biblioteke za rad sa mock klasama u testovima interakcije. Osim toga, korišćen je i Bazel koji olakšava rad sa zavisnostima i build-ovaje ovako implementiranih testova. Glavna motivacija ovog bloga je primena prethodno navedenih alata za automatizovano testiranje softvera u automobilskoj industriji.

Može se zaključiti da prikazane tehnologije zaista imaju veliki potencijal što se tiče primene u automobilskoj industriji, zato što pružaju veliki broj korisnih funkcionalnosti koje automatizuju pojedine korake, tako da se celokupno manje vremena troši na implementaciju testove u poređenju sa pristupom kada se interakcioni testovi realizuju ručno, bez pomoćnih biblioteka.

Osim toga, modelima-vođeni pristup koji eksploatiše automatsko generisanje koda na osnovu modela olakšava i ubrzava proces konstruisanja GMock testova.

Autori: Maša Radenković, Nenad Petrović

Dodaci

[3] GMock primeri: https://github.com/penenadpi/bazel_gmock_gtest_examples

[4] Generator testova: https://github.com/penenadpi/amtg

Literatura

[6] M. Brambilla, J. Cabot, M. Wimmer, Model-Driven Software Engineering in Practice, 2nd Edition,   ‎ Morgan & Claypool Publishers, 2017.

[7] I. Drave et al., “SMArDT modeling for automotive software testing”, Volume 49, Issue 2 Special Issue: Software Engineering in Practice February 2019, pp. 301-328.

[8] Eclipse Modeling Framework [online]. Dostupno na: https://www.eclipse.org/modeling/emf/ , poslednji pristup: 07/05/2021.

Add comment