What is it, naokirin?

JupyterLab で unittest を実行する

最近「仕事ではじめる機械学習」という本をとある方から頂いたのですが、本の最初に「ゼロから作るDeep Learning」などの二冊目として活用してくださいといったことが書かれていました。そもそも機械学習やらに一切触れてきていない(どんなものかをなんとなく知っている程度)だったので、現在「ゼロから作るDeep Learning」に挑戦中です。

で、Docker上でPythonを実行して、サクッと表示見たりする感じでやりたいなということで、JupyterLabを導入しました。その際、unittest 実行したいけど一般的な実行方法だと駄目っぽかったので、少し調べてみました。

JupyterLab というよりは IPython 上で実行したい、というのが趣旨ですね。

Python の unittest の一般的な実行方法

まずは一般的な実行方法から。

import unittest

class TestSample(unittest.TestCase):
    def test_sample(self):
        self.assertEqual(1, 1)

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

上記の方法で IPython 上で実行すると、 AttributeError: module '__main__' has no attribute 〇〇 みたいな感じのエラーで怒られてしまいます。そりゃそうか。

IPython 上で実行する方法について

調べてみたところ、TextTestRunner を明示的に呼び出して実行するのが良さそうでした。

クラス単位か、テストケース毎かも調整できるので楽ですね。

import unittest

class TestSample(unittest.TestCase):
    def test_sample(self):
        self.assertEqual(1, 1)

class TestSample2(unittest.TestCase):
    def test_success(self):
        self.assertEqual(2, 2)

    def test_failure(self):
        self.assertEqual(1, 2)

# TestSuiteインスタンスを作成する
suite = unittest.TestSuite()

# TestCase派生クラスをテストスイートに追加する
suite.addTest(unittest.makeSuite(TestSample))

# テストケース単体をテストスイートに追加する
suite.addTest(TestSample2('test_success'))

# TextTestRunner でテストスイートを実行する
unittest.TextTestRunner().run(suite)

上記だと test_failure() は実行されないので、テストは成功します。

JupyterLab上でもちょいちょいテスト実行したいなって人はこんな感じで書いていくとサクッとテストできて良さそうです!