Pythonã§unittestã䜿çšããŠãŠããããã¹ãã宿œãã
ã³ãŒãã®å質ãé«ããããã«ããŠããããã¹ãïŒåäœãã¹ãïŒã宿œããããšã¯éåžžã«éèŠã§ãã ãŠããããã¹ãã¯ããã°ã©ã ãæ§æããå°ããªåäœã®åäœæ€èšŒãç®çãšããŠå®æœãããéåžžã¯é¢æ°ãã¡ãœããåäœã§èšè¿°ã宿œãããŸãã ãŠããããã¹ãã«ã¯xUnitãªã©ãã¹ããã¬ãŒã ã¯ãŒã¯ãå©çšããããšãäžè¬çã§ããæ¬çš¿ã§ã¯Pythonã«ããããã¹ããã¬ãŒã ã¯ãŒã¯ã§ãããunittestãã®å©ç𿹿³ãã玹ä»ããŸãããã¹ãé§åéçºã浞éãããŠããããã¹ãã¯ã³ãŒãã®å質ãé«ããããã«ãšãŠãéèŠèŠãããŠããŸãã
ãŠããããã¹ããšã¯äœãªã®ããçè§£ããPythonã§ãŠããããã¹ãã宿œããããã«ããã¹ããã¬ãŒã ã¯ãŒã¯ã§ããunittestã®äœ¿ãæ¹ã解説ããŠãããŸãã
ãŠããããã¹ãïŒåäœãã¹ãïŒãšã¯äœã
ãŠããããã¹ãïŒåäœãã¹ãïŒãšã¯ããœãããŠã§ã¢éçºã«ãããŠã¢ããªã±ãŒã·ã§ã³ãæ§æããåã ã®ãŠããããã³ã³ããŒãã³ããæåŸ éãã«åäœããŠãããã©ããã確èªããããã«è¡ããã¹ãã§ãã
ãŠããããšã¯ã¢ããªã±ãŒã·ã§ã³ã®äžã§ãã¹ãå¯èœãªæå°ã®éšåã®ããšã§ãå€ãã®å Žåããã¯é¢æ°ãã¡ãœãããšãã£ãåäœãšãªããŸãã
ãŠããããã¹ãã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ®ãã®éšåãããã¹ã察象ãåé¢ããŠãäžã€ã®ãŠãããã ãããã¹ãããããã«èšèšãããŸãã
ãŠããããã¹ãã¯éçºè
ã«ãã£ãŠæžãããããšãå€ããã³ãŒãããã®èŠä»¶ãæºãããåŠçãæ£ããè¡ãããŠããããšãä¿èšŒããããã«æžãããŸãã
å
·äœçã«ã¯ãã¹ãã±ãŒã¹ãçšæãããŠãããããåºåãããå€ãæåŸ
ããããã®ãšäžèŽããããã¢ãµãŒã·ã§ã³ïŒæºããããã¹ãå€ã®èšè¿°ïŒã«ãã£ãŠãã§ãã¯ããŸãã
ãŠããããã¹ãã«ã¯ä»¥äžã®ãããªç¹åŸŽããããŸãã
- ãŠããããã¹ãã¯ã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåããåé¢ããç¶æ ã§ãåäžã®ãŠãããããã¹ãããããã«èšèšãããŸãããã®ãŠãããã«äŸåé¢ä¿ããã£ããå€éšãªãœãŒã¹ãå¿ èŠãªå Žåã«ã¯ã¢ãã¯ãã¹ã¿ãã䜿çšããŸãã
- ãŠããããã¹ãã¯ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãç¶ç¶çããªããªãŒïŒCI/CDïŒã®äžéšãšããŠãç°¡åãã€è¿ éã«å®è¡ã§ããããã«çµã¿èŸŒãŸããããšãå€ãã§ãã
- ãŠããããã¹ãã¯ç¹°ãè¿ãå®è¡ããããšãå¯èœã§ãããå®è¡ãããç°å¢ã«é¢ä¿ãªããå®è¡ããããã³ã«åãçµæãçæããå¿ èŠããããŸãã
- ãŠããããã¹ãã¯ãã¹ã察象ã®ãŠããããå ç¢ã§ãããæ§ã ãªå ¥åãç¶æ³ã«å¯Ÿå¿ã§ããããšãä¿èšŒããå¿ èŠããããŸãããã®ããã«å šãŠã®ã·ããªãªãšãšããžã±ãŒã¹ãã«ããŒããããšãæãŸããã§ãã
ãŠããããã¹ããè¡ãã¡ãªãã
ãŠããããã¹ããè¡ãããšã«ã¯ä»¥äžã®ãããªã¡ãªããããããŸãã
- åé¡ã®æ©æçºèŠïŒãŠããããã¹ãã¯éçºããã»ã¹ã®æ©ã段éã§äžå ·åããšã©ãŒãæ€åºããããšãã§ããŸããç¹ã«ãã¹ãé§åéçºã宿œããŠããå Žåã«ã¯ãå®éã®ã³ãŒãå®è£ ã®åã«ãã¹ããæžããããããéçºè ã¯æ©æã«å®è£ ã®åé¡ãçºèŠããããšãã§ããŸãã
- éçºæéã®ççž®ïŒãã¹ãã³ãŒããæžãå¿ èŠããããããéçºè ã«ãšã£ãŠãã®åã®å·¥æ°ã¯å¢ãããããããŸãããããããŠããããã¹ããå°å ¥ããããšã§ãéçºè ã¯ã³ãŒãã®åé¡ãçŽ æ©ãç¹å®ã»ä¿®æ£ã§ããããã«ãªããŸããããã«ããŠããããã¹ãã¯ãªã°ã¬ãã·ã§ã³ïŒåŸæ»ãïŒã®çºçãé²ãã®ã«ã圹ç«ã¡ãç·åçã«ã¯éçºã®ã¹ããŒãã¢ãããæåŸ ã§ããŸãã
- ã³ãŒãã®ä¿å®æ§ãé«ããïŒãŠããããã¹ããæèãããšã¢ããªã±ãŒã·ã§ã³ãããå°ããªã³ã³ããŒãã³ãã«åè§£ããããšãã§ããŸãããŠããããã¹ãã¯åã³ã³ããŒãã³ããé©åã«æ©èœããŠããããšã確èªããã®ã«åœ¹ç«ã¡ãé·æçã«ã¢ããªã±ãŒã·ã§ã³ãä¿å®ããããšã容æã«ãªããŸãã
Pythonã§ãŠããããã¹ããè¡ãã«ã¯
ã§ã¯ãPythonã§ãŠããããã¹ããè¡ãæ¹æ³ã解説ããŸãã
Pythonã«ã¯ãunittestããšããçµã¿èŸŒã¿ãã¹ããã¬ãŒã ã¯ãŒã¯ãååšããŸããunittestã¯ã³ãŒãã®æ©èœããã¹ãããæåŸ
éãã«åäœããããšã確èªããããã®ãã¹ããã£ã¹ã«ããªããã¹ããã£ã¯ã¹ãã£ãã¢ãµãŒã·ã§ã³ãšãã£ãããŒã«çŸ€ãæäŸããŠããŸãã
unittestã¯Pythonã®éçºã§åºã䜿ãããŠããã人æ°ã®ããPython IDEãšç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ããŒã«ã§ãµããŒããããŠããŸãããŸããpytestãnoseãªã©ã®ä»ã®ãã¹ããã¬ãŒã ã¯ãŒã¯ãšãäºææ§ããããŸãã
unittestã¯Pythonã«æšæºã©ã€ãã©ãªãšããŠçµã¿èŸŒãŸããŠãããããå¥éã€ã³ã¹ããŒã«ããå¿
èŠã¯ãããŸããã
ãŠããããã¹ãã®å®è¡ã¯ã©ã¹ã«ã€ã³ããŒãããã°å©çšå¯èœã§ãã
Pythonã§unittestã䜿çšããæ¹æ³
ããã§ã¯å®éã«Pythonã§unittestã䜿çšããŠã¿ãŸãããã
unittestã®åºæ¬çãªèšè¿°æ¹æ³
Pythonã«ãããunittestã®åºæ¬çãªèšè¿°æ¹æ³ã«ã€ããŠã§ãã
ããã§ã¯my_moduleå
ã®my_functionãšãã颿°ããã¹ããããšä»®å®ããŠããŸãã
ãŸããunittestã¢ãžã¥ãŒã«ãšãã¹ã察象ãšãããã¢ãžã¥ãŒã«ãã€ã³ããŒãããŸãã
import unittest
from my_module import my_function
ç¶ããŠunittest.TestCase ã¯ã©ã¹ãç¶æ¿ãããã¹ãã¯ã©ã¹ãäœæããŸãã
ãã®ã¯ã©ã¹ã«ã¯æ©èœããã§ãã¯ããããã®ãã¹ãã¡ãœãããå«ãŸããŸãã
ãã¹ãã¡ãœããã¯ã"test" ãšããåèªã§å§ãŸãå¿
èŠããããŸãã
ã¢ãµãŒã·ã§ã³ã䜿çšãããšãã³ãŒãã®åºåãæåŸ
éãã®ãã®ã§ãããã©ããã確èªããããšãã§ããŸããassertEqual() ã¡ãœããã¯ã2 ã€ã®å€ãçãããã©ããã調ã¹ãããã«äœ¿çšããŸãã
class MyTest(unittest.TestCase):
def test_my_function(self):
result = my_function(2)
self.assertEqual(result, 4)
unittest.main() ã¡ãœããã䜿çšããŠãã¹ããã¡ã€ã«ãå®è¡ããŸããããã«ããããã¹ãã¯ã©ã¹å ã®ãã¹ãŠã®ãã¹ããå®è¡ãããŸãã
if __name__ == '__main__':
unittest.main()
ãããŸã§ã®å 容ããŸãšãããšä»¥äžã®åœ¢ã«ãªããŸãã
import unittest
from my_module import my_function
class MyTest(unittest.TestCase):
def test_my_function(self):
result = my_function(2)
self.assertEqual(result, 4)
if __name__ == '__main__':
unittest.main()
ãã¹ãã¯å®è¡ãããšæåããã倱æãããã瀺ãåºåã衚瀺ãããŸãããã¹ãã倱æããå Žåã¯ããã®ãšã©ãŒã¡ãã»ãŒãžããåé¡ããããã°ããããšã«ãªããŸãã
Pythonã«ãããunittestã®å®è£ äŸ
ããå°ãå ·äœçã«unittestã䜿çšããäŸã瀺ããŸãã
import unittest
# ãã¹ã察象ã®ã³ãŒã
def add(a, b):
return a + b
# ãã¹ãã¯ã©ã¹
class TestAddFunction(unittest.TestCase):
def test_add_integers(self):
result = add(2, 3)
self.assertEqual(result, 5)
def test_add_floats(self):
result = add(2.5, 3.5)
self.assertAlmostEqual(result, 6.0, places=2)
def test_add_strings(self):
result = add("Hello, ", "world!")
self.assertEqual(result, "Hello, world!")
if __name__ == '__main__':
unittest.main()
ãã®äŸã§ã¯ããŸã2ã€ã®æ°å€ãè¶³ãããã2 ã€ã®æååãé£çµãããããåçŽãª add 颿°ãäœæããŸããããããŠunittest.TestCaseãç¶æ¿ãããã¹ãã¯ã©ã¹TestAddFunctionãäœæãã test_add_integers, test_add_floats, test_add_strings ãšããäžã€ã®ãã¹ãã¡ãœãããå®çŸ©ããŠããŸãã
åãã¹ãã¡ãœããã§ã¯ç°ãªãåŒæ°ã§add颿°ãåŒã³åºããunittestãæäŸããassertã¡ãœããã䜿ã£ãŠãçµæãæåŸ éãã®ãã®ã§ããããšããã§ãã¯ããŠããŸãã
assertEqual() ã¡ãœããã¯2ã€ã®å€ãçããããšããã§ãã¯ãã assertAlmostEqual() ã¡ãœããã¯2ã€ã®æµ®åå°æ°ç¹å€ãã»ãŒçããããšããã§ãã¯ããŠããŸãã
æåŸã«unittest.main()ãåŒã³åºãããšã§ãã¹ããå®è¡ããŸãã
ãã®ã³ãŒããå®è¡ãããšãäžèšã®ãããªåºåãåŸãããã¯ãã§ãã
ããã¯ïŒä»¶ã®ãã¹ããå®è¡ãããããã®çµæãOKã§ãã£ãããšã瀺ããŠããŸãã
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
詊ãã«add颿°ã以äžã®ããã«æžãæããŠå®è¡ããŠã¿ãŸãããã
def add(a, b):
return a + b + 1
äžèšã®ãããªåºåã«ãªããŸãã
FFE
======================================================================
ERROR: test_add_strings (__main__.TestAddFunction)
----------------------------------------------------------------------
Traceback (most recent call last):
File "Main.py", line 22, in test_add_strings
result = add("Hello, ", "world!")
File "Main.py", line 8, in add
return a + b + 1
TypeError: can only concatenate str (not "int") to str
======================================================================
FAIL: test_add_floats (__main__.TestAddFunction)
----------------------------------------------------------------------
Traceback (most recent call last):
File "Main.py", line 19, in test_add_floats
self.assertAlmostEqual(result, 6.0, places=2)
AssertionError: 7.0 != 6.0 within 2 places (1.0 difference)
======================================================================
FAIL: test_add_integers (__main__.TestAddFunction)
----------------------------------------------------------------------
Traceback (most recent call last):
File "Main.py", line 15, in test_add_integers
self.assertEqual(result, 5)
AssertionError: 6 != 5
----------------------------------------------------------------------
Ran 3 tests in 0.000s
FAILED (failures=2, errors=1)
ãã¹ãã倱æããŸãããFAILã¯add颿°ããã®è¿ãå€ãã¢ãµãŒã·ã§ã³ã§æåŸ
ããŠãããã®ãšç°ãªãããšã瀺ããŠããŸãã
test_add_strings()ã«ã€ããŠã¯æååãšæ°å€ãé£çµããããšããŠããããåŠçèªäœãERRORãšãªããŸããã
setUp()ãtearDown()ã§ãã¹ãååŸã®åŠçãæžã
unittestã§ã¯setUp()ã䜿çšããããšã§ãã¹ã宿œåã®åŠçããtearDown()ã䜿çšããããšã§ãã¹ãåŸã®åŠçãããããèšè¿°ããããšãã§ããŸãã
import unittest
# ãã¹ã察象ã®ã³ãŒã
def add(a, b):
return a + b
# ãã¹ãã¯ã©ã¹
class TestAddFunction(unittest.TestCase):
def setUp(self):
print("setUP() called.")
def test_add_integers(self):
print("test_add_integers() called.")
result = add(2, 3)
self.assertEqual(result, 5)
def test_add_floats(self):
print("test_add_floats() called.")
result = add(2.5, 3.5)
self.assertAlmostEqual(result, 6.0, places=2)
def test_add_strings(self):
print("test_add_strings() called.")
result = add("Hello, ", "world!")
self.assertEqual(result, "Hello, world!")
def tearDown(self):
print("tearDown() called.")
if __name__ == '__main__':
unittest.main()
ãã®ã³ãŒããå®è¡ãããšãã¹ããæåããäžèšã®åºåãåŸãããŸãã
setUP() called.
test_add_floats() called.
tearDown() called.
setUP() called.
test_add_integers() called.
tearDown() called.
setUP() called.
test_add_strings() called.
tearDown() called.
ããã§èŠããŠãããŠããã ãããã®ã¯ãsetUp()ãštearDown()ã¯åãã¹ãã¡ãœãããå®è¡ãããã¿ã€ãã³ã°ã§å®è¡ãããŠãããšããããšã§ãããã®ããããããã3åãã€åŒã³åºãããŠããŸãã
ãŸãšã
ãã¹ãé§åéçºã浞éãããŠããããã¹ãã宿œããŠã³ãŒãã®å質ãé«ããããšãéåžžã«éèŠèŠãããŠããŸãã
ã³ãŒãã«ååšããåé¡ã«æ©ã段éã§æ°ã¥ãããšãã§ããã³ã³ããŒãã³ãã«åè§£ããããšã§ã³ãŒãã®ä¿å®æ§ãé«ããããšã«ãã€ãªãããŸãã
Pythonã§ãŠããããã¹ãã宿œããã©ã€ãã©ãªãšããŠãæšæºã§çµã¿èŸŒãŸããŠããunittestã人æ°ã§ãã
åºæ¬çã«ã¯ã¢ãµãŒã·ã§ã³ã掻çšããŠãã¡ãœããããæåŸ
ããåºåãåŸããããã確èªããŠãããŸãããããå®éã«ã¯ããè€éãªãã¹ãã宿œãããããšããžã±ãŒã¹ãšåŒã°ããå°ã極端ãªå
¥åããã¹ããããªã©ããŠã³ãŒãã®å質ãé«ããŠããå¿
èŠããããŸãã
ãŸãããŠããããã¹ãã§ã¯ã«ãã¬ããžãéèŠãšãªããŸããå€éšã©ã€ãã©ãªã§ãããcoverageããçµã¿åãããããšã§ããã¹ãã®ã«ãã¬ããžã確èªããããšãå¯èœã§ãã












