この記事で切り分けられること
pytest を実行して複数件のエラーが出たとき、それがテストコードの不具合なのか、環境側(一時フォルダの権限など)の問題なのかを切り分ける手順をまとめます。「エラー件数を見て何かを壊したと早合点しない」ための確認方法です。
症状
Windows 環境で次のコマンドを実行したところ、一部のテストがエラーで落ちました。
py -3 -m pytest tests/ -q
結果は次の通りでした。
130 passed, 4 skipped, 6 errors
エラーになったのは tmp_path フィクスチャを使っているテスト(test_inquiry_alert 系2件、test_public_release_checks 系4件)で、いずれも同じ例外が出ていました。
PermissionError: [WinError 5] アクセスが拒否されました。: 'C:\Users\<あなたのユーザー名>\AppData\Local\Temp\pytest-of-<あなたのユーザー名>'
原因
pytest は既定で OS の一時フォルダ配下に pytest-of-<ユーザー名> というディレクトリを作り、そこに tmp_path 用のサブフォルダを作成します。このフォルダ自体が読めない(アクセス拒否になる)状態になっていたことが原因でした。
テストのロジック自体には問題がなく、書き込み可能な別の場所を一時フォルダとして渡すとすべて通ることを確認しています。つまりコードを疑う前に、まず環境側の問題かどうかを確認する必要がありました。
直し方
pytest には一時フォルダの場所を指定するオプション --basetemp があります。これを書き込み可能な別の場所に向けて実行します。
py -3 -m pytest tests/ -q --basetemp="C:/Users/<あなたのユーザー名>/AppData/Local/Temp/<あなたの作業用フォルダ>/pytmp"
この指定でエラーが出ていた箇所を含めてすべて通りました。
8 passed
テスト全体を流した場合も、エラーだった6件を含めてすべて通過することを確認しています(実質 139 passed / 4 skipped)。
確認の手順(切り分け方)
エラーが出たときにコードを直す前に、次の順で確認します。
- エラーメッセージに
PermissionErrorやアクセスが拒否されましたが含まれるか確認する - エラーになっているテストが
tmp_pathフィクスチャを使っているか確認する --basetempに書き込み可能な別フォルダを指定して、同じテストを単独で実行する- そこで通れば、テストコードではなく一時フォルダの権限が原因と判断する
落ちたファイルだけを単独で実行すると、原因の切り分けがしやすくなります。
py -3 -m pytest tests/test_inquiry_alert.py -q --basetemp="C:/Users/<あなたのユーザー名>/AppData/Local/Temp/<あなたの作業用フォルダ>/pytmp"
再発防止のための考え方
- 同じ6件のエラーが出ても「何かを壊した」とは読まない。まず
--basetempを付けて通るかどうかを確認する --basetempを付けて通れば、環境側(一時フォルダの権限)の問題であり、テストコードの修正は不要と判断できる- 既存の
pytest-of-<ユーザー名>フォルダを削除するのは本人権限が必要な操作であり、通常の権限では実行できない場合がある
それでも駄目なときに次に見る場所
--basetemp を指定しても同じ PermissionError が出る場合は、指定した先のフォルダ自体に書き込み権限があるかを確認します。
echo test > "C:/Users/<あなたのユーザー名>/AppData/Local/Temp/<あなたの作業用フォルダ>/pytmp/check.txt"
このコマンド自体が失敗する場合は、指定先のフォルダを別の場所に変えて再度試します。
tmp_path を使っていないテストでも同じエラーが出る場合は、一時フォルダ以外の原因(別のファイル書き込み処理など)が絡んでいる可能性があるため、エラーメッセージに出てくるパスがどのフィクスチャ・処理由来かを一つずつ確認します。

Claude Codeとは何か、実際に投げた依頼文と直し方から説明する
Notion API連携の最初の設定をインテグレーション作成から実際に動かす手順
CSVの文字化けと列ずれが止まる場所をPythonのコードで具体的に潰す手順