Testování  27. října 2020

Materiály

Nejste účastníkem kurzu
Pro zápis do kurzu se nejprve přihlašte a následně použijte tlačítko v přehledu kurzu.

Domácí projekty

Následující úkoly na sebe navazují. Nejlepší je proto je dělat jeden po druhém.

0.

Během tohoto bloku úkolů budeme vylepšovat konzolovou kalkulačku, kterou jsme implementovali již v úkolu číslo 6 v domácích projektech na cykly. Program měl za úkol načíst od uživatele dvě čísla a jednoznakový řetězec – buď '+', '-', '*' nebo '/'. A pak provést příslušnou operaci. Pojďme si ji připravit pro lepší rozdělení do modulů a psaní testů.

Napiš tedy znovu program, který postupně načte od uživatele dvě čísla a jednoznakový řetězec – buď '+', '-', '*' nebo '/'. Program provede na číslech příslušnou operaci. Program bude napsán v jendom modulu kalkulacka.py ve kterém budeme mít funkce pro výpočetní operace sčítání, odčítání, násobení a dělení. Můžeš vyjít z rámcového kódu, který jsme ukazovali na cvičení.

1.

Vytvoř modul operace.py do kterého přesuň funkce na výpočty. Z tohoto modulu je pak naimportuj v modulu kalkulacka.py aby se v něm daly používat.

2.

Vytvoř testovací modul test_operace.py. Napiš do něj testy pro otestování, zda funkce z modulu ``operace.py počítají opravdu správně. Nezapomeň otestovat i nestandardní argumenty a ověřit, zda dělení nulou opravdu vyhodí chybu.

3.

V modulu operace.py vytvoř funkci proved_vypocet, která bere tři argumenty. První číslo, druhé číslo a znak, který nám definuje operaci. Funkce s čísly provede příslušnou operaci a vrátí výsledek. Pro matematické operace se samozřejmě použijí již hotové funkce.

4.

Do testovacího modulu doplň test, který otestuje správné chování funkce proved_vypocet z modulu kalkulacka.

V následujících příkladech vylepšíme uživatelské chování programu pomocí vyjímek. Většina programů, se kterými běžně pracuješ je takto upravena, koncový uživatel se setká s vyjímkou jen vyjímečně :-). Po každé větší úpravě nezapomeň spustit testy.

5.

Pomocí try, except případně finally a else ošetři program pro následující případ.

Uživatel je vyzván, aby zadal číslo, ale zadá něco, co nelze na číslo převést.

Program zachytí příslušnou výjimku, vypíše informaci o špatně zadaném vstupu a ukončí se, aniž by prováděl nějaké výpočty.

6.

Pomocí try, except případně finally a else ošetři program pro následující případ.

Uživatel chce dělit nulou.

Program zachytí příslušnou výjimku, vypíše informaci o špatně zadaném vstupu a ukončí se, aniž by prováděl nějaké výpočty. Nezapomeň, že funkce pro dělení musí pořád vyvolávat vyjímku, aby prošla testy.

7.

Pomocí try, except případně finally a else ošetři program pro následující případ.

Uživatel zadá neplatný operand.

Program zachytí příslušnou výjimku, vypíše informaci o špatně zadaném vstupu a ukončí se, aniž by prováděl nějaké výpočty.

Následující úkoly slouží pouze pro lepší seznámení se s modulem logging. Pro připomenutí, rychlé nastavení logovacího modulu vypadá takto:

logging.basicConfig(filename='muj_log.log',level=logging.DEBUG)

Modul logging musí být samozřejmě naimportován.

8.

Dokážeš popsat, co nám v nastavení logování dělá parametr level?

9.

V modulu kalkulacka.py nastav logování. Ty části kódu, ve kterých zachycuješ výjimky (to jsou ty hned za except:) doplň o logovací zprávu s důležitostí error.

10.

Doplň další vhodná místa v kódu o informační a debugovací zprávy. Rozhodnutí, co to jsou vhodná místa, je zcela na tobě. Pokud cheš o logy doplnit i další moduly, konfigurovat logging modul v nich už nemusíš.

Následující projekty jsou součástí projektu 1D Piškvorky. Pokud na ně máš ještě chuť, doporučuji je dělat jeden po druhém.

11.

