Pythonのsetuptoolsでテストを実施

Python学習【365日チャレンジ!】187日目のマスターU(@Udemy11)です。

ここ数日釣りに行っていなかったので、どうしても釣りに行きたくなったもののいまいち潮が良くないんだけどな〜と思いつつ、最終的に釣りに行ったのですが、結果は案の定、つるっぱげの丸坊主(1匹も釣れない状態)になっちゃいました。

ほんと潮の流れでこうも変わるものかと改めて実感したわけですが、常夜灯が照らしている水面にはプランクトンがたくさん集まっているようで、豆アジがたくさんいました。

その豆アジも釣ることができないし、少し暗くなった場所でも釣れませんでした。

まー、私の腕がないのも坊主の原因ですが、やっぱり釣りの基本は、

釣れている場所で釣れている釣り方で釣れる魚を釣る

ですね。

それでは、今日もPython学習をはじめましょう。

昨日の復習

昨日は、pytestと同じようにテストができるnoseについて学習しました。

テストの基本的な構造は同じなので、unittestやpytestをマスターしておけば、noseもスムーズに使いこなすことができるということを紹介しました。

基本的にpytestを理解しておけば問題なくテストを実行できますが、クライアントが指定するテストフレームワークを使う必要があるので、プログラマーを仕事にする場合はnoseなども知っておく必要があるでしょう。

noseについては簡単にしか学習しませんでしたが、noseのはじめの一歩として昨日の記事をごらんください。

今日は、setuptoolsでテストを実行する方法を学習します。

jarvisを使う

今回は以前作成した対話アプリJarvisを使って簡単なunittestを実行、配布する方法を学習します。

以前作成したJarvisはこちらの記事を参考にしてください。

setup.py

プログラムをパッケージ化するsetup.pyは、Jarvisを作成した際のものに少し変更を加えます。

from setuptools import setup, find_packages

setup(
    name='jarvis',
    version='1.0.0',
    packages=find_packages(),
    package_data={'jarvis':['templates/*.txt']},
    url='http://udemyfun.com',
    license='Free',
    author='MasterU',
    author_email='master@udemyfun.com',
    description='First package',
    test_suits='tests',
)

パッケージ化するフォルダを勝手に見つけてくれるfind_packagesモジュールを使います。

これで、これから作成するテストファイルフォルダも一緒にパッケージ化してくれます。

テストファイルフォルダは、13行目のtest_suitsで指定しているtestsになり、この名前のフォルダを作成して、そこにテストファイルを作ります。

robot.py

今回は、Jarvisの中のrobot.pyのコードをテストします。

Pythonのsetuptoolsでテストを実施

このモジュールの中のRobotクラスのnameについてテストを書きます。(本来ならテストするまでもないコードですが、簡単に説明するためにテストしています。)

class Robot(object):
    """ベースクラスのロボット"""

    def __init__(self, name=DEFAULT_ROBOT_NAME, user_name=''):
        self.name = name  ←この名前がきちんと代入されるかをテスト
        self.user_name = user_name

パッケージのテストを作成するときは、テストもどのモジュールをテストしているかわかるように、メインのパッケージとテストフォルダの階層を同じにします。

Pythonのsetuptoolsでテストを実施

今回作成するテストファイルは、上記のtest_robot.pyになります。

test_robot.py

テストファイルは、nameがきちんと代入されるかという簡単なテストにしています。

import unittest

from jarvis.models import robot

class TestRobot(unittest.TestCase):

    def test_robot_init(self):
        r = robot.Robot(name='test jarvis')
        self.assertEqual(r.name, 'test jarvis')

robot.pyRobotクラスのnametest jarbisと入れて、それがきちんと入っているかを確認したテストです。

最近のPython学習で、なんとなくテストも理解できてきたので、「普通はこんなテストは書かないんだろうな〜」と思いつつ、このコードを書きました。

setup.pyでテストを実行

ターミナルからsetup.pyでテストを実行するには、下記のコマンドを実行します。

python setup.py test

このコマンドを実行すれば、test_suitsで指定したtestsフォルダに保存されているテスト(test_robot.py)が実行されます。

実行結果

Pythonのsetuptoolsでテストを実施

テストが問題なくクリアしたことがわかります。

次はsdistでパッケージ化してみます。

テストファイルも一緒にパッケージ化

パッケージ化するのは、python setup sdistをターミナルで実行します。

作業プロジェクトフォルダの中にdistフォルダが作られてtar.gzファイルにパッケージが作成されます。

そのファイルを展開するとtestsフォルダもパッケージの中に含まれていることがわかります。

Pythonのsetuptoolsでテストを実施

このように、それぞれのモジュールのテストファイルを作成して、パッケージに含めることでクライアントにテストの実行結果も一緒に渡すことができます。

ただ、メインファイルと同じファイル数だけテストが必要になるので、ほんとプログラムをリリースするのってすごいことなんだなと改めて感じました。

千里の道も一歩からというように、コツコツと小さな一歩を積み上げていこうと思います。

それでは明日もGood Python!