0Pricing
Python Academy · レッスン

フィクスチャとセットアップ/ティアダウン

共有するテスト状態とリソースの準備にフィクスチャを使います。

「フィクスチャとセットアップ/ティアダウン」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

フィクスチャとは

フィクスチャは、@pytest.fixtureでデコレートされた、テストに必要な依存関係を提供する関数です。pytestは名前によってフィクスチャを注入します。

import pytest

@pytest.fixture
def user():
    return {"name": "Alice", "age": 30}

def test_name(user):
    assert user["name"] == "Alice"

yieldによるセットアップと後処理

フィクスチャ内でフィクスチャの値をyieldすると、セットアップ(yieldの前)と後処理(yieldの後)を分けられます。

import pytest

@pytest.fixture
def db_connection():
    conn = create_connection()  # setup
    yield conn
    conn.close()                # teardown

def test_query(db_connection):
    result = db_connection.query("SELECT 1")
    assert result is not None

フィクスチャーのスコープ

フィクスチャーが作成される頻度を、scopeで制御できます。指定できる値は、function(デフォルト)、class、module、sessionです。

import pytest

@pytest.fixture(scope="module")
def expensive_resource():
    print("\nSetup once per module")
    yield object()
    print("\nTeardown once per module")

conftest.pyを使ったフィクスチャーの共有

フィクスチャーをconftest.pyに配置すると、インポートせずにテストファイル間で共有できます。

# conftest.py
import pytest

@pytest.fixture
def config():
    return {"env": "test", "debug": True}

# test_app.py
def test_env(config):
    assert config["env"] == "test"

フィクスチャーの依存関係

フィクスチャーは、他のフィクスチャーをパラメーターとして列挙することで依存できます。

import pytest

@pytest.fixture
def base_url():
    return "http://localhost:8000"

@pytest.fixture
def api_client(base_url):
    return Client(base_url)

def test_get(api_client):
    resp = api_client.get("/health")
    assert resp.status_code == 200

autouseフィクスチャー

autouse=Trueを設定すると、パラメーターとして列挙しなくても、スコープ内のすべてのテストにフィクスチャーを適用できます。

import pytest

@pytest.fixture(autouse=True)
def reset_env(monkeypatch):
    monkeypatch.setenv("ENVIRONMENT", "test")

def test_env():
    import os
    assert os.environ["ENVIRONMENT"] == "test"

tmp_pathフィクスチャー

pytestにはtmp_pathという組み込みフィクスチャーがあり、テストごとに新しい一時ディレクトリを提供します。

def test_write_file(tmp_path):
    f = tmp_path / "hello.txt"
    f.write_text("hello")
    assert f.read_text() == "hello"

monkeypatchフィクスチャー

monkeypatchを使うと、テスト中に属性、環境変数、辞書のエントリを一時的に置き換えられます。

def get_env():
    import os
    return os.environ.get("MODE", "prod")

def test_mode(monkeypatch):
    monkeypatch.setenv("MODE", "test")
    assert get_env() == "test"

capsysフィクスチャー

capsysは、テスト中の標準出力と標準エラー出力をキャプチャします。

def greet(name):
    print(f"Hello, {name}!")

def test_greet(capsys):
    greet("Alice")
    out, err = capsys.readouterr()
    assert out == "Hello, Alice!\n"

request.addfinalizerによるフィクスチャーのファイナライザー

yieldの代わりに、request.addfinalizerを使ってクリーンアップを登録できます。

import pytest

@pytest.fixture
def resource(request):
    r = acquire_resource()
    request.addfinalizer(r.release)
    return r

パラメーター化されたフィクスチャー

フィクスチャーでparamsを使うと、依存する各テストをパラメーター値ごとに1回ずつ実行できます。

import pytest

@pytest.fixture(params=["sqlite", "postgres"])
def db(request):
    return create_db(request.param)

def test_insert(db):
    db.insert({"id": 1})
    assert db.count() == 1

クイックチェック

テストセッション全体を通してフィクスチャーを1回だけ作成するスコープはどれですか。

まとめ

フィクスチャーは、yieldを使って再利用可能なセットアップとティアダウンを提供します。scopeで有効期間を制御し、共有にはconftest.pyを、暗黙的な適用にはautouse=Trueを使います。

よくある質問

「フィクスチャとセットアップ/ティアダウン」レッスンは無料ですか?

はい。「フィクスチャとセットアップ/ティアダウン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「フィクスチャとセットアップ/ティアダウン」で何を学びますか?

共有するテスト状態とリソースの準備にフィクスチャを使います。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「フィクスチャとセットアップ/ティアダウン」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 初めての pytest テストを作成する
  2. フィクスチャとセットアップ/ティアダウン
  3. パラメーター化とテストカバレッジ
  4. unittest.mock によるモック
← Python Academyに戻る