【演習】GitHub リポジトリで TDD を実演せよ
- 第 8 回までの授業内容を踏まえて TDD を実演すること.
- GitHub リポジトリ全体が評価対象であり,レポートも兼ねる.
- 提出物は, 提出者自身のユーザアカウント内の公開リポジトリに限定.
- 剽窃や成り済ましは,一発で不可.
- 提出は任意.
実行には uv が必要です。
セットアップ
uv syncテストの実行
uv run python -m tests.main -vアプリケーションの実行例
$ uv run python
>>> from src.main import calculate_rpn
>>> calculate_rpn("5 2 -")
3.
├── README.md
├── docs # 仕様やテストシナリオなどのドキュメント
│ ├── spec.md
│ └── test-plan.md
├── src # 実装本体
│ └── main.py
├── tests # テスト
│ ├── main.py
│ └── test_rpn_calculator.py
├── lefthook.yaml
├── mise.toml
├── pyproject.toml
├── ruff.toml
└── uv.lock
6 directories, 14 files
uv + Python 3.13 を使用している。Formatter/Linter には ruff を使用し、mypy を用いて型チェックを行っている。
また、記述したテストが自動で実行されるように、GitHub Actions を利用して CI を構築している。
Canon TDD を参考に TDD で 逆ポーランド記法電卓を Python で実装した。
以下の順で開発を行なった。
- 仕様の決定
- テストシナリオの作成
- テストケース作成および実装
- リファクタ
それぞれのステップについて詳細に説明する。
逆ポーランド記法で記述された文字列を処理し計算を行う電卓の仕様を、docs/spec.md のように決定した (PR: #2)。
1 で作成した仕様をカバーするために必要なテストシナリオを docs/test-plan.md のように作成した (PR: #2)。
2 で作成したテストシナリオについて、1 つのシナリオに対してテストケースを作成し、それが通らない (RED である) ことを確認したのちテストをパスするように実装を行い、最終的に通る (GREEN である) ことを確認した。
各テストシナリオについて、
の Pull Request で対応した。 各種エラー出力について、一つ一つが細かかったので PR はまとめたが、commit は分けている。
なお、いくつかのテストについてはテストケースを作成する前の実装でカバーできてしまったため、テストが正しく記述できているか (テストの実装不備によりたまたま通ってしまっているのではないか) を確認するため、あえて既存の実装を一度壊して RED であることをチェックしたのち、実装を戻す、ということを行なった。
実装の方法や関数の分離などを行なった (PR: #9)。リファクタを行なった後、テストが通るかを確認し、振る舞いが変わっていないことを確認した。