Beyond the State-of-the-Art

最先端を超えたいと思ってる(大嘘)エンジニアのブログ

pytestでassertion用ライブラリassertpyを使ってみる

Qiitaからの移植です。

Pythonのユニットテストで、Python標準のunittestを使わずに、pytestを使うことを考えましょう。つまり、テストコードではunittest.TestCaseを継承したクラスを作りません。この場合、unittestに入っている様々な用途に応じたassertion機能(assertEqual, assertTrue, assertIsNone等)が使えません。

そこで、pythonのunittestを使わずにunittestのようなassertionが行えるようなライブラリを探しました。それで見つけたのが、assertpyです。pipでインストールできます。

assertpyの使用例

公式のドキュメントを参考にして、2つ整数が等しいかどうかのテストを行ってみます。テストコードとして、次のような簡単なものを用意しました。

from assertpy import assert_that


def test_equal():
    expected = 1
    actual = 2
    assert assert_that(actual).is_equal_to(expected)

expectedとactualは等しくないので当然このテストは失敗します。pytestで実行すると、次のような表示が出ます。1

=================================== FAILURES ===================================
__________________________________ test_equal __________________________________

    def test_equal():
        expected = 1
        actual = 2
>    assert assert_that(actual).is_equal_to(expected)

hoge_test.py:7:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/assertpy/assertpy.py:148: in is_equal_to
    self._err('Expected <%s> to be equal to <%s>, but was not.' % (self.val, other))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <assertpy.assertpy.AssertionBuilder object at 0x10382fdd8>
msg = 'Expected <2> to be equal to <1>, but was not.'

    def _err(self, msg):
        """Helper to raise an AssertionError, and optionally prepend custom description."""
        out = '%s%s' % ('[%s] ' % self.description if len(self.description) > 0 else '', msg)
        if self.kind == 'warn':
            print(out)
            return self
        elif self.kind == 'soft':
            global _soft_err
            _soft_err.append(out)
            return self
        else:
>           raise AssertionError(out)
E           AssertionError: Expected <2> to be equal to <1>, but was not.

../.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/assertpy/assertpy.py:950: AssertionError
=========================== 1 failed in 0.08 seconds ===========================

途中で余計な表示?が出てしまっていますが、assertionError時のメッセージは、

AssertionError: Expected <2> to be equal to <1>, but was not.

というように親切なものになっています。

assertpyにはこれの他に沢山のassertion機能がありますので、気になる方は公式ドキュメントを参考にしながら使ってみてください。


  1. 私が使用した環境はMaOS Sierraで、pyenvとanacondaを使ってpython開発環境を構築しています。