Rozděl 1D Piškvorky na čtyři moduly:

  • ai.py, kde bude funkce tah_pocitace,
  • piskvorky.py, kde budou ostatní funkce,
  • hra.py, kde bude import a volání hlavní funkce z piskvorky.py (a nic jiného),
  • test_piskvorky.py, kde budou testy.

Jak se do importů nezamotat? Podívej se do materiálů na sekci cyklické importy.

12.

Napiš aspoň dva testy na každou funkci z Piškvorek, ke které testy napsat umíš. Testy pravděpodobně neumíš napsat na funkci input a všechny funkce, které ji (byť nepřímo) volají. A taky asi neumíš otestovat účinek funkce print.

13.

Zkus program přepsat tak, aby část, která není pokrytá automatickými testy, byla co nejmenší. Místo volání print můžeš často vrátit řetězec a print zavolat až na návratovou hodnotu. Podobně input můžeš zavolat před zavoláním funkce, která pak může příkaz od uživatele brát jako argument.

14.

Doplň funkci tah_pocitace tak, aby brala jako argument symbol, za který má počítač hrát – buď 'x', nebo 'o'. Dopiš testy.

15.

Ověř, že se funkce tah_pocitace se umí vyrovnat s jinou délkou hracího pole než 20. „Ověření” znamená napsání příslušného testu.

16.

Ověř si, že se tah_pocitace chová rozumně když dostane plné hrací pole, nebo pole s délkou 0. Rozumné chování v tomto případě znamená vyvolání rozumné výjimky.

Podle toho, jak jste se na sraze domluvili, pošli soubor ai.py (s funkcí tah_pocitace) e-mailem (např. organizátorům, koučovi, nebo vůbec). Posílej ho jako přílohu, nekopíruj ho do textu e-mailu. Jestli procházíš kurz sama a můžeš programování konzultovat s někým zkušenějším, je tento úkol na takovou konzultaci ideální téma.

Dozvíš se, jak si tvá strategie stojí proti ostatním – a proti testům, které napíše organizátor. :) Strategii je možné i vylepšovat a poslat několik různých verzí. Neboj se poslat i první nástřel! Stejně tak se neboj funkci poslat, i kdyby ještě nebyla úplně dodělaná.

Na některém dalším srazu bude turnaj o ceny!

Máš-li Piškvorky hotové, můžeš si naprogramovat ještě jednu hru! Jestli na to tedy máš čas a chuť.

17.

Vytvoř hru sibenice podle následujícího popisu. Snaž se projekt rozdělit do funkcí a modulů s hezkými jmény, piš testy a dokumentační řetězce, funkční kousky dávej postupně do Gitu.

  • Počítač náhodně zvolí slovo (zatím třeba ze tří možností). Pro jednoduchost používej malá písmena a nepoužívej slova, ve kterých se stejné písmeno opakuje dvakrát (třeba čokoláda).
  • Nastav výchozí stav: řetězec s tolika podtržítky, kolik je ve vybraném slově písmen.
  • Nastav počet neúspěšných pokusů na nulu.
  • Každý tah:
    • Zeptej se hráče na písmeno.
    • Pokud je to písmeno ve vybraném slově, zaměň příslušná podtržítka za ono písmeno. Bude se hodit řetězcová metoda index_ a funkce zamen z piškvorek.
    • Pokud dané písmeno není ve vybraném slově, započítej neúspěšný pokus.
    • Vypiš stav (slovo s případnými podtržítky).
    • Pokud už ve slově nejsou podtržítka, pogratuluj hráči a ukonči hru.
    • Podle počtu neúspěšných pokusů vypiš „obrázek”. Obrázky jsou ke stažení na http://pyladies.cz/v1/s005-modules/obrazky.txt a můžeš je dát do víceřádkových řetězců (s trojitými uvozovkami).
    • Pokud jsi právě vypsala poslední obrázek, hráč prohrál. Dej mu to najevo a ukonči program.
+---.
|   |
|   O
| --|--
|  /
|
~~~~~~~

p_t__n
18.

Funguje-li ti předchozí hra, můžeš ji vylepšit.

  • Zařiď, aby fungovala slova s více stejnými písmeny.
  • Když hráč nezadá písmeno (zadá např. ABC nebo !), nepovažuj to za tah.
  • Po skončení dej hráči možnost hru opakovat.