Warning
This page is located in archive.

IDLE

Přestože je IDLE poměrně jednoduché IDE, díky tomu, že je distribuován přímo z Pythonem, je docela často používaný. Na této stránkce najdete popis některých jeho vlastností.

Spouštění unittestů v IDLE

Spustíte-li automatický test vytvořený pomocí modulu unittest v IDLE, dostanete následující výstup, ačkoli všechny testy proběhly správně:

..
---------------------------------------------------------------------
Ran 2 tests in 0.015s
 
OK
Traceback (most recent call last):
  File "M:/WINXPP/Plocha/test1_readclassification/test_readClassificationFromFile.py",
    line 79, in <module>
      unittest.main()
    File "C:/Python32/lib/unittest/main.py", line 124, in __init__
      self.runTests()
    File "C:/Python32/lib/unittest/main.py", line 272, in runTests
     sys.exit(not self.result.wasSuccessful())
 SystemExit: False

Dojde k výpisu výjimky SystemExit, což trochu kazí fakt, že váš kód prošel všemi testy. Problém je v tom, že když unittest.main() dokončí všechny testy, zavolá sys.exit(exitcode), čímž chce signalizovat případnému (třeba) shellovskému skriptu, zda testy proběhly OK nebo ne. Volání sys.exit() vyhazuje výjimku SystemExit, která ukončí aktuálně běžící pythonovský process, viz http://docs.python.org/py3k/library/sys.html?highlight=sys.exit#sys.exit.

Protože IDLE samotný běží v hlavním vlákně a skripty spouští pravděpodobně ve stejném vlákně, voláním sys.exit() uvnitř skriptu by se za normálních okolností ukončil i IDLE. Proto IDLE výjimku SystemExit odchytává, ale aby zcela nezanikla, prostě ji vypíše. Je to standardní chování IDLE, viz popis třebe zde:

Pokud vám výpis této výjimky vadí, lze to řešit několika způsoby: (i) nepoužívejte IDLE ke spouštění unit testů :-), (ii) odchyťte si výjimku SystemExit sami, nebo (iii) využijte argument exit funkce unittest.main().

Poslední řešení je pro naše účely asi nejvodnější. Od verze 2.7 Pythonu můžete funkci unittest.main() volat s parametrem exit=False, který potlačí volání sys.exit(), tedy takto:

if __name__=='__main__':
   unittest.main(exit=False)
Pak by měl výpis testů proběhnout očekávaným způsobem.

courses/a4b99rph/tutorialy/python/idle.txt · Last modified: 2013/10/04 13:02 (external edit)