9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonでユニットテスト書いてみよう-1

Last updated at Posted at 2019-10-17

概要

Pythonのユニットテストの手法について、下記の3つのライブラリを用いて、3回に分けて紹介します。

  1. unittest
  2. doctest
  3. pytest
    初心者向けの内容であり、どのようにユニットテストを実装するか基礎の基礎を紹介します。

今回は、unittestについて紹介します。

UnitTest

公式サイトによると、「unittest は元々 JUnit に触発されたもので、 他の言語の主要なユニットテストフレームワークと同じような感じです。」と書いてあります。Pythonをインストールした時点で利用可能になっているので、第三者のライブラリをインストールする必要がありません。Pythonの環境さえあれば、簡単に検証ができます。

基本的にunittestは、以下の順に書きます

  1. unittestライブラリをインポートする
  2. unittest.TestCaseを継承したクラスを作る
  3. 上記で作ったクラスに、テストケースを記述したメソッドを作る
  4. 上記で作ったメソッドの中にテストケースを書く
  5. unittest.main()でテストを実行する
# 1. unittestのインポート
import unittest

# 2. クラスの作成
class TestXxx(unittest.TestCase):
    # 3. テストケースを記述したメソッド
    def test_xxx(self):
        # 4. テストケースを記入
        self.assertEqual(xxx(2),4)

if __name__ == '__main__':
    # 5. 実行
    unittest.main()

Let's Code

それでは、二つの数字を引数として受け取り、その足し算を返す関数を作り、ユニットテストを実装してみましょう。
足し算する関数を以下のようにしましょう。

def add(x, y):
    '''
    引数として受けた数字を足し算し、
    その結果を返す
    '''
    return x + y

続いて、上で紹介した5つの順に沿ってテストケースを書きましょう。
「add」関数に引数として「2」と「3」を渡した時に「5」が返ってこなければならないの意味を持ったテストケースを書きます。

# ①unittestのインポート
import unittest

# ②unittest.TestCaseを継承したクラスの作成
class TestMyClass(unittest.TestCase):
# ③テストケースを記述したメソッド
    def test_add(self):
        # ④テストケースを記述
        self.assertEqual(add(2,3),5)

# ⑤unittest.main()でテストを実行
if __name__ == '__main__':
    unittest.main()

個人的にはクラスの名前はTestXxxそして、メソッドの名前はtest_xxxにするの好きです。
例えば、Calculatorというテスト対象のクラスがあった場合は以下の名称をつけます。
テストクラス名:TestCalculator
メソッド名:test_add, test_minus, test_product

補足:
上記のテストケースでは、assertEqualを使っていますが、assertNotEqual、assertTrueなど他にたくさんあるので、こちらを見てください。

実行

本来は、テスト対象の関数とテストケースを別々のファイルに書きますが、今回は、基礎を理解する目的ですので、全処理を一つのファイルに記述します。上で書いたコードをまとめますと以下のようになります。


# unittestのインポート
import unittest

def add(x, y):
    '''
    引数として受けた数字を足し算し、
    その結果を返す
    '''
    return x + y

class TestMyClass(unittest.TestCase):
    def test_add(self):
        '''
        上記の「add」関数に対してのテストケースを記述
        '''
        self.assertEqual(add(2,3),5)


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

こちらの内容をtest_sample.pyとして適当な場所に保存してください。そして、タミナルからファイルを保存したフォルダーに移動し、python test_samply.pyを実行してください。

$ python test_sample.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

こちらの出力の意味は、一つのテストケースが成功したという事です。

最後に

テストケースを色々書いて、どのような結果が得られるか見てみて下さい。
また、こちらを参考にassertEqual以外のメソッドを使ってみてください。

続いてdoctestについても書いておりますので、違いを比較してみてください。

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?