Edited at

Python 3 標準の unittest でテストを書く際のディレクトリ構成

Python 3 でテストを書く際に pytest がよく使われているというのは耳にしたものの、とりあえず標準である unittest で書いてみるか、と思って試行錯誤したのでまとめる。


ディレクトリ構成とコード例

いくつかのパッケージの構成を見た限りでは、パッケージのディレクトリと同じ階層にテストディレクトリを作るのがセオリーらしい。

$ tree

.
├── foo
│ ├── foo.py
│ ├── :
│ └── xxx.py
└── tests
├── test_foo.py
├── :
└── test_xxx.py


foo/foo.py

class Foo:

def say(self):
return 'foo'



tests/test_foo.py

from unittest import TestCase

from foo.foo import Foo

class TestFoo(TestCase):

def test_say(self):
self.assertEqual(Foo().say(), 'foo')



テスト実行


tests ディレクトリ内のすべてのテストケースを実行する

$ python -m unittest discover tests

unittest では discover サブコマンド を使うことでディレクトリ内のテストをまとめて実行することができる。

デフォルトでは、指定したディレクトリ内の test*.py ファイルをすべて実行するが、オプションで変更することもできる。

サブディレクトリを再帰的に辿ってくれたりはしないらしい。


ひとつのテストケースだけを実行する

$ python -m unittest tests.test_foo

注意点として、直接 $ python tests/test_foo.py のように実行することはできない。Python では実行されたファイルのディレクトリ (/tests) がトップレベルの階層として扱われるため、それより上の階層に遡ってパッケージのファイルを import することができず、エラーになってしまう。