メインスクリプトのテスト駆動開発によるコア機能実装(開発日記 No.043)

に公開

関連リンク

はじめに

昨日は、開発プロセスガイドの作成とCI/CDパイプラインの基本構造を構築しました。今日は、pytestのセットアップを基盤に、note-converterプロジェクトのメインスクリプトをテスト駆動開発(TDD)で実装していきます。

背景と目的

note-converterプロジェクトは、Markdown形式のノートを様々な形式に変換するツールです。今回は、その中核となるメインスクリプトの機能を、TDDを用いて堅牢に実装することが目的です。テストを先に書くことで、設計段階から品質を意識し、変更に強いコードを目指します。

検討内容

まずは、メインスクリプトに必要な機能を洗い出しました。コマンドライン引数の処理、ファイルの読み込み、出力ファイルの生成、そしてエラーハンドリングです。これらの機能を一つずつテストケースとして記述し、テストが失敗することを確認してから、実装に取り掛かることにしました。また、今回はDocker環境での開発を徹底するため、Dockerfileとdocker-compose.ymlを整備し、開発環境を構築しました。

実装内容

まず、tests/unit/test_note_converter.pyにテストケースを記述しました。コマンドライン引数のパース、ファイルの読み込み、出力ファイルの生成など、各機能に対応するテストを記述し、pytestを実行してテストが失敗することを確認しました。

次に、scripts/note_converter.pyにメインスクリプトの実装を開始しました。まずは、argparseを使ってコマンドライン引数を処理する部分を実装し、テストが通るように修正しました。次に、ファイルの読み込みと出力ファイルの生成機能を実装し、同様にテストが通るように修正を繰り返しました。

Docker環境でのテスト実行は以下のコマンドで行いました。

# 全テスト実行
docker-compose run --rm test

# ユニットテストのみ実行
docker-compose run --rm test-unit

# 統合テストのみ実行
docker-compose run --rm test-integration

# カバレッジレポート付きテスト実行
docker-compose run --rm test-coverage

最終的に、ユニットテストと統合テストをすべてパスすることができました。カバレッジ率は88%となり、未カバー部分は主にエラーケースやエッジケースでした。

技術的なポイント

TDDのサイクルを回す中で、テストの書き方、モックの使い方、そしてテストしやすいコードの書き方を学びました。特に、argparseのテストは、引数の組み合わせやエラーケースを網羅的にテストする必要があり、苦労しました。また、Docker環境でのテスト実行は、環境構築の手間を省き、再現性の高いテストを実現する上で非常に有効でした。

所感

今回の開発で、TDDの有効性を改めて実感しました。テストを先に書くことで、設計段階から品質を意識することができ、結果として、堅牢で保守性の高いコードを書くことができました。また、Docker環境での開発は、環境構築の手間を省き、開発効率を向上させる上で非常に有効でした。テストがすべて成功したときは、達成感がありました。

今後の課題

今回の開発では、メインスクリプトの基本的な機能のみを実装しました。今後は、markdown_utils.pyのテストと実装、LLM APIとの連携、エラーハンドリングの強化、そしてエッジケースのテスト追加など、更なる機能拡張が必要です。また、カバレッジ率100%を目指し、テストケースを充実させていきたいと考えています。

まとめ

今日は、note-converterプロジェクトのメインスクリプトをTDDで実装しました。Docker環境での開発とテストを徹底し、堅牢で保守性の高いコードを実現することができました。TDDの有効性を改めて実感し、今後の開発にも積極的に活用していきたいと考えています。

GitHubで編集を提案

Discussion