Ako TDD implementácia zoznamu v jazyku Java

1. Prehľad

V tomto tutoriáli si prejdeme zvyk Zoznam implementácia pomocou procesu Test-Driven Development (TDD).

Toto nie je úvod do TDD, takže predpokladáme, že už máte nejakú základnú predstavu o tom, čo to znamená, a trvalý záujem o zlepšenie.

Jednoducho povedané, TDD je návrhový nástroj, ktorý nám umožňuje riadiť našu implementáciu pomocou testov.

Krátke zrieknutie sa zodpovednosti - tu sa nezameriavame na vytváranie efektívnej implementácie - iba ju používame ako zámienku na zobrazenie postupov TDD.

2. Začíname

Najskôr definujeme kostru pre našu triedu:

verejná trieda CustomList implementuje zoznam {private Object [] internal = {}; // prázdne spôsoby implementácie} 

The CustomList trieda implementuje Zoznam rozhranie, preto musí obsahovať implementácie pre všetky metódy deklarované v tomto rozhraní.

Na začiatok môžeme pre tieto metódy poskytnúť iba prázdne telá. Ak má metóda návratový typ, môžeme vrátiť ľubovoľnú hodnotu tohto typu, ako napr nulový pre Objekt alebo nepravdivé pre boolovský.

Kvôli stručnosti vynecháme voliteľné metódy spolu s povinnými metódami, ktoré sa často nepoužívajú.

3. Cykly TDD

Vývoj našej implementácie s TDD znamená, že musíme najskôr vytvorte testovacie prípady, čím definujeme požiadavky na našu implementáciu. Iba potom vytvoríme alebo opravíme implementačný kód aby tieto testy prešli.

Veľmi zjednodušeným spôsobom sú v každom cykle tri hlavné kroky:

  1. Písomné testy - definovať požiadavky formou skúšok
  2. Implementačné funkcie - urobte testy úspešnými bez toho, aby ste sa príliš sústredili na eleganciu kódu
  3. Refaktoring - vylepšiť kód, aby bolo jednoduchšie čítať a udržiavať ho a zároveň prejsť testami

Pôjdeme cez tieto TDD cykly pre niektoré metódy Zoznam od tých najjednoduchších.

4. The je prázdny Metóda

The je prázdny metóda je pravdepodobne najpriamočiarejšou metódou definovanou v Zoznam rozhranie. Tu je naša začiatočná implementácia:

@Override public boolean isEmpty () {return false; }

Táto počiatočná definícia metódy stačí na zostavenie. Telo tejto metódy bude „nútené“ sa zdokonaľovať, keď budú pribúdať ďalšie a ďalšie testy.

4.1. Prvý cyklus

Poďme napísať prvý testovací prípad, ktorý zabezpečí, že je prázdny metóda sa vracia pravda keď zoznam neobsahuje žiadny prvok:

@Test public void givenEmptyList_whenIsEmpty_thenTrueIsReturned () {List list = new CustomList (); assertTrue (list.isEmpty ()); }

Daný test zlyhal od je prázdny metóda sa vždy vráti nepravdivé. Môžeme to urobiť tak, že obrátime návratovú hodnotu:

@Override public boolean isEmpty () {return true; }

4.2. Druhý cyklus

Na potvrdenie, že je prázdny metóda sa vracia nepravdivé ak zoznam nie je prázdny, musíme pridať aspoň jeden prvok:

@Test public void givenNonEmptyList_whenIsEmpty_thenFalseIsReturned () {List list = new CustomList (); list.add (null); assertFalse (list.isEmpty ()); }

Implementácia pridať metóda je teraz požadovaná. Tu je pridať metóda začíname s:

@Override public boolean add (prvok E) {return false; }

Implementácia tejto metódy nefunguje, pretože sa nevykonávajú žiadne zmeny vo vnútornej dátovej štruktúre zoznamu. Aktualizujme ho, aby sa uložil pridaný prvok:

@Override public boolean add (E element) {internal = new Object [] {element}; návrat nepravdivý; }

Náš test stále zlyháva od je prázdny metóda nebola vylepšená. Poďme to urobiť:

@Override public boolean isEmpty () {if (internal.length! = 0) {return false; } else {return true; }}

V tomto bode prejde neprázdny test.

4.3. Refaktoring

Oba testovacie prípady, ktoré sme doteraz videli, prešli, ale kód je prázdny metóda by mohla byť elegantnejšia.

Poďme to refaktorovať:

@ Override public boolean isEmpty () {return internal.length == 0; }

Vidíme, že testy prešli, takže implementácia je prázdny metóda je dokončená.

5. veľkosť Metóda

Toto je naša začiatočná implementácia veľkosť metóda umožňujúca CustomList trieda na zostavenie:

@Override public int size () {návrat 0; }

5.1. Prvý cyklus

Pomocou existujúceho pridať metódou, môžeme vytvoriť prvý test pre veľkosť metóda overujúca veľkosť zoznamu s jedným prvkom 1:

@Test public void givenListWithAnElement_whenSize_thenOneIsReturned () {List list = new CustomList (); list.add (null); assertEquals (1, list.size ()); }

Skúška zlyhala ako veľkosť metóda sa vracia 0. Urobme to s novou implementáciou:

@Override public int size () {if (isEmpty ()) {return 0; } else {return internal.length; }}

5.2. Refaktoring

Môžeme refaktorovať veľkosť spôsob, ako to urobiť elegantnejším:

@ Override public int size () {return internal.length; }

Implementácia tejto metódy je teraz dokončená.

6. dostať Metóda

Toto je počiatočná implementácia dostať:

@Override public E get (int index) {return null; }

6.1. Prvý cyklus

Pozrime sa na prvý test tejto metódy, ktorý overuje hodnotu jediného prvku v zozname:

@Test public void givenListWithAnElement_whenGet_thenThatElementIsReturned () {List list = new CustomList (); list.add ("baeldung"); Element objektu = list.get (0); assertEquals ("baeldung", prvok); }

Test bude úspešný s touto implementáciou dostať metóda:

@ Override public E get (int index) {return (E) internal [0]; }

6.2. Zlepšenie

Zvyčajne by sme pridali ďalšie testy predtým, ako vykonáme ďalšie vylepšenia dostať metóda. Tieto testy by potrebovali iné metódy Zoznam rozhranie na implementáciu správnych tvrdení.

Tieto ďalšie metódy však ešte nie sú dostatočne zrelé, takže porušujeme cyklus TDD a vytvárame úplnú implementáciu dostať metóda, ktorá v skutočnosti nie je veľmi náročná.

Je ľahké si to predstaviť dostať musí extrahovať prvok z interné pole na zadanom mieste pomocou index parameter:

@Override public E get (int index) {return (E) internal [index]; }

7. The pridať Metóda

To je pridať metóda, ktorú sme vytvorili v časti 4:

@Override public boolean add (E element) {internal = new Object [] {element}; návrat nepravdivý; }

7.1. Prvý cyklus

Nasleduje jednoduchý test, ktorý overuje návratovú hodnotu parametra pridať:

@Test public void givenEmptyList_whenElementIsAdded_thenGetReturnsThatElement () {List list = new CustomList (); boolean uspela = list.add (null); assertTrue (úspešné); }

Musíme upraviť pridať spôsob návratu pravda na úspešné absolvovanie testu:

@Override public boolean add (E element) {internal = new Object [] {element}; návrat pravdivý; }

Aj keď test vyhovuje, pridať metóda zatiaľ nepokrýva všetky prípady. Ak do zoznamu pridáme druhý prvok, existujúci prvok sa stratí.

7.2. Druhý cyklus

Tu je ďalší test, ktorý pridáva požiadavku, aby zoznam mohol obsahovať viac ako jeden prvok:

@Test public void givenListWithAnElement_whenAnotherIsAdded_thenGetReturnsBoth () {List list = new CustomList (); list.add ("baeldung"); list.add (". com"); Element objektu1 = list.get (0); Objekt element2 = list.get (1); assertEquals ("baeldung", element1); assertEquals (". com", element2); }

Test zlyhá, pretože pridať metóda v súčasnej podobe neumožňuje pridať viac ako jeden prvok.

Zmeňme implementačný kód:

@Override public boolean add (E element) {Object [] temp = Arrays.copyOf (internal, internal.length + 1); temp [internal.length] = prvok; interné = teplota; návrat pravdivý; }

Implementácia je dostatočne elegantná, a preto ju nemusíme refaktorovať.

8. Záver

Tento tutoriál prešiel testovacím vývojovým procesom a vytvoril tak časť zvyku Zoznam implementácia. Pomocou TDD dokážeme implementovať požiadavky krok za krokom, pričom udržujeme pokrytie testu na veľmi vysokej úrovni. Implementácia je zaručene testovateľná, pretože bola vytvorená s cieľom vyhovieť testom.

Upozorňujeme, že vlastná trieda vytvorená v tomto článku sa používa iba na demonštračné účely a nemala by sa prijať v projekte z reálneho sveta.

Celý zdrojový kód tohto tutoriálu vrátane testovacích a implementačných metód vynechaných kvôli stručnosti nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found