This shows you the differences between two versions of the page.
|
poo-ca-cd:laboratoare:programare-avansata-java [2026/01/12 00:13] florian_luis.micu [Task 1 – Unit Testing cu coverage ≥ 80% (6p)] |
poo-ca-cd:laboratoare:programare-avansata-java [2026/01/12 12:12] (current) florian_luis.micu [Unit testing vs Assertions] |
||
|---|---|---|---|
| Line 7: | Line 7: | ||
| =====Obiective===== | =====Obiective===== | ||
| - | =====Serializare și Deserializare===== | + | Scopul acestui laborator este introducerea studenților în concepte mai avansate care permit crearea framework-urilor și a aplicațiilor enterprise. |
| + | |||
| + | Aspectele urmărite sunt: | ||
| + | * înțelegerea conceptelor de testare. | ||
| + | * utilizarea corectă a mecanismului de reflection. | ||
| + | * exersarea serializărilor și deserealizărilor. | ||
| + | * implementarea și utilizarea corectă a adnotărilor. | ||
| + | * exersarea folosirii aserților. | ||
| + | * familiarizarea cu dependențe populare cum ar fi JUnit, Mockito, Jackson. | ||
| + | |||
| + | Aspectele **bonus** urmărite sunt: | ||
| + | * înțelegerea mecanismelor de logging. | ||
| + | * aprofundarea metodologiilor de dezvoltare software. | ||
| + | * Diferența dintre getClass() și instanceof. | ||
| + | * Organizarea memoriei pentru moștenire în Java. | ||
| + | |||
| + | <note warning> | ||
| + | * În acest laborator există mai multe secțiuni marcate **[Optional]**. Aceste secțiuni cuprind informații **bonus** care vă pot fi prezentate în **timpul laboratorului** sau pe care le puteți aprofunda **în afara** acestuia, ele nefiind necesare pentru laboratoarele viitoare sau pentru teme. | ||
| + | * De asemenea, veți întâlni câteva secțiuni marcate **[Nice to know]**. Vă recomandăm ca acestea să aibă **prioritate** în parcurgerea secțiunilor de tip **[Optional]**, deoarece vă pot oferi informații bonus care să fie și foarte probabil utile pentru **teme** sau **laboratoare viitoare**. | ||
| + | </note> | ||
| + | |||
| + | =====🔄 Serializare și Deserializare===== | ||
| ====Ce este serializarea?==== | ====Ce este serializarea?==== | ||
| Line 174: | Line 195: | ||
| ===De ce este Jackson preferat în aplicațiile moderne?=== | ===De ce este Jackson preferat în aplicațiile moderne?=== | ||
| - | De ce este Jackson preferat în aplicațiile moderne? | ||
| * JSON este lizibil și ușor de debugat, | * JSON este lizibil și ușor de debugat, | ||
| * este interoperabil cu alte limbaje, | * este interoperabil cu alte limbaje, | ||
| Line 339: | Line 359: | ||
| </code> | </code> | ||
| - | =====Adnotări în Java===== | + | =====🏷️ Adnotări în Java===== |
| ====Ce sunt adnotările?==== | ====Ce sunt adnotările?==== | ||
| Line 594: | Line 614: | ||
| - | =====Reflection în Java===== | + | =====🪞 Reflection în Java===== |
| ====Ce este Reflection?==== | ====Ce este Reflection?==== | ||
| Line 783: | Line 803: | ||
| - | =====Assertions===== | + | =====🔍 Assertions===== |
| ====Ce sunt assertions?==== | ====Ce sunt assertions?==== | ||
| Line 844: | Line 864: | ||
| - | =====Unit Testing===== | + | =====🔬 Unit Testing===== |
| ====Ce este Unit Testing?==== | ====Ce este Unit Testing?==== | ||
| Line 981: | Line 1001: | ||
| <note warning> | <note warning> | ||
| - | Interacțiunile cu: | + | Interacțiunile cu **componente externe** precum baze de date, rețea, sistemul de fișiere sau servicii externe nu mai țin de testarea izolată a unei unități de cod, ci fac parte din i**ntegration testing** sau, la un nivel mai larg, din **system testing**. |
| - | * baze de date | + | |
| - | * rețea | + | |
| - | * filesystem | + | |
| - | * servicii externe | + | |
| - | + | ||
| - | Acestea aparțin: | + | |
| - | * integration testing | + | |
| - | * system testing | + | |
| </note> | </note> | ||
| - | =====Integration Testing & Mocking===== | + | =====🧪 Integration Testing & Mocking===== |
| ====Ce este Integration Testing?==== | ====Ce este Integration Testing?==== | ||
| Line 1133: | Line 1145: | ||
| </note> | </note> | ||
| - | =====[Nice to know] Logging în Java ===== | + | =====[Nice to know] 🪵 Logging în Java ===== |
| ==== Ce este logging-ul? ==== | ==== Ce este logging-ul? ==== | ||
| Line 1212: | Line 1224: | ||
| * ''System.out.println'' → nu este logging | * ''System.out.println'' → nu este logging | ||
| </note> | </note> | ||
| + | |||
| + | =====[Optional] 🗺️ Software Development Methodologies===== | ||
| + | |||
| + | În urma paradigmei OOP, au fost concepute mai multe metodologii care pot augmenta performanța sau anumite abilități ale unui proiect conform necesităților. | ||
| + | |||
| + | De exemplu, **Data Oriented Design** (DOD) este o paradigmă care ajută programarea folosind obiecte prin folosirea **cache-ului**. Practic, clasele sunt refactorizate astfel încât să țină cont de mărimea cache-ului din procesor pentru a scădea drastic timpii de acces. Această paradigmă începe să fie destul de folosită în mediile în care viteza este importantă, cum ar fi programarea jocurilor video, drept urmare chiar și engine-ul Unity a fost rescris astfel încât să folosească DOD (găsiți articolul [[https://unity.com/dots|aici]]. | ||
| + | |||
| + | <note tip> | ||
| + | Vă recomandăm să parcurgeți secvențe din acest videoclip de la [[https://www.youtube.com/watch?v=yy8jQgmhbAU|CppCon]]. | ||
| + | </note> | ||
| + | |||
| + | O altă metodologie utilă este **Test Driven Development** (TDD) în care accentul este pus pe dezvoltarea testelor înainte de a dezvolta codul propriu-zis. Practic, după etapa de ideație, putem trece la crearea testelor care vor defini comportamentul corect al programului nostru, apoi vom dezvolta codul necesar pentru a putea trece cu succes peste testele scrise de noi. Puteți citi mai multe despre această abordare [[https://agilealliance.org/glossary/tdd/|aici]]. | ||
| + | |||
| + | De asemenea, o altă metodologie folosită este **Domain Driven Design** (DDD) care este o abordare de proiectare software în care structura aplicației este ghidată de domeniul de business, iar logica esențială este modelată prin concepte clare (entități, valori, agregate) definite împreună cu experți din domeniu, folosind un limbaj comun (ubiquitous language) pentru a menține codul aliniat cu realitatea problemei. Această abordare este detaliată în articolul scris de Redis [[https://redis.io/glossary/domain-driven-design-ddd/|aici]]. | ||
| =====Exerciții===== | =====Exerciții===== | ||
| Line 1328: | Line 1354: | ||
| <note tip>Denumirea și scopul claselor de mai sus respectă un standard folosit de framework-ul Spring.</note> | <note tip>Denumirea și scopul claselor de mai sus respectă un standard folosit de framework-ul Spring.</note> | ||
| + | |||
| + | ===== Resurse și link-uri utile ===== | ||
| + | * [[https://site.mockito.org/ | Mockito]] | ||
| + | * [[https://www.atlassian.com/continuous-delivery/software-testing/types-of-software-testing | Different types of software testing]] | ||
| + | * [[https://www.baeldung.com/java-logging-intro | Introduction to Java logging - Baeldung]] | ||
| + | * [[https://softwareengineering.stackexchange.com/questions/123956/why-should-i-use-reflection | Why should I use reflection and when? - StackOverflow]] | ||