Pytestのtmpディレクトリとファイルの使用方法

目次- tmpディレクトリとファイルの使用

  • tmp_path Fixtureメソッド
  • tmp_path_factory Fixtureメソッド
  • tmpdir Fixtureメソッド
  • tmpdir_factory Fixtureメソッド
  • デフォルトのテンポラリディレクトリルート

戻る: Pytest公式チュートリアル

tmpディレクトリとファイルの使用

tmp_path Fixtureメソッド

3.9バージョンで追加された機能 tmp_pathは、テストの実行に使用する独立したテンポラリディレクトリをテンポラリディレクトリのルート内に作成するために使用できます。

tmp_pathpathlib/pathlib2.Pathオブジェクトです。以下はテストでの使用例です:

# test_tmp_path.pyファイルの内容
import os

TEST_CONTENT = "テストコンテンツ"

def test_create_file(tmp_path):
    test_dir = tmp_path / "サブディレクトリ"
    test_dir.mkdir()
    test_file = test_dir / "テスト.txt"
    test_file.write_text(TEST_CONTENT)
    assert test_file.read_text() == TEST_CONTENT
    assert len(list(tmp_path.iterdir())) == 1
    assert 0

このテストを実行すると、assert 0の行を除いて、他のアサーションはすべて正常にパスします:

$ pytest test_tmpdir.py
=========================== テストセッション開始 ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
rootdir: $REGENDOC_TMPDIR, inifile:
1件のテストが収集されました

test_tmpdir.py F                                                     [100%]

================================= 失敗 =================================
_____________________________ test_create_file _____________________________

tmpdir = local('PYTEST_TMPDIR/test_create_file0')

    def test_create_file(tmpdir):
        p = tmpdir.mkdir("sub").join("hello.txt")
        p.write("content")
        assert p.read() == "content"
        assert len(tmpdir.listdir()) == 1
>       assert 0
E       assert 0

test_tmpdir.py:7: AssertionError
========================= 0.12秒で1件の失敗 ==========================

tmp_path_factory Fixtureメソッド

2.8バージョンで追加された機能 tmpdir_factoryはセッションスコープのfixtureで、他のテストケースやfixtureから任意のテンポラリディレクトリを作成するために使用できます。

例えば、テストスイートがローカルディスク上に動的に生成された大きな画像ファイルを使用する必要がある場合、各テストケースで個別に計算して生成する代わりに、テストセッション全体で一度だけ生成して時間を節約できます:

# conftest.pyファイルの内容
import pytest


@pytest.fixture(scope="session")
def large_image_file(tmpdir_factory):
    generated_image = create_expensive_image()
    file_name = tmpdir_factory.mktemp("data").join("image.png")
    generated_image.save(str(file_name))
    return file_name


# test_image.pyの内容
def test_image_analysis(large_image_file):
    loaded_image = load_image(large_image_file)
    # ヒストグラムの計算とテスト

詳細についてはtmpdir_factory APIを参照してください。

tmpdir Fixtureメソッド

tmpdir_factory Fixtureメソッド

デフォルトのテンポラリディレクトリルート

デフォルトでは、テンポラリディレクトリはシステムのテンポラリディレクトリのサブディレクトリとして作成されます。ベース名はpytest-数字になります。数字は各テスト実行ごとに増加します。さらに、3番目以降のテンポラリディレクトリは削除されます。

デフォルトのテンポラリディレクトリ設定は以下のように変更できます:

pytest --basetemp=mydir

ローカルマシンでテストを分散実行する場合、pytestはサブプロセスのテンポラリディレクトリルートを設定し、すべてのテンポラリデータが単一のテスト実行ごとのテンポラリディレクトリルートに配置されるようにします。

タグ: pytest testing temporary-files fixtures pathlib

7月20日 17:41 投稿