This shows you the differences between two versions of the page.
icalc:laboratoare:laborator-07 [2022/04/14 16:03] theodor.ungureanu [Introducere] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laborator 07 - Test-driven development ===== | ||
- | |||
- | |||
- | <note warning> | ||
- | Best to have: **InteliJ** | ||
- | * Instalare: https://ocw.cs.pub.ro/courses/poo-ca-cd/resurse-utile/instalare-intellij-idea | ||
- | * Activare: https://ocw.cs.pub.ro/courses/poo-ca-cd/resurse-utile/activare-intellij-idea | ||
- | </note> | ||
- | |||
- | |||
- | <hidden> | ||
- | <hidden> | ||
- | |||
- | ==== Introducere ==== | ||
- | |||
- | {{:icalc:laboratoare:07:lab7-joke.jpeg?200|}} | ||
- | |||
- | De cele mai multe ori, dupa ce un programator finalizeaza scrierea unui "program" dupa anumite specificatii acesta este trimis catre echipa de testare in vedere gasirii bugurilor. Daca sunt gasite probleme "programul" se intoarce in faza de dezvoltare pentru a fi remediate. Acest schimb intre programator si echipa de testare se poate face de un numar suficient de mare de ori pana cand toate problemele sa fie rezolvate. Pentru a evita situatia enumerata mai sus se poate folosi tehnica TDD prin care programatorul scrie inainte teste inainte de a implementa o anumita functionalitate. | ||
- | |||
- | === Ce inseama TDD? === | ||
- | |||
- | {{:icalc:laboratoare:07:lab7-tdd.png?400|}} | ||
- | |||
- | TDD (Test Driven Development) este o abordare a dezvoltarii de software prin care testele sunt scrise inaite ca softul sa fie scris. | ||
- | |||
- | Aceasta metoda contine 3 pasi: | ||
- | - Ordered List Item se scrie un test care sa pice | ||
- | - se scrie minimul de cod necesar pentru a face testul sa treaca | ||
- | - se curata codul scris si se refactorizeaza daca este nevoie | ||
- | |||
- | |||
- | === Cum pregatim proiectul? === | ||
- | | ||
- | In cadrul acestui laborator vom face de la 0 un proiect si vom urma toti pasii necesari pentru a dezvolta software folosind TDD. | ||
- | * Folosind interfata IntelliJ vom face un nou proiect denumit Laborator7 | ||
- | |||
- | {{ :icalc:laboratoare:07:project1.png?400|}} | ||
- | {{:icalc:laboratoare:07:project2.png?400 |}} | ||
- | |||
- | <note> | ||
- | Pentru a separa partea de cod de partea de testare vom face 2 package-uri. In package-ul denumit **Code** vom adauga clasele ce vor fi folosite de software, iar in package-ul **TestingModule** vom adauga partea de testare. | ||
- | {{ :icalc:laboratoare:07:project3.png?400 |}} | ||
- | </note> | ||
- | |||
- | * Pentru a scrie prima functie de testare vom merge in package-ul **TestingModule** si vom face un nou fisier de tipul **Java Class** | ||
- | |||
- | {{ :icalc:laboratoare:07:project4.png?400 |}} | ||
- | |||
- | |||
- | * In cadrul acestui fisier facem o clasa in interiorul careia ne vom scrie testele. Crearea unui test se realizeaza prin anotarea unei metode cu **@Test**. | ||
- | <note> | ||
- | In cazul in care IntelliJ nu importa automat modulele necesare putem sa le adaugam manual asa cum este prezentat in poza. Desigur, putem adauga **JUnit in IntelliJ** asa cum am invatat si in laboratorul trecut. | ||
- | {{ :icalc:laboratoare:07:project5.png?300 |}} | ||
- | </note> | ||
- | |||
- | === Specificatiile proiectului === | ||
- | In cadrul laboratorului de astazi vom face un program denumit sugestiv **SplitBill**. Acesta va lua anumite sume de bani, persoane, procentul de tips si va returna o suma de bani ce trebuie data de fiecare persoana pentru achitarea notei. | ||
- | |||
- | == Etapa 1: writing a failing test == | ||
- | |||
- | * Prima cerinta a proiectului este scrierea unui test **getTotalAmountWithZeroTips()**. In cadrul acestei functii vom lua o intanta a calculatorului si vom returna retultatul unei metode **getTotalAmount(double amount, double tips)**. Aceasta va adauga procentul de tips la suma si va returna suma totala ce trebuie platita, suma ce contine si tips-ul. | ||
- | |||
- | <note> | ||
- | IntelliJ ne ajuta si ne face highlight pe ce nu exista. Astfel ne putem folosi de editor pentru a face clasa Calculator si a adauga in ea lucrurile necesare. | ||
- | |||
- | {{ :icalc:laboratoare:07:cerinte1.png?300|}} | ||
- | {{:icalc:laboratoare:07:cerinte2.png?300|}} | ||
- | </note> | ||
- | |||
- | Primul din cei 3 pasi TDD a fost realizat: testul a fost scris. Dupa ce rulam acest test vom vedea faptul ca testul nu va trece intrucat noi nu avem implementata aceasta metoda in cadrul clasei. | ||
- | Urmatorul pas este scrierea celor mai simple linii pentru a face testul sa treaca. | ||
- | |||
- | {{ :icalc:laboratoare:07:cerinte3.png?800 |}} | ||
- | |||
- | == Etapa 2: make the test pass == | ||
- | |||
- | Avand in vedere ca testul nostru este conceput pentru cazul in care tips-ul este 0 ceea ce avem de facut este sa returnam suma initiala: | ||
- | <code java> | ||
- | public class Calculator { | ||
- | public double calculate(double amount, double tips) { | ||
- | return amount; | ||
- | } | ||
- | } | ||
- | </code> | ||
- | |||
- | Daca rulam testul inca odata vom vedea ca acesta va trece: | ||
- | {{ :icalc:laboratoare:07:cerinte4.png?800 |}} | ||
- | |||
- | == Etapa 3: refactoring == | ||
- | Pentru testul curent, dat fiind faptul ca este foarte simplu vom omite etapa refactoring considerand ca nu avem ce modifica. | ||
- | |||
- | </hidden> | ||