Úvod do programování - Cvičení č. 10


Autor: Miroslav Beneš
Organizace: Katedra informatiky FEI VŠB-TU Ostrava
Popis: Na ukázkovém příkladu si vyzkoušíte práci se soubory s přímým přístupem a naučíte se vytvářet sady testů pro systematické testování v prostředí JUnit.

Úkoly

  1. Třída RandomAccessFile. Prostudujte příklad Priklad1, ve kterém třída Predmet reprezentuje data o studijním předmětu (kód, zkratka, název předmětu a počet kreditů). Tato třída definuje metody read() a write() pro čtení a zápis jednoho záznamu o předmetu. Pro ukládání se použije třída java.io.RandomAccessFile, umožňující práci s binárními soubory a přímý přístup na libovolnou pozici v souboru.

    Pokud chceme umožnit přímý přístup ke konkrétnímu záznamu v souboru, je vhodné zajistit, aby všechny zapisované záznamy měly pevnou délku. Pro přístup k n-tému záznamu pak stačí pozici v souboru nastavit na příslušný násobek délky jednoho záznamu.

    Třída RandomAccessFile umožňuje přímý zápis binárních hodnot do souboru a jejich čtení. Řetězce se ovšem zapisují ve své skutečné délce, a proto je třeba zajistit jejich doplnění na definovanou šířku (případně zkrácení) např. mezerami zprava. Tyto mezery se pak odříznou při čtení metodou trim().

    Třída Predmet umožňuje také čtení a zápis záznamu se zadaným pořadovým číslem a zjištění počtu záznamů v souboru. Při těchto operacích se vychází ze znalosti délky jednoho záznamu v souboru (konstanta DELKA_ZAZNAMU). Metodou seek() je nejprve nastavena pozice v souboru na zadaný záznam a pak se teprve provede čtení nebo zázpis záznamu.

    Povšimněte si také obsahu funkce main() - tato funkce vytvoří instanci třídy, ve které se nachází (v tomto případě třídy Priklad1), a potom spustí její metodu run(), která plní funkci hlavního programu. Nemusíme pak všechny proměnné a metody označovat klíčovým slovem static. Navíc se tento postup hodí tehdy, pokud hlavní třída programu má být odvozená od některé již definované třídy, což je běžné například u aplikací s grafickým uživatelským rozhraním.

    Třídy: Predmet, Priklad1

  2. Testování pomocí prostředí JUnit. Prostudujte třídu TestPredmet reprezentující sadu testů třídy Predmet z předcházejícího příkladu.

    Tyto testy by měly být spustitelné přímo z prostředí JBuilder, případně voláním "ant junit". Pokud program Ant nenajde soubor junit.jar, je třeba nastavit proměnnou prostředí CLASSPATH tak, aby tento soubor obsahovala, případně umístit soubor junit.jar do adresáře lib programu Ant. Podívejte se také na obsah souboru build.xml, v němž je úloha junit definovaná - v případě nejasností nahlédněte do dokumentace k programu Ant.

    Třída TestPredmet provádí jednoduché testy jednotlivých get/set metod třídy Predmet a byla z velké části vygenerována přímo prostředím JBuilder 9. Třída TestPredmetIO testuje metody třídy Predmet pracující se soubory.

    Vyzkoušejte si také chování programu junit v situaci, kdy některý test neprojde. Změňte například očekávanou hodnotu v testu některé metody get.

    Třídy: Predmet, TestPredmet, TestPredmetIO

  3. Testování třídy Zlomek. Vytvořte pro třídu Zlomek, se kterou jste již pracovali na úvodních cvičeních, sadu testů ověřujících správnou funkci implementace zlomků. Tyto testy budou ověřovat následující vlastnosti:

    Doplňte další testy pro operaci násobení zlomků a pro porovnání zlomků (rozhraní Comparable a Comparator). V případě, že vaše implementace zlomků nebude některou testovanou podmínku splňovat, opravte ji. Zamyslete se nad tím, jak by se měla třída Zlomek chovat v případě, že je jmenovatel nulový. Doplňte testy, které budou očekávané chování ověřovat.