0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ポエム】チャッピーとpytestと私

0
Posted at

AI万歳。

と熱狂する世界の片隅でAIの助けを借りながら、自習をしてみた記録と感想です。
成果物はGitHubに格納しました。

環境

  • Windows11
  • Python 3.13.12
  • pytest 9.0.2
  • pytest-cov 7.0.0
  • pytest-mock 3.15.1
  • pytest-xdist 3.8.0

背景

エンジニアが自習する際の選択肢の一つとして、
AIに伴走してもらうことがどれくらい有用なのか確かめたい

スタート

伴走のパートナーはChatGPT 5.2です。
最初のプロンプトは以下のように入力しました。

pytestを完全マスターしたいので、学習プランの策定を手伝ってほしいです。
策定にあたって質問があればお願いします。
C#などの他のプログラミング言語でのテストフレームワークの経験はあります。

さっそく、私の「完全マスター」なる曖昧模糊なゴールを分解してくれます。

ゴール定義

  1. 書ける:テスト発見・assert・例外・parametrize・mark・skip/xfail を迷わず使える
  2. 設計できる:fixtureで依存性を整理し、scope/autouse/indirect まで扱える
  3. 運用できる:pytest.ini/pyproject設定、ログ、失敗時の調査、CI、カバレッジ
  4. 拡張できる:よく使うプラグイン(xdist, cov, hypothesis等)と自作conftestの流儀
  5. スケールできる:大規模リポジトリでのテスト分割、実行時間短縮、テストの信頼性

さらに8ステップの学習プランを提案してくれました。曰く、

各ステップで 「読む → 小課題 → 既存プロジェクトへ適用」 の順に回すのが効きます。

気が利きすぎている。アナタは本当に機械ですか。

assertやfixtureは他のテストフレームワークでおなじみなものの、
xfail、xdistとは何ぞや。
よくわからない単語だらけだが、不思議と不安感はない。

その後、いくつか質問され、私の学習期間は4週間プラン(毎日30分)となり、
APIGateway(プロキシ統合)+AWS Lambda+DynamoDB(※本稿の範囲ではモックを利用)が題材となりました。

さて、賛否分かれそうなことが起こりました。
製品コードとテストコードの雛型を提示してくれたのです。

まずい、「完全マスター」のはずが、おんぶに抱っことなっているではないか。

いや、最初の一歩が最も大変だと考えれば、そのハードルをゼロにしてくれている。
これは良いかもしれない。挫折ポイントがすでに取り払われているのだ。
私は流れに身を任せることにしました。(弱い意志)

伴走開始

持ち前の弱い意志で、おすすめされるまま、雛型ファイルを機械的にコピペします。
できあがったのが、以下のフォルダとファイルです。

src/
  handler.py
  service.py
  repo_dynamo.py
tests/
  conftest.py
  events.py
  factories.py
  unit/
    test_service.py
    test_handler.py
  integration/
    test_dynamo_flow.py
pyproject.toml

それではDay1のスタートです。
天邪鬼な私はさっそくプランから外れて、雛型のテストを実行してみることにしました。

python -m pytst

実行結果の画面キャプチャを貼って以下のように尋ねました。

Day1始めます。伴走お願いします。現在、添付画像の状態です。何か気になるポイントはありますか?

カバレッジが出ていないのでこうするといい、と教えてくれました。

python -m pytest --cov=src --cov-report=term-missing

なんということでしょう。Day1を始める前から学びが得られました。
これは良いです。
動画教材でもハンズオンセミナーでも得られないものではないかと少々興奮しました。

さらに、test_handler.pyしか収集されていなさそう、とのことで

python -m pytest -q
python -m pytest --collect-only -q

「--collect-only」で「pytestが何を見つけているか」を特定できる、と教えてくれました。
まだDay1を始めていません(しつこい)
動画教材でもハンズ(略)

さて、Day1メニューです。

Day1メニュー

  1. --collect-only で収集状況チェック
  2. --cov を付けてカバレッジ表示を確認
  3. tests/events.py(APIGW v1)を追加して、handlerテストがそれを使う形に寄せる(すでにできてたらスキップ)

私が良いな、と思ったのは、
メニューに沿って進めるだけでなく、

  • コミュニケーションの合間に任意でこれもしてみては?と控えめにおすすめをしてくれる
  • 「今のコードを貼ってくれれば修正案を提示します」と挫折ポイントをつぶしにきてくれる

修正案を出してもらっては、単なるコピペ作業になってしまうので、
私はしませんでした。
エラーが出た時もあくまで添付するのはエラー画面で、
ソースコードを張るのはレビューしてほしいときだけにしました。
これはご自身の能力や学習スタイルに合わせて決めればよいように思います。

最初はコピペ作業でもよくて、次の日、次の週、次の学習プランでは
少しでも独力の部分を増やせばよいだけです。
AIは文句一つ言わずにいつまでも付き合ってくれます。

そうこうしているうちにあっという間に最終日のDay28が完了しました。
ノリがいい日は熱中して複数日分実施してしまい、気づいたら24時過ぎているなんてこともありました。
(上述のGitHubに入っているのは「本稿執筆時点では」ここまでの成果物です。)

すがすがしい気持ちで

Day28完了

とプロンプトに入力しました。

みなさま、驚くべきことが起こりました。
次の1カ月の学習テーマをA~Eから3つ選んでください、と言うのです。

A. DynamoDB Local で統合テスト1本(motoとの差分を吸収)
B. Hypothesis(property-based testing) を1ケース導入
C. より現実的なE2E(SAM/localstack等は重いので最小に)
D. プラグイン自作の入口(独自marker/オプション追加など)
E. テストの速度改善(fixtures最適化、収集最適化)

伴走はまだ続きそうです。

AI万歳。
ハッピーなエンジニアライフを。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?