フィクスチャとセットアップ/ティアダウン
共有するテスト状態とリソースの準備にフィクスチャを使います。
「フィクスチャとセットアップ/ティアダウン」は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 == 200autouseフィクスチャー
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 初めての pytest テストを作成する
- フィクスチャとセットアップ/ティアダウン
- パラメーター化とテストカバレッジ
- unittest.mock によるモック