Help us understand the problem. What is going on with this article?

Pythonでunittestを実行する(初心者用)

More than 3 years have passed since last update.

はじめに

Pythonを初めて使ったときに、unittestを使うまでに苦戦したので、スムーズに使えるための記事です。
しかもPythonの基本を理解していないと使い始めるのも難しいためまとめました。
※動作確認はPython2.7で行いました。

上手く実行できるディレクトリ構成は以下。

.
├─sample.py
└─tests
  ├─__init__.py
  └─test_sample.py

サンプルソース

sample.py
def add(x, y):
    return x + y
test_sample.py
import unittest
import sample

class TestSample(unittest.TestCase):
    def test_add(self):
        self.assertEqual(sample.add(1, 2), 3)

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

テストの実行方法

python -m unittest tests.test_sample
とunittestのスクリプトで実行する

学んだこと

上記の方法で上手くテストが実行できるのですが、以下の点を学びました。

__init__.py って何?と思いましたが、このファイルがあるディレクトリはpythonのパッケージとして扱われるようです。そのためsample.pyがあるディレクトリから実行コマンドで、「tests.test_sample」の「tests.」でパッケージを指定して実行できるようです。

※Python2.7では__init__.pyがないとパッケージと認識してくれなかったので必要なのですが、Python3.5ではなくてもパッケージと認識されるため不要です。

またtest_sample.pyでimportをしているのですが、importの検索パスは、色々ありますが、実行パスがその一つ。sample.pyがあるディレクトリから実行することで「import sample」でimportできるようです。

実験

学んだことを実感するために以下の実験を行っています。

python tests\test_sample.py
で実行してみる。

Traceback (most recent call last):
  File "tests\test_sample.py", line 2, in <module>
    import sample
ImportError: No module named sample

sample moduleが見つからないとのエラー。実行パスは、testsディレクトになっているようで、その一つ上の階層にいるsampleは見つからないようです。

しかしtest_sample.pyをsample.pyのディレクトリと同じ階層に置いて、
python test_sample.py
を実行すると正しく動きます。
python -m unittest test_sample
こちらでも正しく動きます。

ディレクトリ構成をもとに戻してから、__init__.py ファイルを削除して
python -m unittest tests.test_sample
を実行すると
ImportError: No module named tests
のエラー。パッケージとして認識されないようです。

最後に、testsディレクトリに移動して、
python test_sample.py
を実行すると
ImportError: No module named sample
のエラー。
python -m unittest test_sample
でも同じエラーです。つまり実行ディレクトリにsampleがないからimportできないことになります。

感想

pythonでunittestを使おうとしただけなのに、パッケージの指定の仕方やimportできるディレクトリの考え方など学ぶことがとてもたくさんありました。簡単にできなかったことから学びが多かったです。これで今後のpythonのプログラミングもスムーズに行ける気がします。

合わせて読みたい

Pythonのunittestでまとめてテストを実行する方法

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away