´·½¬¤Ë½¾¤¤ 'PyUnit' ¤È¸Æ¤Ã¤ì¤ë Python ñÂΥƥ¹¥ÈÃѥե졼¥à ¥ï¡¼¥¯ (Python unit testing framework) ¤Ã¡¤ ÃïÌÀ¤Ê¤¢¤Î Kent Beck ¤È Eric Gamma ¤Ë¤è¤ë JUnit ¤Î Python ¸À¸ìÈǤǤ¢¤ë¡£ ¤Ò¤ë¤¬¤¨¤Ã¤Æ JUnit ¤à Kent's Smalltalk testing framework ¤Î Java ÈǤǤ¢¤ë¡£ ¤É¤Ã¤é¤â¤½¤ì¤¾¤ì¤Î¸À¸ì¤ËÂ乤ëñÂΥƥ¹¥È¤Î»ö¼Â¾å¤Îɸ½à ¤Ç¤¢¤ë¡£
¤³¤Îʸ½ñ¤à PyUnit ¤ÎÀ߷פȻÈÃÑË¡¤Î Python ÆÃäÎÌ̤òÀâÌÀ¤¹¤ë¡£ ¥Õ¥ì¡¼¥à ¥ï¡¼¥¯¤Î´ðËÜÀ߷פˤĤ¤¤Æ¤ÎÇطʾðÊó¤Ë¤Ä¤¤¤Æ¤Ã¡¤ ÆɼԤà Kent ¤Î¸¶ÃÀʸ "Simple Smalltalk Testing: With Patterns" ¤ò»²¾È¤µ¤ì¤¿¤¤¡£
PyUnit ¤à Python ¥á¼¥¸¥ç¥ó 2.1. ¤Î Python ɸ½à ¥é¥¤¥Ö¥é¥ê¤Î°ìÉô¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£
°Ê²¼¤Î¾ðÊó¤à Python ¤ÎÃ챤ò²¾Äꤹ¤ë¡£ ¤³¤Î¸À¸ì¤ÃÈó¾ï¤Ë´Êñ¤Ê¤Î¤Ç»ä¤Ç¤µ¤¨¤Ê¤ó¤È¤«³Ø¤Ù¤¿¤·¡¤ Èó¾ï¤Ë½¬´·À¤¬¤¢¤ë¤Î¤Ç»ä¤Ã¤â¤¦»ß¤á¤ë¤³¤È¤¬¤Ç¤Â¤Ê¤¤¡£
PyUnit ¤Ã¥á¼¥¸¥ç¥ó 1.5.2 °Ê¹ß¤Î¤É¤Îɸ½à Python ¤Ç¤âÆ°ºî¤¹¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Æ¤¤¤ë¡£
PyUnit ¤ÃÃø¼Ô¤Ë¤è¤Ã¤Æ Linux (Redhat 6.0, 6.1 ¤È Debian Potato) ¾å¤Î Python 1.5.2, 2.0, 2.1 ¤Ç¥Æ¥¹¥È¤µ¤ì¤Æ¤¤¤ë¡£ PyUnit ¤Ã¡¤Window ¤È Mac ¤ò´Þ¤à ¾¤Î Python ¥×¥é¥Ã¥È¥Õ¥©¡¼¥à ¤Ç¤âƯ¤¯¤³¤È¤¬ÃΤé¤ì¤Æ¤¤¤ë¡£ ²¿¤Ç¤¢¤ì¤¦¤Þ¤¯Æ°¤«¤Ê¤¤¥×¥é¥Ã¥È¥Õ¥©¡¼¥à ¤Þ¤¿¤à Python ¤Î¥Ã¡¼¥¸¥ç¥ó¤¬¤¢¤Ã¤¿¤Ê¤é¡¤»ä¤ËÃΤ餻¤Æ¤¯¤À¤µ¤¤¡£
PyUnit ¤ò JPython ¤È Jython ¤Ç»ÈÃѤ¹¤ëºÃ¤Î¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ã¡¤ ¡ÖPyUnit ¤ò JPython ¤È Jython ¤Ç»È¤¦¤Ë¤Ã¡×. ¤ÎÀá¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
¥Æ¥¹¥È¤ò½ñ¤¯¤¿¤á¤ËɬÃפʥ¯¥é¥¹¤à unittest ¥â¥¸¥å¡¼¥ë¤Ë¤¢¤ë¡£ ¤³¤Î¥â¥¸¥å¡¼¥ë¤à Python 2.1 °Ê¹ß¤Îɸ½à Python ¥é¥¤¥Ö¥é¥ê¤Î°ìÉô¤Ç¤¢¤ë¡£ ¤â¤··¯¤¬¤â¤Ã¤È¸Å¤¤¥Ã¡¼¥¸¥ç¥ó¤Î Python ¤ò»È¤Ã¤Æ¤¤¤ë¤Ê¤é¡¤ Ê̸ĤË PyUnit ¥Ç¥£¥¹¥È¥ê¥Ó¥å¡¼¥·¥ç¥ó¤«¤é¥â¥¸¥å¡¼¥ë¤òÆþ¼ê¤·¤Ê¤±¤ì¤Ã¤Ê¤é¤Ê¤¤¡£
¤³¤Î¥â¥¸¥å¡¼¥ë¤ò·¯¼«¿È¤Î¥³¡¼¥É¤«¤é»È¤¨¤ë¤è¤¦¤Ë¤¹¤ë¤Ë¤Ã¡¤
¥Õ¥¡¥¤¥ë unittest.py ¤òÃÖ¤¤¤Æ¤¢¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ò·¯¤Î Python
¤Î¸¡º÷¥Ñ¥¹¤ËÆþ¤ì¤ë¤À¤±¤Ç¤è¤¤¡£
¤½¤¦¤¹¤ë¤Ë¤Ã´Ä¶ÂÊÑ¿ô $PYTHONPATH ¤ò¥»¥Ã¥È¤·¤Æ¤â¤è¤¤¤·¡¤
·¯¤Î¸½ºß¤Î Python ¸¡º÷¥Ñ¥¹¤Ë¤¢¤ë¥Ç¥£¥ì¥¯¥È¥ê¡¤
¤¿¤È¤¨¤à Redhat Linux ¥Þ¥·¥ó¤Ê¤é
/usr/lib/python1.5/site-packages
¤Ê¤É¤Ë¥Õ¥¡¥¤¥ë¤òÃÖ¤¤¤Æ¤â¤è¤¤¡£
¤³¤ì¤ò¤¹¤ë¤«¡¤ ¤Þ¤¿¤à unittest.py ¤òÎãÂê¤Î¤¢¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥³¥Ô¡¼¤·¤Ê¤¤¤È¡¤ PyUnit ¤ËƱºÂ¤ÎÎãÂê¤ò¼Â¹Ô¤Ç¤Â¤Ê¤¤¤³¤È¤ËÃðդµ¤ì¤¿¤¤¡£
ñÂΥƥ¹¥È¤òÃȤßΩ¤Æ¤ë´ðËÜŪ¤Ê¥Ö¥Ã¥Ã¥¯¤¬¥Æ¥¹¥È¡¦¥±¡¼¥¹¤Ç¤¢¤ë¡£
¤Ò¤È¤Ä¤Î¥Æ¥¹¥È¡¦¥±¡¼¥¹¤Ã¤Ò¤È¤Ä¤Î¥·¥Ê¥ê¥ª¤Ç¤¢¤ê¡¤
¤½¤ì¤¾¤ìð½à È÷¤·ÀµÅöÀ¤ò¥Ã¥§¥Ã¥¯¤¹¤ëɬÃפ¬¤¢¤ë¡£
PyUnit ¤Ç¤Ã¡¤¥Æ¥¹¥È¡¦¥±¡¼¥¹¤à unittest
¥â¥¸¥å¡¼¥ë¤Î
TestCase
¥¯¥é¥¹¤Çɽ¸½¤µ¤ì¤ë¡£
·¯¼«¿È¤Î¥Æ¥¹¥È¡¦¥±¡¼¥¹¤òºî¤ë¤Ë¤Ã¡¤TestCase
¤ÎÇÉÀ¸¥¯¥é¥¹¤ò½ñ¤¯É¬Ãפ¬¤¢¤ë¡£
TestCase
¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ã¡¤
¤Ò¤È¤Ä¤Î¥Æ¥¹¥È¡¦¥á¥½¥Ã¥É¤ò´°Ã´¤Ë¼Â¹Ô¤Ç¤Â¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë¡£
¤³¤Î¥á¥½¥Ã¥É¤Ë¤Ã¥ª¥×¥·¥ç¥ó¤È¤·¤Æð½à È÷¤È¸åÊÒÉÕ¤±¤Î¥³¡¼¥É¤¬È¼¤¦¡£
TestCase
¥¤¥ó¥¹¥¿¥ó¥¹¤ÎÃæ¤Ç¥Æ¥¹¥È¤ò¹Ô¤¦¥³¡¼¥É¤Ã´°Ã´¤Ë¼«µë¼°¤Ç¤Ê¤±¤ì¤Ã¤Ê¤é¤Ê¤¤¡£
¤Ä¤Þ¤ê¡¤Ã±ÆȤޤ¿¤ÃǤ°Õ¸Ä¿ô¤Î¾¤Î¥Æ¥¹¥È¡¦¥±¡¼¥¹¤È¤ÎǤ°Õ¤ÎÃȤ߹ç¤ï¤»¤Ç
¼Â¹Ô¤Ç¤Â¤Ê¤¯¤Æ¤Ã¤Ê¤é¤Ê¤¤¡£
ºÇ¤âñ½ã¤Ê¥Æ¥¹¥È¡¦¥±¡¼¥¹ÇÉÀ¸¥¯¥é¥¹¤Ã¡¤
ÆÃÄê¤Î¥Æ¥¹¥È¤ò¹Ô¤¦¥³¡¼¥É¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤Ë¡¤
ñ½ã¤Ë runTest
¥á¥½¥Ã¥É¤ò¾å½ñ¤ÂÄêµÃ¤¹¤ë¡£
import unittest class DefaultWidgetSizeTestCase(unittest.TestCase): def runTest(self): widget = Widget("The widget") assert widget.size() == (50,50), 'incorrect default size'
¤¿¤Àñ¤Ë Python Ãȹþ¤ß¤Î assert ʸ¤ò»È¤Ã¤Æ¡¤
¥Æ¥¹¥È¤ò¤·¤Æ¤¤¤ë¤³¤È¤ËÃðդµ¤ì¤¿¤¤¡£
¤â¤·¤â¥Æ¥¹¥È¡¦¥±¡¼¥¹¼Â¹Ô»þ¤Ë assert ʸ¤¬¼ºÇÔ¤¹¤ì¤Ã¡¤
AssertionError
¤¬¤Ò¤Âµ¯¤³¤µ¤ì¡¤
¥Æ¥¹¥È¤ò¤¹¤ë¥Õ¥ì¡¼¥à ¥ï¡¼¥¯¤Ã¤½¤Î¥Æ¥¹¥È¡¦¥±¡¼¥¹¤ò¡Ö¼ºÇÔ¡×(failure)
¤Èǧ¼±¤¹¤ë¡£
ÌÀ¼¨Åª¤Ê assert ¸¡ºº¤«¤é¤Ò¤Âµ¯¤³¤µ¤ì¤¿¤Î¤Ç¤Ã¤Ê¤¤Â¾¤ÎÎã³°¤Ã¡¤
¥Æ¥¹¥È¤ò¤¹¤ë¥Õ¥ì¡¼¥à ¥ï¡¼¥¯¤«¤é¡Ö¥¨¥é¡¼¡×(error) ¤È¤·¤Æǧ¼±¤µ¤ì¤ë¡£
('¥Æ¥¹¥È¾ò·ï¤Ë¤Ä¤¤¤Æ¤ÎÊäÂÂ' Àá »²¾È)
¥Æ¥¹¥È¡¦¥±¡¼¥¹¤Î¼Â¹ÔÊýË¡¤Ã¸å½Ò¤¹¤ë¡£ ¤µ¤·¤¢¤¿¤ê¡¤¤³¤Î¤è¤¦¤Ê¥Æ¥¹¥È¡¦¥±¡¼¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¹½ÃÛ¤¹¤ë¤Ë¤Ã¡¤ °ú¿ô¤Ê¤·¤Ç¥³¥ó¥¹¥È¥é¥¯¥¿¤ò¸Æ¤Ö¤³¤È¤ËÃðդµ¤ì¤¿¤¤¡£
testCase = DefaultWidgetSizeTestCase()
¤µ¤Æ¡¤¤³¤Î¤è¤¦¤Ê¥Æ¥¹¥È¡¦¥±¡¼¥¹¤ÃÇüÂç¤Ê¸Ä¿ô¤Ë¤Ê¤êÆÀ¤ë¡£ ¤½¤·¤Æ¤½¤Îð½à È÷¤Ã¤¿¤À¤Î·«¤êÊÖ¤·¤Ë¤Ê¤êÆÀ¤ë¡£ ¾åµÂ¤Î¥±¡¼¥¹¤Ç¡¤100 ¸Ä¤Î¥Æ¥¹¥È¡¦¥±¡¼¥¹ÇÉÀ¸¥¯¥é¥¹¤¬¤½¤ì¤¾¤ì Widget ¤ò¹½ÃÛ¤¹¤ë¤È¤·¤¿¤é¡¤¤½¤ì¤Ã¸«¶ì¤·¤¤½ÅÊ£¤Ë¤Ê¤ë¤À¤Ã¤¦¡£
¤µ¤¤¤ï¤¤¡¤»ä¤¿¤Ã¤à setUp
¤È¤¤¤¦ hook ¥á¥½¥Ã¥É¤ò¼ÂÃõ¤·¤Æ¡¤
¤³¤Î¤è¤¦¤Êð½à È÷¥³¡¼¥É (set-up code) ¤ò¤¯¤¯¤ê½Ã¤¹¤³¤È¤¬¤Ç¤Â¤ë¡£
»ä¤¿¤Ã¤¬¥Æ¥¹¥È¤ò¼Â¹Ô¤¹¤ë¤È¤Â¡¤
¥Æ¥¹¥È¤ò¤¹¤ë¥Õ¥ì¡¼¥à ¥ï¡¼¥¯¤¬¡¤
»ä¤¿¤Ã¤ËÂå¤ï¤Ã¤Æ¤½¤Î¥á¥½¥Ã¥É¤ò¼«Æ°Åª¤Ë¸Æ¤Ó½Ã¤¹¡£
import unittest class SimpleWidgetTestCase(unittest.TestCase): def setUp(self): self.widget = Widget("The widget") class DefaultWidgetSizeTestCase(SimpleWidgetTestCase): def runTest(self): assert self.widget.size() == (50,50), 'incorrect default size' class WidgetResizeTestCase(SimpleWidgetTestCase): def runTest(self): self.widget.resize(100,150) assert self.widget.size() == (100,150), \ 'wrong size after resize'
¥Æ¥¹¥È¤Î¼Â¹ÔÃ桤¤â¤· setUp
¥á¥½¥Ã¥É¤¬Îã³°¤ò¤Ò¤Âµ¯¤³¤·¤¿¤Ê¤é¡¤
¥Õ¥ì¡¼¥à ¥ï¡¼¥¯¤Ã¥Æ¥¹¥È¤¬¥¨¥é¡¼¤Ë´Ù¤Ã¤¿¤È¸«¤Ê¤·¡¤
runTest
¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¤Ê¤¤¡£
ƱÃäˡ¤»ä¤¿¤Ã¤Ã
runTest
¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¤¿¸åÊÒÉÕ¤±¤ò¤¹¤ë
tearDown
¥á¥½¥Ã¥É¤òÃѰդǤ¤롣
import unittest class SimpleWidgetTestCase(unittest.TestCase): def setUp(self): self.widget = Widget("The widget") def tearDown(self): self.widget.dispose() self.widget = None
¤â¤· setUp
¤¬À®¸ù¤·¤¿¤Ê¤é¡¤tearDown
¥á¥½¥Ã¥É¤à runTest
¤ÎÀ®Èäˤ«¤«¤ï¤é¤º¼Â¹Ô¤µ¤ì¤ë¡£
¥Æ¥¹¥È¤ò¤¹¤ë¥³¡¼¥É¤Î¤¿¤á¤Î¡¤¤³¤Î¤è¤¦¤Êºî¶È´Ä¶Â¤òºî¤êÉÕ¤± (fixture) ¤È¸Æ¤Ö¡£
¿¤¯¤Î¾®¤µ¤Ê¥Æ¥¹¥È¡¦¥±¡¼¥¹¤¬Æ±¤¸ºî¤êÉÕ¤±¤ò»È¤¦¤³¤È¤¬¤è¤¯¤¢¤ë¡£
¤³¤Î¾ì¹ç¡¤»ä¤¿¤Ã¤à SimpleWidgetTestCase
¤«¤é
DefaultWidgetSizeTestCase
¤Î¤è¤¦¤Ê¿¤¯¤Î¾®¤µ¤Ê£±¥á¥½¥Ã¥É¤Î¥¯¥é¥¹¤òÇÉÀ¸¤¹¤ë¤³¤È¤Ë
½ª»Ã¤·¤Æ¤·¤Þ¤¦¡£
¤³¤ì¤Ã»þ´Ö¤ÎòÈñ¤Ç¤¢¤ê´«¤á¤é¤ì¤Ê¤¤¤«¤é¡¤JUnit ¤ÈƱ¤¸¤è¤¦¤Ë¡¤
PyUnit ¤Ã¤â¤Ã¤Èñ½ã¤Ê¤·¤¯¤ß¤òÃÑ°Õ¤·¤Æ¤¤¤ë¡£
import unittest class WidgetTestCase(unittest.TestCase): def setUp(self): self.widget = Widget("The widget") def tearDown(self): self.widget.dispose() self.widget = None def testDefaultSize(self): assert self.widget.size() == (50,50), 'incorrect default size' def testResize(self): self.widget.resize(100,150) assert self.widget.size() == (100,150), \ 'wrong size after resize'
¤³¤³¤Ç»ä¤¿¤Ã¤Ã¡¤runTest
¥á¥½¥Ã¥É¤ÎÂå¤ï¤ê¤Ë¡¤
Æó¤Ä¤Î°Û¤Ê¤Ã¤¿¥Æ¥¹¥È¡¦¥á¥½¥Ã¥É¤òÃÑ°Õ¤·¤¿¡£
³Æ¥¯¥é¥¹¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤Ãº£¤ä test
¥á¥½¥Ã¥É¤Î°ì¤Ä¤ò¤½¤ì¤¾¤ì¼Â¹Ô¤¹¤ë¡£
³Æ¥¤¥ó¥¹¥¿¥ó¥¹¤¬¸ÄÊÌ¤Ë self.widget
¤ò¹½ÃÛ¤·¡¤Ç˲õ¤¹¤ë¡£
»ä¤¿¤Ã¤Ã¡¤¥¤¥ó¥¹¥¿¥ó¥¹¤ò¹½ÃÛ¤¹¤ë¤È¤Â¡¤
¼Â¹Ô¤¹¤Ù¤Â¥Æ¥¹¥È¡¦¥á¥½¥Ã¥É¤ò»ØÄꤷ¤Ê¤±¤ì¤Ã¤Ê¤é¤Ê¤¤¡£
¥³¥ó¥¹¥È¥é¥¯¥¿¤Ë¥á¥½¥Ã¥É̾¤òÅ乤³¤È¤Ç¡¤¤³¤ì¤ò»ØÄꤹ¤ë¡£
defaultSizeTestCase = WidgetTestCase("testDefaultSize") resizeTestCase = WidgetTestCase("testResize")
¥Æ¥¹¥È¡¦¥±¡¼¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ã¡¤
¥Æ¥¹¥ÈÂþäε¡Ç½¤Ë¤·¤¿¤¬¤Ã¤Æ¥°¥ë¡¼¥×²½¤µ¤ì¤ë¡£
PyUnit ¤Ã¤³¤Î¤¿¤á¤Î¤·¤¯¤ß¤òÃÑ°Õ¤·¤Æ¤¤¤ë¡£
¤½¤ì¤¬¡Ö¥Æ¥¹¥È¡¦¥¹¡¼¥Ä¡×(test suite) ¤Ç¤¢¤ë¡£
¥Æ¥¹¥È¡¦¥¹¡¼¥Ä¤à unittest
¥â¥¸¥å¡¼¥ëÆâ¤Î TestSuite
¥¯¥é¥¹¤Ë¤è¤Ã¤Æɽ¸½¤µ¤ì¤ë¡£
widgetTestSuite = unittest.TestSuite() widgetTestSuite.addTest(WidgetTestCase("testDefaultSize")) widgetTestSuite.addTest(WidgetTestCase("testResize"))
¥Æ¥¹¥È¼Â¹Ô¤ÎÊص¹¤Î¤¿¤á¡¤¸å¤Ç¸«¤ë¤è¤¦¤Ë¡¤ È÷¤¨ÉÕ¤±¤Î¥Æ¥¹¥È¡¦¥¹¡¼¥Ä¤òÊÖ¤¹ callable ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤ò¡¤ ³Æ¥Æ¥¹¥È¡¦¥â¥¸¥å¡¼¥ë¤ËÃÑ°Õ¤·¤Æ¤ª¤¯¤ÈÎɤ¤¡£
def suite(): suite = unittest.TestSuite() suite.addTest(WidgetTestCase("testDefaultSize")) suite.addTest(WidgetTestCase("testResize")) return suite
¤¢¤ë¤¤¤Ã
class WidgetTestSuite(unittest.TestSuite): def __init__(self): unittest.TestSuite.__init__(self,map(WidgetTestCase, ("testDefaultSize", "testResize")))
(ÌÀ¤é¤«¤Ë¸å¼Ô¤Ãµ¤¤Î¼å¤¤¿Ã¸þ¤±¤Ç¤Ã¤Ê¤¤)
¿¤¯¤Î»÷¤¿¤è¤¦¤Ê̾ð¤Î¥Æ¥¹¥È´Ø¿ô¤ò°ú¿ô¤Ë¤·¤Æ
TestCase
ÇÉÀ¸¥¯¥é¥¹¤òºî¤ë¤³¤È¤Ã¶¦Ä̤Υѥ¿¡¼¥ó¤À¤«¤é¡¤
unittest
¥â¥¸¥å¡¼¥ë¤Ë
makeSuite
¤È¤¤¤¦Êص¹´Ø¿ô¤¬ÃÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡£
¤³¤Î´Ø¿ô¤Ã¡¤
£±¸Ä¤Î¥Æ¥¹¥È¡¦¥±¡¼¥¹¡¦¥¯¥é¥¹¤ÎÃæ¤Ë¤¢¤ë¤¹¤Ù¤Æ¤Î¥Æ¥¹¥È¡¦¥±¡¼¥¹¤«¤é¤Ê¤ë
¥Æ¥¹¥È¡¦¥¹¡¼¥Ä¤ò¹½ÃÛ¤¹¤ë¡£
suite = unittest.makeSuite(WidgetTestCase,'test')
makeSuite
´Ø¿ô¤ò»È¤¦»þ¡¤
¥Æ¥¹¥È¡¦¥¹¡¼¥Ä¤¬ÃṤʥƥ¹¥È¡¦¥±¡¼¥¹¤ò¼Â¹Ô¤¹¤ë½ç½ø¤Ã¡¤
cmp
Ãȹþ´Ø¿ô¤ò»È¤Ã¤Æ¥Æ¥¹¥È´Ø¿ô¤Î̾ð¤ò¥½¡¼¥È¤·¤Æ·èÄꤵ¤ì¤ë½ç½ø¤Ç¤¢¤ë¤³¤È¤Ë¡¤
Ãðդµ¤ì¤¿¤¤¡£
¤·¤Ã¤·¤Ã¡¤¥·¥¹¥Æ¥à ôÂΤËÂ䷤ƥƥ¹¥È¤ò°ìÅ٤˼¹Ԥ¹¤ë¤¿¤á¤Ë¡¤
¥Æ¥¹¥È¡¦¥±¡¼¥¹¤Î¥¹¡¼¥Ä¤ò¥°¥ë¡¼¥×²½¤·¤¿¤¤¤³¤È¤¬¤¢¤ë¡£
¤³¤ì¤Ã´Êñ¤Ç¤¢¤ë¡£
Ê£¿ô¤Î TestCase
¤ò£±¸Ä¤Î TestSuite
¤Ë²Ã¤¨¤é¤ì¤ë¤è¤¦¤Ë¡¤
Ê£¿ô¤Î TestSuite
¤ò£±¸Ä¤Î TestSuite
¤Ë²Ã¤¨¤é¤ì¤ë¤«¤é¤Ç¤¢¤ë¡£
suite1 = module1.TheTestSuite() suite2 = module2.TheTestSuite() alltests = unittest.TestSuite((suite1, suite2))
¥Æ¥¹¥È¥¹¡¼¥Ä¤òÆþ¤ì»Ò¤Ë¤¹¤ëÎã¤Ã¡¤
ÇÛÉۥѥ屡¼¥¸¤Î examples
¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Î alltests.py
¤Ë¸«¤é¤ì¤ë¡£
¥Æ¥¹¥È¡¦¥±¡¼¥¹¤È¥Æ¥¹¥È¡¦¥¹¡¼¥Ä¤ÎÄêµÃ¤ò¡¤ ¥Æ¥¹¥ÈÂþäΥ³¡¼¥É¤ÈƱ¤¸¥â¥¸¥å¡¼¥ë (Î㤨¤à 'widget.py') ¤ËÃÖ¤¤¤Æ¤â¤è¤¤¤¬¡¤ ¥Æ¥¹¥È¡¦¥³¡¼¥É¤òÊ̸ĤΥ⥸¥å¡¼¥ë¡¤Î㤨¤à 'widgettests.py' ¤ËÃÖ¤¯¤³¤È¤Ë¤Ã¤¤¤¯¤Ä¤«¤ÎÃøÅÀ¤¬¤¢¤ë¡£
¤â¤Ã¤Ã¤ó¡¤¤³¤ì¤é¤Î¥Æ¥¹¥È¤ò½ñ¤¯Ã´ÂΤÎÌÜŪ¤Ã¡¤
»ä¤¿¤Ã¤¬¥Æ¥¹¥È¤ò¼Â¹Ô¤Ç¤Â¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¡¤
¤½¤·¤Æ»ä¤¿¤Ã¤Î¥½¥Õ¥È¥¦¥§¥¢¤¬Æ¯¤¯¤«¤É¤¦¤«Ê¬¤«¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ç¤¢¤ë¡£
¥Æ¥¹¥È¡¦¥Õ¥ì¡¼¥à ¥ï¡¼¥¯¤Ã¡¤¤¤¤¯¤Ä¤«¤Î 'TestRunner' ¥¯¥é¥¹¤ò»È¤Ã¤Æ¡¤
¥Æ¥¹¥È¤¬¼Â¹Ô¤Ç¤Â¤ë´Ä¶Â¤òÃÑ°Õ¤·¤Æ¤¤¤ë¡£
ºÇ¤â°ìÈÌŪ¤Ê TestRunner ¤à TextTestRunner
¤Ç¤¢¤ë¡£
¤³¤ì¤Ã¥Æ¥¹¥È¤ò¼Â¹Ô¤·¡¤¥Æ¥Â¥¹¥È·Ã¼°¤Ç·ë²Ì¤òÊó¹ð¤¹¤ë¡£
runner = unittest.TextTestRunner() runner.run(widgetTestSuite)
¥Ç¥Õ¥©¥ë¥È¤Ç¤Ã¡¤TextTestRunner
¤Ã¤½¤Î½ÃÎäò
sys.stderr
¤Ë°õ»ú¤¹¤ë¡£
¤·¤«¤·¡¤
¤³¤ì¤Ã¥³¥ó¥¹¥È¥é¥¯¥¿¤ËÊ̤Υե¡¥¤¥ë=¥é¥¤¥¯¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤òÅ乤³¤È¤Ç¡¤
Êѹ¹¤Ç¤Â¤ë¡£
¤³¤Î¤è¤¦¤Ê TextTestRunner
¤Î»ÈÃѤá¤Python
¥¤¥ó¥¿¡¼¥×¥ê¥¿¤Î¥»¥Ã¥·¥ç¥ó¤«¤éÂÃÃÃŪ¤Ë¥Æ¥¹¥È¤ò¼Â¹Ô¤¹¤ëÃýÃÛŪ¤ÊÊýË¡¤Ç¤¢¤ë¡£
unittest
¥â¥¸¥å¡¼¥ë¤Ë main
¤È¤¤¤¦´Ø¿ô¤¬¤¢¤ë¡£
¤³¤Î´Ø¿ô¤ò»È¤¦¤È¡¤¥Æ¥¹¥È¡¦¥â¥¸¥å¡¼¥ë¤ò¡¤
¤½¤Î¥â¥¸¥å¡¼¥ëÆâ¤Î¥Æ¥¹¥È¤ò¼Â¹Ô¤¹¤ë¥¹¥¯¥ê¥×¥È¤Ø¤È´Êñ¤ËÊѤ¨¤é¤ì¤ë¡£
main
´Ø¿ô¤Ã¡¤unittest.TestLoader
¥¯¥é¥¹¤ò»È¤Ã¤Æ¡¤
¸½ºß¤Î¥â¥¸¥å¡¼¥ëÆâ¤Î¥Æ¥¹¥È¡¦¥±¡¼¥¹¤ò¼«Æ°Åª¤Ë¸«ÉÕ¤±¤Æ¥Ã¡¼¥É¤¹¤ë¡£
¤·¤¿¤¬¤Ã¤Æ¡¤¤â¤··¯¤¬Ã°½Ò¤Î test*
¤È¤¤¤¦Ì¿Ì¾´·½¬¤ò»È¤Ã¤Æ¥Æ¥¹¥È¡¦¥á¥½¥Ã¥É¤ò̿̾¤·¤Æ¤¤¤ë¤Ê¤é¤Ã¡¤
·¯¤Î¥Æ¥¹¥È¡¦¥â¥¸¥å¡¼¥ë¤ÎËöÈø¤Ë²¼µÂ¤Î¥³¡¼¥É¤òÃÖ¤¯¤³¤È¤¬¤Ç¤Â¤ë¡£
if __name__ == "__main__": unittest.main()
¤¹¤ë¤È¡¤·¯¤¬¥³¥Þ¥ó¥É¹Ô¤«¤é·¯¤Î¥Æ¥¹¥È¡¦¥â¥¸¥å¡¼¥ë¤ò¼Â¹Ô¤·¤¿»þ¡¤ ¤½¤³¤Ë´Þ¤Þ¤ì¤ë¥Æ¥¹¥È¤¬¤¹¤Ù¤Æ¼Â¹Ô¤µ¤ì¤ë¡£ ÃøÃѲÄǽ¤Ê¥ª¥×¥·¥ç¥ó¤ò¸«¤ë¤Ë¤Ã¡¤ '-h' ¥ª¥×¥·¥ç¥ó¤òÉÕ¤±¤Æ¥â¥¸¥å¡¼¥ë¤ò¼Â¹Ô¤¹¤ì¤Ã¤è¤¤¡£
¥³¥Þ¥ó¥É¹Ô¤«¤éǤ°Õ¤Î¥Æ¥¹¥È¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ã¡¤
unittest
¥â¥¸¥å¡¼¥ë¤ò¥¹¥¯¥ê¥×¥È¤È¤·¤Æ¼Â¹Ô¤¹¤ì¤Ã¤è¤¤¡£
¥Æ¥¹¥È¡¦¥±¡¼¥¹¤Þ¤¿¤Ã¥Æ¥¹¥È¡¦¥¹¡¼¥Ä¤Î̾ð¤ò°ú¿ô¤È¤·¤Æÿ¤¨¤ë¡£
% python unittest.py widgettests.WidgetTestSuite
¤Þ¤¿¤Ã
% python unittest.py widgettests.makeWidgetTestSuite
¥³¥Þ¥ó¥É¹Ô¤ÇÆÃÄê¤Î¥Æ¥¹¥È¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤Â¤ë¡£
¥â¥¸¥å¡¼¥ë 'listtests' ¤Î
TestCase
ÇÉÀ¸¥¯¥é¥¹¤Ç¤¢¤ë 'ListTestCase
'
(ÇÛÉۥѥ屡¼¥¸¤Î 'examples' ¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê»²¾È)
¤òÃö¤é¤»¤ë¤Ë¤Ã¡¤¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ì¤Ã¤è¤¤¡£
% python unittest.py listtests.ListTestCase.testAppend
¤³¤³¤Ç 'testAppend' ¤Ã¡¤
¥Æ¥¹¥È¡¦¥±¡¼¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤¬¼Â¹Ô¤¹¤Ù¤Â¥Æ¥¹¥È¡¦¥á¥½¥Ã¥É¤Î̾ð¤Ç¤¢¤ë¡£
ListTestCase
¥¯¥é¥¹¤Î¤¹¤Ù¤Æ¤Î 'test*'
¥á¥½¥Ã¥É¤ËÂä·¤ÆƱ¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¹½ÃÛ¤·¤ÆÃö¤é¤»¤ë¤Ë¤Ã¡¤
¼¡¤ò¼Â¹Ô¤¹¤ì¤Ã¤è¤¤¡£
% python unittest.py listtests.ListTestCase
¥Æ¥¹¥È¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤ËÃøÃѤǤ¤륰¥é¥Õ¥£¥«¥ë¤Ê¥Õ¥Ã¥ó¥È¡¦¥¨¥ó¥É¤¬¤¢¤ë¡£
¤½¤ì¤Ã¡¤Âç¿¿ô¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à ¾å¤Ç Python
¤È¤È¤â¤Ë½Ã²Ù¤µ¤ì¤Æ¤¤¤ë¥¦¥£¥ó¥É¥¦²½¥Ä¡¼¥ë¥Â¥Ã¥È¤Ç¤¢¤ë
Tkinter
¤ò»È¤Ã¤Æ½ñ¤«¤ì¤Æ¤¤¤ë¡£
¤½¤Î³°´Ñ¤à JUinit GUI ¤È»÷¤Æ¤¤¤ë¡£
GUI ¥Æ¥¹¥È¡¦¥é¥ó¥Ê¤ò»È¤¦¤Ë¤Ã¡¤Ã±½ã¤Ë¼¡¤ò¼Â¹Ô¤¹¤ë¡£
% python unittestgui.py¤Þ¤¿¤Ã
% python unittestgui.py widgettests.WidgetTestSuite
¤³¤³¤Ç¤â¡¤¤ä¤Ã¤ê¡¤¼Â¹Ô¤¹¤Ù¤Â¥Æ¥¹¥È¤È¤·¤ÆÆþÎ乤ë̾ð¤Ã¡¤
TestCase
¤Þ¤¿¤à TestSuite
¤Î
¥¤¥ó¥¹¥¿¥ó¥¹¤òÌá¤êÃäȤ¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î´°Ã´½¤¾þ̾
(fully-qualified name) ¤Ç¤Ê¤±¤ì¤Ã¤Ê¤é¤Ê¤¤¡£
¤É¤Î¥Æ¥¹¥È¤â¼Â¹Ô¤Î¤¿¤Ó¤ËºÆ¹½ÃÛ¤·¤Ê¤±¤ì¤Ã¤Ê¤é¤Ê¤¤¤«¤é¡¤
¹½ÃۺѤߤΥƥ¹¥È¤Î̾ð¤Ç¤¢¤Ã¤Æ¤Ã¤¤¤±¤Ê¤¤¡£
¥Æ¥Â¥¹¥È¡¦¥Æ¥¹¥È¡¦¥é¥ó¥Ê¤ÎÂå¤ï¤ê¤Ë GUI ¥Æ¥¹¥È¡¦¥é¥ó¥Ê¤òÃøÃѤ¹¤ë¤È¡¤ Îã¤Î¥¦¥£¥ó¥É¥¦¹¹¿·¤Î¤¿¤á¤Ë»þ´Ö¥ª¡¼¥Ã¥Ø¥Ã¥É¤¬²Ã¤»¤é¤ì¤ë¡£ »ä¤Î¥·¥¹¥Æ¥à ¤Ç¤Ã¡¤1000 ¥Æ¥¹¥È¤¢¤¿¤ê 7 ÉÃþʬ¤Ë¤«¤«¤ë¡£ ¤³¤Î¿ôÃäôĶ¤ˤè¤êÊѤï¤ë¤«¤â¤·¤ì¤Ê¤¤¡£
Ä̾¥Æ¥¹¥È¤Î¼Â¹Ô»þ¤Ë¤Ã¡¤
¥Æ¥¹¥È¤Î̾𤬠TestRunner
¤Ë¤è¤Ã¤Æɽ¼¨¤µ¤ì¤ë¡£
¤³¤Î̾ð¤Ã¡¤¥Æ¥¹¥È¡¦¥±¡¼¥¹¤Î¥¯¥é¥¹Ì¾¤È¡¤
¤½¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤¬¼Â¹Ô¤¹¤ë¤è¤¦¤Ë½é´ü²½¤µ¤ì¤¿¥Æ¥¹¥È¡¦¥á¥½¥Ã¥É¤Î̾𤫤顤
Ƴ½Ã¤µ¤ì¤ë¡£
¤·¤«¤·¡¤¤â¤··¯¤¬¥Æ¥¹¥È¡¦¥á¥½¥Ã¥É¤Ë doc-string ¤òÿ¤¨¤ì¤Ã¡¤ ¤½¤Î doc-string ¤ÎºÇ½é¤Î¹Ô¤¬¡¤¥Æ¥¹¥È¤Î¼Â¹Ô»þ¤Ëɽ¼¨¤µ¤ì¤ë¡£ ¤³¤ì¤Ã·¯¤Î¥Æ¥¹¥È¤ò¥É¥Â¥å¥á¥ó¥È²½¤¹¤ë´Êñ¤Ê¤·¤¯¤ß¤òÃÑ°Õ¤¹¤ë¡£
class WidgetTestCase(unittest.TestCase): def testDefaultSize(self): """Check that widgets are created with correct default size""" assert self.widget.size() == (50,50), 'incorrect default size'
»ä¤Ã¥Æ¥¹¥È¡¦¥±¡¼¥¹¤Î¾ò·ï¤ò¥Ã¥§¥Ã¥¯¤¹¤ë¤¿¤á¤Ë
¡Ö¼«²ÈÀ½¡×¤ÎɽÌÀµ¡¹½¤Ç¤Ã¤Ê¤¯¡¤
Python ¤ËÃȹþ¤ß¤ÎɽÌÀµ¡¹½¤ò»È¤¦¤³¤È¤ò´«¤á¤Æ¤Â¤¿¡£
assert
¤Ãñ½ã¤Ç¤¢¤ê¡¤´ÊÌÀ¤Ç¤¢¤ê¡¤¤Ê¤¸¤ß¤â¤¢¤ë¡£
¤·¤«¤·¡¤¥Æ¥¹¥È¤ò Python ¤Î
('.pyo' ¥å¤¥È¥³¡¼¥É¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë)
ºÇŬ²½¥ª¥×¥·¥ç¥óÉդ¤Ǽ¹Ԥ·¤¿¾ì¹ç¤Ã¡¤
assert
ʸ¤Ã¥¹¥Â¥Ã¥×¤µ¤ì¡¤
¥Æ¥¹¥È¡¦¥±¡¼¥¹¤¬ÌòΩ¤¿¤º¤Ë¤Ê¤ë¡£
Python ¤ÎºÇŬ²½¥ª¥×¥·¥ç¥ó¤òøú¤Ë¤·¤Æºî¶È¤·¤¿¤¤¿Ã¡¹¤Î¤¿¤á¤Ë¡¤
»ä¤Ã¥á¥½¥Ã¥É assert_
¤ò TestCase
¥¯¥é¥¹¤Ë´Þ¤á¤¿¡£
¤³¤ì¤ÃÃȹþ¤ß¤Î assert
¤Èµ¡Ç½Åª¤ËÅù²Ã¤À¤¬¡¤
ºÇŬ²½¤Ë¤è¤Ã¤Æ¾Ã¤¨¤Ê¤¤¡£
¤·¤«¤·¡¤¤è¤êÉÔÊؤǤ¢¤ê¡¤¤è¤ê½õ¤±¤Ë¤Ê¤é¤Ê¤¤¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤Ë½ª¤ï¤ë¡£
def runTest(self): self.assert_(self.widget.size() == (100,100), "size is wrong")
¤ª¤Þ¤±¤È¤·¤Æ¡¤»ä¤à TestCase
¤Ë
failIf
¤È failUnless
¤Î¥á¥½¥Ã¥É¤âÃÑ°Õ¤·¤¿¡£
def runTest(self): self.failIf(self.widget.size() <> (100,100))
¥Æ¥¹¥È¡¦¥±¡¼¥¹¤à fail
¤ò¸Æ¤Ó½Ã¤·¤Æ¡¤
¨ºÂ¤Ë¼ºÇÔ¤¹¤ë¤³¤È¤â¤Ç¤Â¤ë¡£
def runTest(self): ... if not hasattr(something, "blah"): self.fail("blah missing") # or just 'self.fail()'
ºÇ¤â°ìÈÌŪ¤Ê¥¿¥¤¥×¤ÎɽÌÀ¤Ã¡¤ Æó¤Ä¤ÎÃäޤ¿¤Ã¥ª¥Ö¥¸¥§¥¯¥È¤Î´Ö¤ÎÅù¤·¤µ¤ÎɽÌÀ¤Ç¤¢¤ë¡£ ɽÌÀ¤¬¼ºÇÔ¤·¤¿»þ¡¤ ³«È¯¼Ô¤Ã¤½¤ÎÉÔÀµÃ䬼ºääɤó¤ÊÃäÀ¤Ã¤¿¤Î¤«¤ò¸«¤¿¤¤¤Î¤¬ÉáÄ̤Ǥ¢¤ë¡£
TestCase
¤Ë¤Ã¡¤¤³¤ÎÌÜŪ¤Î¤¿¤á¤Ë
assertEqual
¤È assertNotEqual
¤È¤¤¤¦¥á¥½¥Ã¥É¤Î¥Ú¥¢¤¬¤¢¤ë¡£
(¹¥¤ß¤Ë±þ¤¸¤Æ failUnlessEqual
and failIfEqual
¤È¤¤¤¦ÊÌ̾¤â¤¢¤ë)
def testSomething(self): self.widget.resize(100,100) self.assertEqual(self.widget.size, (100,100))
¥Æ¥¹¥È¤Ç¤Ã¡¤¤·¤Ã¤·¤Ã¡¤ ¤¢¤ë¾õ¶·¤ÇÎã³°¤¬¤Ò¤Âµ¯¤³¤µ¤ì¤ë¤³¤È¤ò¥Ã¥§¥Ã¥¯¤·¤¿¤¤¤³¤È¤¬¤¢¤ë¡£ ¤â¤·´üÂÔ¤µ¤ì¤ëÎã³°¤¬Ã÷½Ã¤µ¤ì¤Ê¤±¤ì¤Ã¡¤¥Æ¥¹¥È¤Ã¼ºÇÔ¤·¤Ê¤±¤ì¤Ã¤Ê¤é¤Ê¤¤¡£ ¤³¤ì¤Ã´Êñ¤Ë¤Ç¤Â¤ë¡£
def runTest(self): try: self.widget.resize(-1,-1) except ValueError: pass else: fail("expected a ValueError")
ÉáÄÌ¡¤´üÂÔ¤µ¤ì¤ëÎã³°¤ÎȯÀ¸¸»¤à callable ¥ª¥Ö¥¸¥§¥¯¥È¤À¤«¤é¡¤
TestCase
¤Ë¤à assertRaises
¥á¥½¥Ã¥É¤¬¤¢¤ë¡£
¥á¥½¥Ã¥É¤ÎºÇ½é¤ÎÆó¤Ä¤Î°ú¿ô¤Ã¡¤
except Àá¤Ë¸½¤ï¤ì¤ë¤è¤¦¤Ê´üÂÔ¤µ¤ì¤ëÎã³°¤È¡¤callable ¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë¡£
»Ä¤ê¤Î°ú¿ô¤à callable ¥ª¥Ö¥¸¥§¥¯¥È¤ËÅ䵤ì¤ë°ú¿ô¤Ç¤¢¤ë¡£
def runTest(self): self.assertRaises(ValueError, self.widget.resize, -1, -1)
´û¸¤Î¥Æ¥¹¥È¡¦¥³¡¼¥É¤ò»ý¤Ã¤Æ¤¤¤Æ¡¤PyUnit ¤«¤é¼Â¹Ô¤µ¤»¤¿¤¤¤¬¡¤
¸Å¤¤¥Æ¥¹¥È´Ø¿ô¤ò
TestCase
ÇÉÀ¸¥¯¥é¥¹¤Ë¤¤¤Ã¤¤¤ÃÊÑ´¹¤·¤¿¤¯¤Ã¤Ê¤¤¡¤
¤È¤¤¤¦ÃøÃѼԤ⤤¤ë¤À¤Ã¤¦¡£
¤½¤Î¤¿¤á¤Ë¡¤
PyUnit ¤à FunctionTestCase
¥¯¥é¥¹¤òÃÑ°Õ¤·¤Æ¤¤¤ë¡£
¤³¤ì¤à TestCase
¤ÎÇÉÀ¸¥¯¥é¥¹¤Ç¤¢¤ê¡¤
´û¸¤Î¥Æ¥¹¥È´Ø¿ô¤ò¥é¥Ã¥×¤¹¤ë¤¿¤á¤Ë»È¤ï¤ì¤ë¡£
ð½à È÷¤È¸åÊÒÉÕ¤±¤Î´Ø¿ô¤â¥ª¥×¥·¥ç¥ó¤È¤·¤Æ¥é¥Ã¥×¤Ç¤Â¤ë¡£
²¼µÂ¤Î¥Æ¥¹¥È´Ø¿ô¤¬Ã¿¤¨¤é¤ì¤¿¤È¤Â¡¤
def testSomething(): something = makeSomething() assert something.name is not None ...
¼¡¤Î¤è¤¦¤Ë¤·¤ÆÅù²Ã¤Ê¥Æ¥¹¥È¡¦¥±¡¼¥¹¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤ò¹½ÃۤǤ¤롣
testcase = unittest.FunctionTestCase(testSomething)
¤â¤·¥Æ¥¹¥È¡¦¥±¡¼¥¹¤ÎÃà ºî¤Î°ìÉô¤È¤·¤Æ¸Æ¤Ó½Ã¤µ¤ì¤ë¤Ù¤ÂÉÕ²ÃŪ¤Ê¡¤ ð½à È÷¤È¸åÊÒÉÕ¤±¤Î¥á¥½¥Ã¥É¤¬¤¢¤ì¤Ã¡¤¤½¤ì¤é¤âÿ¤¨¤ë¤³¤È¤¬¤Ç¤Â¤ë¡£
testcase = unittest.FunctionTestCase(testSomething, setUp=makeSomethingDB, tearDown=deleteSomethingDB)
PyUnit ¤ÃËÜÃè 'C' Python ¤Î¤¿¤á¤Ë½ñ¤«¤ì¤¿¤¬¡¤ ·¯¤Î Java ¤Þ¤¿¤à Jython ¤Î¥½¥Õ¥È¥¦¥§¥¢¤Î¤¿¤á¤Ë¡¤ Jython ¤ò»È¤Ã¤¿ PyUnit ¥Æ¥¹¥È¤ò½ñ¤¯¤³¤È¤Ã²Äǽ¤Ç¤¢¤ë¡£ Jython ¤ò»È¤Ã¤Æ JUnit ¥Æ¥¹¥È¤ò½ñ¤³¤¦¤È¤¹¤ë¤è¤ê¤â¡¤ ¤³¤Ã¤é¤Î¤Û¤¦¤¬¹¥¤Þ¤·¤¤¤«¤â¤·¤ì¤Ê¤¤¡£ PyUnit ¤à Jython ¤ÎÀèÃĤǤ¢¤ë JPython 1.0 ¤ª¤è¤Ó 1.1 ¤Ç¤âÀµ¤·¤¯Æ°ºî¤¹¤ë¡£
¤â¤Ã¤Ã¤ó¡¤Java ¤à TK GUI ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò»ý¤¿¤Ê¤¤¤«¤é¡¤ PyUnit ¤Î Tkinter ¥Ù¡¼¥¹¤Î GUI ¤à Jython ¤ÇÆ°ºî¤·¤Ê¤¤¡£ ¤·¤«¤·¡¤¥Æ¥Â¥¹¥È¤À¤±¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ã¥åååêÆ°ºî¤¹¤ë¡£
¤½¤¦¤¹¤ë¤¿¤á¤Ë¤Ãñ¤Ëɸ½à C Python ¥é¥¤¥Ö¥é¥ê
¥â¥¸¥å¡¼¥ë¤Î¥Õ¥¡¥¤¥ë 'traceback.py
',
'linecache.py
',
'stat.py
', 'getopt.py
'
¤ò JPython ¤«¤é import ¤Ç¤Â¤ë¾ì½ê¤Ë¥³¥Ô¡¼¤¹¤ë¤À¤±¤Ç¤è¤¤¡£
¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤à C Python
¤Î¤É¤Î¥Ç¥£¥¹¥È¥ê¥Ó¥å¡¼¥·¥ç¥ó¤«¤é¤âÆþ¼ê¤Ç¤Â¤ë¡£
(¤³¤Î¥¬¥¤¥É¥é¥¤¥ó¤à C Python 1.5.x ¤Îɸ½à ¥é¥¤¥Ö¥é¥ê¤Ë´ð¤Å¤¤¤Æ¤¤¤ë¤«¤é¡¤
¾¤Î¥Ã¡¼¥¸¥ç¥ó¤Î Python ¤Ë¤ÃÅö¤Æ¤Ã¤Þ¤é¤Ê¤¤¤«¤â¤·¤ì¤Ê¤¤)
¤½¤¦¤¹¤ì¤Ã·¯¤à PyUnit ¥Æ¥¹¥È¤ò C Python ¤Î¤È¤Â¤Èô¤¯Æ±Ãä˽ñ¤¯¤³¤È¤¬¤Ç¤Â¤ë¡£
¾å½Ò¤Î"¥Æ¥¹¥È¾ò·ï¤Ë¤Ä¤¤¤Æ¤ÎÊäÂÂ" Àá¤Î¤¿¤À¤·½ñ¤Â¤ò»²¾È¤µ¤ì¤¿¤¤¡£
¥Æ¥¹¥È¡¦¥¹¡¼¥Ä¤Î¼Â¹ÔÃæ¤ËÎã³°¤¬¤Ò¤Âµ¯¤³¤µ¤ì¤¿¤È¤Â¡¤ ·ë²Ì¤È¤·¤Æ¤Î traceback ¥ª¥Ö¥¸¥§¥¯¥È¤¬¡¤ ¼ºÇԤξܺ٤ò¥Æ¥¹¥È¼Â¹Ô¤Î½ª¤ï¤ê¤Ë½ñ¼°²½¤·¤Æ°õ»ú¤Ç¤Â¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¡¤ ÊÃᤵ¤ì¤ë¡£Ã±½ã¤µ¤Ã¤µ¤Æ¤ª¤Â¡¤¤³¤ÎÃøÅÀ¤Ã¡¤ traceback ¤Ë³ÊǼ¤µ¤ì¤¿¥Ã¡¼¥«¥ë¤ª¤è¤Ó¥°¥Ã¡¼¥Ã¥ëÊÑ¿ôÃäθ¡»à Ä´ºº¤¬¡¤ ¾ÂÃè¤Î GUI TestRunner ¤Ë¤È¤Ã¤Æ²Äǽ¤Ë¤Ê¤êÆÀ¤ë¤È¤¤¤¦ÅÀ¤Ç¤¢¤ë¡£
ÀøºßŪ¤ÊÉûºîÃѤ᤼ºÇÔÉÑÅÙ¤¬Èó¾ï¤Ë¹â¤¤¥Æ¥¹¥È¡¦¥¹¡¼¥Ä¤ò¼Â¹Ô¤·¤¿¤È¤Â¡¤ ¤³¤ì¤é¤ÎÊÃᤵ¤ì¤¿ traceback ¥ª¥Ö¥¸¥§¥¯¥ÈôÂΤΥá¥â¥ê»ÈÃѤ¬ÌäÂê¤Ë¤Ê¤êÆÀ¤ë¤È¤¤¤¦ÅÀ¤Ç¤¢¤ë¡£ ¤â¤Ã¤Ã¤ó¡¤Èó¾ï¤Ë¿¤¯¤Î¥Æ¥¹¥È¤¬¼ºÇÔ¤¹¤ë¤È¤·¤¿¤é¡¤ ¤³¤Î¥á¥â¥ê¡¦¥ª¡¼¥Ã¥Ø¥Ã¥É¤Ã·¯¤Ë¤È¤Ã¤ÆºÇ¤âº³ºÙ¤ÊÌäÂê¤Ç¤¢¤ë¡£
·¯¤Ã¤³¤Î¥½¥Õ¥È¥¦¥§¥¢¤ò¡¤Python
¤½¤ì¼«¿È¤ËŬÃѤµ¤ì¤ëƱ¤¸¤¯¼«Ã³¤Ê¾ò·ï¤Î²¼¤Ç¡¤
¼«Ã³¤ËÃøÃÑ¡¤²þÊÑ¡¤¤ª¤è¤ÓºÆÇÛÉÛ¤·¤Æ¤è¤¤¡£
»ä¤¬Ã׵᤹¤ë¤³¤È¤Ã¤¿¤À¡¤»ä¤Î̾ð¤È e-mail ¥¢¥É¥ì¥¹¤È¥×¥Ã¥¸¥§¥¯¥È URL
¤¬¥½¡¼¥¹¥³¡¼¥É¤ª¤è¤ÓÉտ魯¤ë¥É¥Â¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ë¡¤
»ä¤ò¸¶Ãø¼Ô¤È¤·¤Æǧ¤á¤ëµÂ½Ò¤È¤È¤â¤Ë¡¤°Ã»ý¤µ¤ì¤ë¤³¤È¤Ç¤¢¤ë¡£
You may freely use, alter and redistribute this software under the same
liberal terms that apply to Python itself. All I ask is that my name,
e-mail address and the project URL be retained in the source code and
accompanying documentation, with a credit for me as the original author.
»ä¤¬¤³¤Î¥½¥Õ¥È¥¦¥§¥¢¤ò½ñ¤¤¤¿Æ°µ¡¤Ã¡¤
À¤³¦¤Î¥½¥Õ¥È¥¦¥§¥¢Éʼäβþñ¤Ë¾®¤µ¤Ê¹×¸¥¤ò¤¹¤ë¤³¤È¤À¤Ã¤¿¡£
»ä¤Ãô󸽶â¤òÆÀ¤ë¤³¤È¤Ã´üÂÔ¤·¤Ê¤«¤Ã¤¿¡£
(¸å±ç¤ò´¿·Þ¤·¤Ê¤¤¤È¸À¤Ã¤Æ¤¤¤ë¤ï¤±¤Ç¤Ã¤Ê¤¤¤Ç¤¹)
My motive for writing this software was to make a small contribution
to the improvement of software quality in the world; I didn't bargain
on getting any cash. (That's not to say that sponsorship would be
unwelcome.)
¾ÂÃè¤Ë¸þ¤±¤Æ¤Î°ì¤Ä¤Î¼çÃפʷײè¤à TK GUI ¤È IDLE IDE ¤ÎÅý¹ç¤Ç¤¹¡£ ¥Ü¥é¥ó¥Æ¥£¥¢¤ò´¿·Þ¤·¤Þ¤¹¡ª
¤½¤ì°Ê³°¡¤»ä¤Ë¤Ã¥â¥¸¥å¡¼¥ë¤Îµ¡Ç½¤ò³ÈÄ¥¤¹¤ëÂç¤Â¤Ê·×²è¤Ã¤¢¤ê¤Þ¤»¤ó¡£ »ä¤à PyUnit ¤ò½ÃÃè¤ë¸Â¤êñ½ã¤Ë (¤·¤«¤·¡¤½ÃÃè¤ì¤Ã¡¤ ñ½ã¤Ë¤Ê¤ê¤¹¤®¤Ê¤¤¤è¤¦¤Ë¡ª) ÊääƤ¤ޤ·¤¿¡£ ¤Ê¤¼¤Ê¤é¡¤ ¥å°¡¦¥Õ¥¡¥¤¥ëÈæ³Ó¤Ê¤É¤Î¶¦Ä̤Υƥ¹¥Èºî¶È¤Î¤¿¤á¤Î¥Ø¥ë¥Ñ¡¼¡¦¥â¥¸¥å¡¼¥ë¤Ã¡¤ »ä¼«¿È¤è¤ê¤â¥Æ¥¹¥È¤Îºî¼Ô¤Î¤Û¤¦¤¬¤è¤êÎɤ¯½ñ¤±¤ë¤È¿®¤º¤ë¤«¤é¤Ç¤¹¡£
¥Ë¥å¡¼¥¹¡¤¥¢¥Ã¥×¥Ç¡¼¥È¡¤¤½¤Î¾¤à ¥×¥Ã¥¸¥§¥¯¥È¤Î¥¦¥§¥Ö¥µ¥¤¥È ¤ÇÆþ¼ê¤Ç¤Â¤Þ¤¹¡£
¥³¥á¥ó¥È¡¤Äó°Æ¡¤¥Ã¥°Êó¹ð¤ò´¿·Þ¤·¤Þ¤¹¡£ ñ½ã¤Ë»ä¤Ë e-mail ¤¹¤ë¤«¡¤¤Þ¤¿¤Ã¡¤¤³¤Ã¤é¤Î¤Û¤¦¤¬¤¤¤Ã¤½¤¦Îɤ¤¤Î¤Ç¤¹¤¬¡¤ Èó¾ï¤ËÄãήÎ̤Î ¥á¡¼¥ê¥ó¥°¡¦¥ê¥¹¥È ¤ËÆþ¤Ã¤Æ¥³¥á¥ó¥È¤òÅê¹Æ¤·¤Æ¤¯¤À¤µ¤¤¡£ ¶Ã¤¯¤Ù¤Â¿ô¤Î¿Ã¡¹¤¬¤¹¤Ç¤Ë PyUnit ¤ò»È¤Ã¤Æ¤ª¤ê¡¤ Èà ¤é¤Ã¤ß¤Ê¶¦Ã¤¹¤Ù¤ÂÃηäò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£
Python ¸À¸ì¤ËÂä·¤Æ Guido ¤ÈÈà ¤ÎÌçÄï¤Ë¿¤¤¤Ë´¶¼Õ¤·¤Þ¤¹¡£ ´¶¼Õ¤Î°õ¤Ë¡¤¼¡¤Î haiku (¤¢¤ë¤¤¤Ã¡¤ ¤â¤·¤½¤¦¸Æ¤Ó¤¿¤¤¤Ê¤é 'pyku') ¤ò½ñ¤Â¤Þ¤·¤¿¡£
Guido van Rossum
'Gawky Dutchman' gave birth to
Beautiful Python
JUnit ¤Îëºî¤ËÂä·¤Æ Kent Beck ¤È Erich Gamma ¤Î¸ùÀÓ¤ò´î¤ó¤Çǧ¤á¤Þ¤¹¡£ ¤½¤ì¤à PyUnit ¤ÎÀ߷פò¡¤Æ¬Ç¾¤ò¤ï¤º¤é¤ï¤»¤Ê¤¤¤â¤Î¤Ë¤·¤Þ¤·¤¿¡£
Tim Voght ¤Ë¤â´¶¼Õ¤·¤Þ¤¹¡£ »ä¤¬ PyUnit ¤ò¼ÂÃõ¤·¤¿¸å¡¤Èà ¤â¤Þ¤¿ `pyunit' ¥â¥¸¥å¡¼¥ë¤òÈà ¤Î 'PyWiki' ¤È¤¤¤¦ WikiWikiWeb ¥¯¥Ã¡¼¥ó¤Î°ìÉô¤È¤·¤Æ¼ÂÃõ¤·¤Æ¤¤¤¿¤Î¤òȯ¸«¤·¤Þ¤·¤¿¡£ Èà ¤Ã¿ÆÀڤˤ⡤ »ä¤¬¼«Ê¬¤Î¥Ã¡¼¥¸¥ç¥ó¤ò°ìÈÌ¥³¥ß¥å¥Ë¥Æ¥£¤Ë½Ã¤¹¤³¤È¤òµö¤·¤Æ¤¯¤À¤µ¤¤¤Þ¤·¤¿¡£
»ä¤ËÄó°Æ¤È¼ÃÌä¤Î¥á¡¼¥ë¤ò½ñ¤¤¤¿¿Ã¡¹¤Ë¿¤¤¤Ë´¶¼Õ¤·¤Þ¤¹¡£ »ä¤Ã¥À¥¦¥ó¥Ã¡¼¥É¡¦¥Ñ¥Ã¥±¡¼¥¸¤Î CHANGES ¥Õ¥¡¥¤¥ë¤ËŬÀڤʥ¯¥ì¥¸¥Ã¥È¤ò½ñ¤Â²Ã¤¨¤ë¤è¤¦¤ËÅؤá¤Þ¤·¤¿¡£
¤È¤ê¤ï¤± Jérôme Marant ¤Ë´¶¼Õ¤·¤Þ¤¹¡£ PyUnit ¤ò Debian ÃѤ˥ѥ屡¼¥¸²½¤·¤Æ¤¯¤À¤µ¤¤¤Þ¤·¤¿¡£
Steve Purcell is just a programmer at heart, working independently writing, applying and teaching Open Source software.
He recently acted as Technical Director for a Web/WAP start-up, but spends most of his time architecting and coding large Java systems whilst counterproductively urging his Java-skilled colleagues to take up Python instead.