Testování - test_tah_chyba sa zacykľuje

70 views
Skip to first unread message

Helena Zubčeková

unread,
May 1, 2020, 9:58:24 AM5/1/20
to django-cs
Ahoj,

Som v kapitole https://naucse.python.cz/course/pyladies/beginners/testing/, a nerozumiem, prečo mi test_tah_chyba nefunguje...
V príkazovom riadku sa mi program zasekne na modro podčiarknutej časti, a musím to ukončiť ctrl+C...


Chýba mi niečo v piskvorky.py? Nakoniec som tam doplnila túto časť (aj keď v materiáloch to vyslovene povedané nie je, ale naznačené to asi je):
Ale nepomohlo to. Nedáva mi to aj tak moc zmysel, pretože vtedy, keď je na rade počítač, nemôže mať plné pole... pretože najprv hrá hráč, potom počítač, obaja doplňujú po jednom písmene, a pole má párny počet polí...

Moc díky za radu :) snažím sa to pochopiť, a z materiálov mi nie je jasné, čo je zle a prečo sa mi to cyklí/zasekáva.

Heli

piskvorky.py
test_piskvorky.py
hra.py

Petr Viktorin

unread,
May 5, 2020, 6:58:52 AM5/5/20
to Helena Zubčeková, djan...@googlegroups.com
On 2020-05-01 15:58, Helena Zubčeková wrote:
> Ahoj,
>
> Som v kapitole
> https://naucse.python.cz/course/pyladies/beginners/testing/, a
> nerozumiem, prečo mi test_tah_chyba nefunguje...
> V príkazovom riadku sa mi program zasekne na modro podčiarknutej časti,
> a musím to ukončiť ctrl+C...
>
>
> Chýba mi niečo v piskvorky.py? Nakoniec som tam doplnila túto časť (aj
> keď v materiáloch to vyslovene povedané nie je, ale naznačené to asi je):
> Ale nepomohlo to. Nedáva mi to aj tak moc zmysel, pretože vtedy, keď je
> na rade počítač, nemôže mať plné pole... pretože najprv hrá hráč, potom
> počítač, obaja doplňujú po jednom písmene, a pole má párny počet polí...
>
> Moc díky za radu :) snažím sa to pochopiť, a z materiálov mi nie je
> jasné, čo je zle a prečo sa mi to cyklí/zasekáva.
>
> Heli

Ahoj!
Zkus tu funkci zavolat, tak jak ji volá test:

piskvorky.tah_pocitace('oxoxoxoxoxoxoxoxoxox')

V téhle situaci funkce tah_pocitace nemůže nic rozumného vrátit. Správná
reakce na tuhle situaci je tedy vyvolání výjimky, třeba ValueError.
Místo toho to vypadá, že se tvoje funkce zacyklí: vybírá pořád dokola
náhodné pozice, a nikdy nevybere volnou pozici na kterou jde hrát.
Je tedy potřeba změnit funkci tah_pocitace: když v hracím poli není
volné místo, vyhoď výjimku.

Je pravda, že když správně napíšeš program který tuhle funkci volá, tak
k téhle situaci nedojde. Ale co když ho napíšeš špatně? Co když budeš
pracovat v týmu, a jeden z tvých kolegů bude chtít tah_pocitace použít v
jiném programu?
`test_tah_chyba` testuje funkci jako takovou, ne jen způsob jak ji
Piškvorky volají.

Helena Zubčeková

unread,
May 8, 2020, 12:40:12 PM5/8/20
to django-cs
Ahoj,

Myslím, že som pohopila, čo myslíš, ale stále neviem, ako opraviť svoj kód...
Mala by som teda v ai.py, kde mám funkciu tah_pocitace, pridať nejaké ošetrenie situácie, keď v "pole" nemám žiadnu "-", čo znamená, že už tam nie sú voľné miesta. Napísala som toto:
Ale keď skúšam zavolať test_piskvorky.py, tak sa mi to stále zacyklí, rovnako, ako predtým... Myslím, že nerozumiem, ako spolu komunikujú súbory text_piskvorky.py a ai.py, aký je medzi nimi vzťah. Ak test_piskorky raisuje chybu za určitých okolností, tak ai.py má mať try:except blok? Alebo vôbec nie?
Zatiaľ tomu rozumiem tak, že test_piskvorky skúša funkciu s použitím nesprávneho vstupu, a raisuje chybu, ak tam je, a potom ten core súbor (v tomto prípade ai.py) potrebuje mať takúto chybu nejako ošetrenú? takže try-except? Až na to, že toto to nefunguje, možno to bude tým, že ak "-" in pole == True nie je pravdivé, tak tá chyba nie je ValueError...

