Python テストのメモ
目次

pytest

例外のテストはこれ

https://docs.pytest.org/en/latest/reference.html#pytest-raises

  • with pytest.raises(RuntimeError) as excinfo:excinfo には、 ExceptionInfo が入ってくる

  • 例外のインスタンスは、 value フィールドに入っている

    with pytest.raises(ListFileError) as e:
        target(list_file).read('201803')
    
    # assert
    assert e.value.line == 2
    

parametrize

unittest.TestCase を継承したテストクラス内では、 @pytest.mark.parametrize を使えない。

pytest.fixture

https://docs.pytest.org/en/latest/fixture.html

Test functions can receive fixture objects by naming them as an input argument. For each argument name, a fixture function with that name provides the fixture object. Fixture functions are registered by marking them with @pytest.fixture.

fixture のスコープと実行順序

https://docs.pytest.org/en/latest/fixture.html#order-higher-scoped-fixtures-are-instantiated-first

  • デフォルトは function

  • autouse=True すると、引数に与えなくても自動で実行される

    • スコープは function

    • 同じスコープのほかの fixture の前にインスタンス化される

Temporary directories and files

http://doc.pytest.org/en/latest/tmpdir.html#the-tmpdir-fixture

  • 一時ディレクトリやファイルの fixture がある

  • こんな感じで使う、便利

# settings fixture 経由で storage の path を pytest の tempdir fixture の path に置き換える
def test_csv(self, target, settings, tmpdir):  # <- settings fixture と tmpdir fixture を受け取る
    settings.MEDIA_ROOT = tmpdir               # ダウンロードファイル出力先を置換

    # ...
    # これで、ファイルのパスがとれる
    p = tmpdir.join(output_file_path)          # <- output_file_path はファイル名とか

pytest-django

https://pytest-django.readthedocs.io/en/latest/index.html

  • pytest-django is a plugin for pytest that provides a set of useful tools for testing Django applications and projects.

  • Django アプリとプロジェクトのテストに便利な pytest のプラグイン

あれこれ

3a スタイル

# arrange
# act
# assert

http://wiki.c2.com/?arrangeactassert (つながらない)

TestPyramid

UI 寄りのテストは、コストと実行時間が長くなってしまうので、いきなり書かない方がいい