Pythonでunittestする

f:id:yoshitaku_jp:20180728144033p:plain

はじめに

Pythonはずっと独学でやってきたのですが、最近はどこに行っても恥ずかしくないようにお作法を学び始めています。 その一つがテストのやり方を抑えておこうというものです。 もちろん普段の業務ではテストしていますが、 個人的にPythonでガチャガチャ遊んでいるプログラムでもテストをやってソースコードをきれいに保ちたいと思いました。 今回はその過程で学んだことをまとめておきます。

Pythonでは最初からユニットテストフレームワークが組み込まれているのでunittestを使います。

26.4. unittest — ユニットテストフレームワーク — Python 3.6.5 ドキュメント

ディレクトリ構成

Pythonでは下記のようなテストディレクトリ構成にするのが一般的なようです。

.
├─dir
│ └─sample.py
└─tests
  └─test_sample.py

作成したプログラムとテスト用プログラムの2つを見ていきます。 しかし、ここで足し算プログラムなどやっても面白くないので、自分が実際に使ったプログラムで見てみます。

#dir/getHtml.pyの中身

def rtnBS(url):
    """
    htmlを引き渡し、bsObjを返す
    """
    html = urllib.request.urlopen(url)
    bsObj = BeautifulSoup(html, "html.parser")
    return bsObj

テスト実行のコマンド

#tests/test_getHtml.pyの中身

import unittest
from bs4 import BeautifulSoup

from dir.getHtml import rtnBS

class TestSample(unittest.TestCase):
    def test_rtnBS(self):
        url = 'https://www.yahoo.co.jp/'
        bsObj = rtnBS(url)
        beautifulsoup = BeautifulSoup()
        self.assertEqual(type(bsObj),type(beautifulsoup))

これはself.assertEqualで、取得したオブジェクトがbeautifulsoupかどうかをチェックしています。

実行する際のコマンドはtests/test_getHtml.pyです。

python -m unittest tests/test_getHtml.py

補足ですがdiscover testsに変更するとtestsディレクトリ配下のすべてのテストを実行できます。多くのテストケースを作った際はこちらに切り替えるべきでしょう

python -m unittest discover tests