【Python】単体試験 / unittest ~ 基本編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2019/10/02/223658

の続き。

今回は、Python標準 unittest の 基本的な機能をメモする

目次

【1】基本的なテンプレート
【2】出力値の確認
 1)構文
【3】前処理・後処理
 1)前処理:setUp/setUpClass
 2)後処理:tearDown/tearDownClass
 3)サンプル

【1】基本的なテンプレート

import unittest

# from 【対象ファイル】 import 【対象メソッド】
from sample import is_prime

# clsss 【ファイル名】Test(unittest.TestCase):
class SampleTest(unittest.TestCase):

  #   テストを書いていく
  def test_is_prime_yes(self):
    for i in [2, 3, 5, 7, 11, 13, 17, 19]:
      self.assertTrue(is_prime(i))

  # ...

if __name__ == '__main__':
  unittest.main()

【2】出力値の確認

1)構文

# 期待値と同じかどうか
self.assertEqual(【値1】, 【値2】)

# boolean
self.assertTrue(【Boolean値】)
self.assertFalse(【Boolean値】)
# メソッド 説明
1 assertEqual(a, b) a == b
2 assertNotEqual(a, b) a != b
3 assertTrue(a) bool(a) == True
4 assertFalse(a) bool(a) == False
5 assertIs(a, b) a is b
6 assertIsNot(a, b) a is not b
7 assertIsNone(a) a is None
8 assertIsNotNone(a) a is not None
9 assertIn(a, b) a in b
10 assertNotIn(a, b) a not in b
11 assertIsInstance(a, b) is instance(a, b)
12 assertNotIsInstance(a, b) not is instance(a, b)
13 assertRaises(exceptionA) 例外 exceptionA が発生したか

【3】前処理・後処理

* 以下の順序で実行される
 [1] setUpClass
 [2] setUp
 [3] tearDown *[2]に行き、試験項目でループ
 [4] tearDownClass が実行

https://qiita.com/Go-zen-chu/items/ddfe37c00324b1b8941e

1)前処理:setUp/setUpClass

setUp

* 1テストごとの実行前に毎回呼ばれる

setUpClass

* テストクラスの実行前に1回呼ばれる

2)後処理:tearDown/tearDownClass

tearDown

* 1テストごとの実行後に毎回呼ばれる

tearDownClass

* テストクラスの実行前に1回呼ばれる

3)サンプル

import unittest

class DemoTest(unittest.TestCase):
  @classmethod
  def setUpClass(cls):
    print("setUpClass")

  @classmethod
  def tearDownClass(cls):
    print("tearDownClass")

  def setUp(self):
    print("setUp")

  def tearDown(self):
    print("tearDown")

  def test_say_hello_1(self):
    expected = 'Hello World!!'
    actual = say_hello()
    self.assertEqual(expected, actual)

  def test_say_hello_2(self):
    expected = 'Hello Mike!!'
    actual = say_hello('Mike')
    self.assertEqual(expected, actual)

def say_hello(name:str = "World"):
  return f"Hello {name}!!"

if __name__ == '__main__':
  unittest.main()

出力結果

setUpClass
setUp
tearDown
.setUp
tearDown
.tearDownClass

----------------------------------------------------------------------
Ran 2 tests in 0.003s

OK

参考文献

https://code-schools.com/python-unittest/
https://www.python.ambitious-engineer.com/archives/828

関連記事

単体試験 / unittest ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/02/223658
単体試験 / unittest ~ mock編 ~
https://dk521123.hatenablog.com/entry/2021/04/05/165656
単体試験 / unittest ~ あれこれ編 ~
https://dk521123.hatenablog.com/entry/2022/07/30/154233
単体試験 / mox ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/01/19/000000
単体試験 / nose ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/01/20/221014
単体試験 / pytest ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/12/13/224810