Som hodne zmätená. Díky za radu,
Heli


Dne úterý 5. května 2020 12:58:52 UTC+2 Petr Viktorin napsal(a):
ai.py
hra.py
piskvorky.py
test_piskvorky.py
util.py

Petr Viktorin

unread,
May 8, 2020, 1:03:35 PM5/8/20
to Helena Zubčeková, djan...@googlegroups.com
`On 2020-05-08 18:40, Helena Zubčeková wrote:
> Ahoj,
>
> Myslím, že som pohopila, čo myslíš, ale stále neviem, ako opraviť svoj
> kód...
> Mala by som teda v ai.py, kde mám funkciu tah_pocitace, pridať nejaké
> ošetrenie situácie, keď v "pole" nemám žiadnu "-", čo znamená, že už tam
> nie sú voľné miesta. Napísala som toto:

> try:
> "-" in pole == True
> except Value:
> print("Pole je plné")
> (zbytek programu)



Řekněme že jsem Python a jdu udělat co mi tenhle program přikazuje.
Řekněme že pole je 'oxoxoxoxoxoxoxoxoxox', tedy neobsahuje pomlčku.

`try:` -- hmm, tady asi nastane nějaká výjimka, budu na to připravený!

`"-" in pole == True` -- to je složitý výraz, vyhodnotím ho postupně.
žádá pomlčka v `pole` není, takže `"-" in pole` neplatí; můžu za to
dosadit False. Z `"-" in pole == True` se stane `False == True`. To
neplatí, takže hodnota celého výrazu je False.
S výrazem `"-" in pole == True` nemám nic dělat, tak na výsledek `False`
zapomenu.

`except Value:` -- žádná výjimka nenastala, tak celý `except` blok
přeskočím.

A teď Python dostane ke zbytku programu, který se, jak víme z
dřívějška, zacyklí.



Když tenhle kousek programu přeložím z Pythonu do češtiny, dostanu:

zkus:
spočítat jestli "pole obsahuje pomlčku" je rovno "pravdě"
a když se to nepovede:
napiš "pole je plné!"

Tady je možná líp vidět, proč to nedělá co má. Tenhle program reaguje na
případné výjimky (try/except), ale žádné výjimky nezpůsobuje! Přitom
právě vyvolání výjimky je správná reakce na nekorektní vstup jako
pole='oxoxoxoxoxoxoxoxoxox'.


> Ale keď skúšam zavolať test_piskvorky.py, tak sa mi to stále zacyklí,
> rovnako, ako predtým... Myslím, že nerozumiem, ako spolu komunikujú
> súbory text_piskvorky.py a ai.py, aký je medzi nimi vzťah. Ak
> test_piskorky raisuje chybu za určitých okolností, tak ai.py má mať
> try:except blok? Alebo vôbec nie?
> Zatiaľ tomu rozumiem tak, že test_piskvorky skúša funkciu s použitím
> nesprávneho vstupu, a raisuje chybu, ak tam je, a potom ten core súbor
> (v tomto prípade ai.py) potrebuje mať takúto chybu nejako ošetrenú?
> takže try-except? Až na to, že toto to nefunguje, možno to bude tým, že
> ak "-" in pole == True nie je pravdivé, tak tá chyba nie je ValueError...
>
> Som hodne zmätená. Díky za radu,
> Heli
>
>
> Dne úterý 5. května 2020 12:58:52 UTC+2 Petr Viktorin napsal(a):
>
> On 2020-05-01 15:58, Helena Zubčeková wrote:
> > Ahoj,
> >
> > Som v kapitole
> > https://naucse.python.cz/course/pyladies/beginners/testing/
> <https://naucse.python.cz/course/pyladies/beginners/testing/>, a
> --
> --
> E-mailová skupina djan...@googlegroups.com
> Správa: http://groups.google.cz/group/django-cs
> ---
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
> „django-cs“ ve Skupinách Google.
> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny,
> zašlete e-mail na adresu django-cs+...@googlegroups.com
> <mailto:django-cs+...@googlegroups.com>.
> Chcete-li tuto diskusi zobrazit na webu, navštivte
> https://groups.google.com/d/msgid/django-cs/66df6009-4404-4159-ac90-1cc76bce5519%40googlegroups.com
> <https://groups.google.com/d/msgid/django-cs/66df6009-4404-4159-ac90-1cc76bce5519%40googlegroups.com?utm_medium=email&utm_source=footer>.

Helena Zubčeková

unread,
May 8, 2020, 1:21:01 PM5/8/20
to django-cs
To dáva zmysel... skúsila som teda to upraviť:
čiže:
Ak pole neobsahuje "-", tak vyvolaj Value Error.
Ale cyklí sa mi to veselo naďalej...

Moc díky :)
Heli




Dne pátek 8. května 2020 19:03:35 UTC+2 Petr Viktorin napsal(a):
> zašlete e-mail na adresu djan...@googlegroups.com
> <mailto:djan...@googlegroups.com>.

Krystof Pilnacek

unread,
May 8, 2020, 4:03:19 PM5/8/20
to djan...@googlegroups.com
Ahoj,

z nejakeho duvodu ta podminka ("-" in pole == False) nevypada, ze by fungovala jak popisuje Petr. Jejim vysledkem je totiz False a proto se ten program cykli. True (coz je hodnota, kterou je potreba dostat) se mi povedla dostat, pokud jsem dal zavorku kolem "-" in pole, tedy if ("-" in pole) == False:. Pak to zacne fungovat.

Jen mi to neprijde jako spravne Python reseni. Jednak se v Pythonu pro porovnavani jestli je neco True/False nepouziva == ale is (stejne jako pro None). A pak jeste v ifech neni potreba to porovnani s False, ale pred dany vyraz staci dat not. A aby to bylo uplne nej, tak not se v tomto pripade dava pred in (to aby to bylo co nejpodobnejsi anglictine). Takze radek if "-" in pole == False:by mel vypadat: if "-" not in pole:.

Doufam, ze to pomuze.
Hezky vecer
Krystof

Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/c05edfb0-ea9b-4eef-9d2a-38dfa1faaf18%40googlegroups.com.

Helena Zubčeková

unread,
May 9, 2020, 3:01:33 AM5/9/20
to django-cs
Díky vám obom, tá zátvorka naozaj všetko vyriešila :D
Zároveň som to ale opravila viac popythonovsky a mám tam to "not in". Už to funguje!
Takže... v test_piskvorky mám funkciu, ktorá overuje, že ten nevalidný vstup naozaj vyvolá ValueError:
A v ai.py, kde tá pôvodná funkcia je, si potrebujem tú exception raisnúť a povedať mu, za akých okolností sa to má stať:

Ešte ma napadá, ako by som skombinovala test_blabla s tým, keď mám v tom core.py nejakú chybu ošetrené cez try: except: ....
napr.:
Je možné toto ošetrenie tiež nejako overiť v tom mojom test_blabla file?
Ak aj áno, tak mi uniká, čo tým dosiahnem... možno akurát overím, že tá funkcia je ošetrená? Povedala by som, že v tomto prípade test_blabla file je zbytočný a nemá čo overiť... mám pravdu?

Ďakujem :)
Heli



Dne pátek 8. května 2020 22:03:19 UTC+2 Krystof Pilnacek napsal(a):
Ahoj,

z nejakeho duvodu ta podminka ("-" in pole == False) nevypada, ze by fungovala jak popisuje Petr. Jejim vysledkem je totiz False a proto se ten program cykli. True (coz je hodnota, kterou je potreba dostat) se mi povedla dostat, pokud jsem dal zavorku kolem "-" in pole, tedy if ("-" in pole) == False:. Pak to zacne fungovat.

Jen mi to neprijde jako spravne Python reseni. Jednak se v Pythonu pro porovnavani jestli je neco True/False nepouziva == ale is (stejne jako pro None). A pak jeste v ifech neni potreba to porovnani s False, ale pred dany vyraz staci dat not. A aby to bylo uplne nej, tak not se v tomto pripade dava pred in (to aby to bylo co nejpodobnejsi anglictine). Takze radek if "-" in pole == False:by mel vypadat: if "-" not in pole:.

Doufam, ze to pomuze.
Hezky vecer
Krystof

Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu djan...@googlegroups.com.

Helena Zubčeková

unread,
May 9, 2020, 3:03:49 AM5/9/20
to django-cs
Nejako to vzalo bez obrázkov, skúšam ešte raz:

Dne sobota 9. května 2020 9:01:33 UTC+2 Helena Zubčeková napsal(a):
Díky vám obom, tá zátvorka naozaj všetko vyriešila :D
Zároveň som to ale opravila viac popythonovsky a mám tam to "not in". Už to funguje!
Takže... v test_piskvorky mám funkciu, ktorá overuje, že ten nevalidný vstup naozaj vyvolá ValueError:
A v ai.py, kde tá pôvodná funkcia je, si potrebujem tú exception raisnúť a povedať mu, za akých okolností sa to má stať:

Ešte ma napadá, ako by som skombinovala test_blabla s tým, keď mám v tom core.py nejakú chybu ošetrené cez try: except: ....
napr.:

Petr Viktorin

unread,
May 11, 2020, 5:37:46 AM5/11/20
to Helena Zubčeková, djan...@googlegroups.com
Ahoj,
Můžeš prosím posílat radši kód (textové soubory) než obrázky? Program z
obrázků se nedá spustit, a tak se z nich nedá dobře zjistit co je špatně.
A taky nevím který z tvých souborů je "test_blabla".

Každopádně funkce které používají `input` se testují špatně. Jde to, ale
je na to potřeba použít trochu pokročilejší možnosti pytestu. Stejně tak
se blbě testuje co program vypíše pomocí "print".
Doporučuju se do toho pustit až po začátečnickém kurzu, ale se na to
chceš vrhnout hned, tady je pár odkazů:

https://naucse.python.cz/course/mi-pyt/intro/testing/
https://projekty.pyladies.cz/static/tasks/handout_files/2019-autumn/test_piskvorky.py
https://docs.pytest.org/en/latest/fixture.html

On 2020-05-09 09:03, Helena Zubčeková wrote:
> Nejako to vzalo bez obrázkov, skúšam ešte raz:
>
> Dne sobota 9. května 2020 9:01:33 UTC+2 Helena Zubčeková napsal(a):
>
> Díky vám obom, tá zátvorka naozaj všetko vyriešila :D
> Zároveň som to ale opravila viac popythonovsky a mám tam to "not
> in". Už to funguje!
> Takže... v test_piskvorky mám funkciu, ktorá overuje, že ten
> nevalidný vstup naozaj vyvolá ValueError:
> A v ai.py, kde tá pôvodná funkcia je, si potrebujem tú exception
> raisnúť a povedať mu, za akých okolností sa to má stať:
>
> Ešte ma napadá, ako by som skombinovala test_blabla s tým, keď mám v
> tom core.py nejakú chybu ošetrené cez try: except: ....
> napr.:
> čiže:
> Ak pole neobsahuje "-", tak vyvolaj Value Error.
> Ale cyklí sa mi to veselo naďalej...
>
> <https://groups.google.com/d/msgid/django-cs/66df6009-4404-4159-ac90-1cc76bce5519%40googlegroups.com?utm_medium=email&utm_source=footer
> <https://groups.google.com/d/msgid/django-cs/66df6009-4404-4159-ac90-1cc76bce5519%40googlegroups.com?utm_medium=email&utm_source=footer>>.
>
>
> --
> --
> E-mailová skupina djan...@googlegroups.com
> Správa: http://groups.google.cz/group/django-cs
> <http://groups.google.cz/group/django-cs>
> ---
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru
> skupiny „django-cs“ ve Skupinách Google.
> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze
> skupiny, zašlete e-mail na adresu djan...@googlegroups.com.
> Chcete-li tuto diskusi zobrazit na webu, navštivte
> https://groups.google.com/d/msgid/django-cs/c05edfb0-ea9b-4eef-9d2a-38dfa1faaf18%40googlegroups.com
> <https://groups.google.com/d/msgid/django-cs/c05edfb0-ea9b-4eef-9d2a-38dfa1faaf18%40googlegroups.com?utm_medium=email&utm_source=footer>.
>
> --
> --
> E-mailová skupina djan...@googlegroups.com
> Správa: http://groups.google.cz/group/django-cs
> ---
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
> „django-cs“ ve Skupinách Google.
> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny,
> zašlete e-mail na adresu django-cs+...@googlegroups.com
> <mailto:django-cs+...@googlegroups.com>.
> Chcete-li tuto diskusi zobrazit na webu, navštivte
> https://groups.google.com/d/msgid/django-cs/69b9ca2f-4f02-487f-8b1d-ad3dfed76bfe%40googlegroups.com
> <https://groups.google.com/d/msgid/django-cs/69b9ca2f-4f02-487f-8b1d-ad3dfed76bfe%40googlegroups.com?utm_medium=email&utm_source=footer>.
Reply all
Reply to author
Forward
0 new messages