PythonでCGIのその3です。
前置きです、
前回のその2ではPythonのCGIで、Web入出力(HTTP)と OS入出力(ファイル)をつないで「Webアプリの基礎」を体験してみました。
Python CGI その2 「名前+ひとこと」をPOSTで受け取りファイル操作と検索を試す
今回はその続きとして——
単体テストという考え方
〜 構造化することで「テストできる」ようになる 〜
を体験します。
プログラムでの新しい機能追加ではなく、
「なぜ処理を分割したのか」「それが何につながるのか」
を整理します。考え方や実務(仕事)にどうつながるかについてです。
また、「構造化」というワードを使いますが、以下でも取り上げました。
構造化プログラミングと構造化設計(Hello World発展編)
🧩 なぜファイルを分けたのか?
ここから本題です。
その2では、次のように処理を分割しました。
post_form.py … CGIの入出力(HTTP / 標準入出力)
data_store.py … ファイル保存・検索などのデータ処理
これは単なる整理ではなく、
構造化設計 の基本的な考え方です。
🔹 構造化=役割を分けること
それぞれの役割は明確です。
| ファイル | 役割 |
|---|---|
| post_form.py | Web(HTTP/CGI)とのやりとり |
| data_store.py | データの保存・検索・取得 |
このように分けることで、
- Webの知識がなくても data_store.py は読める
- CGI以外の用途でも data_store.py を使える
- 修正範囲が限定される
といったメリットが生まれます。
🧪 単体テストが「できる形」になる
構造化の最大のメリットは、
単体テストが可能になることです。
もし分割していなかったら…
- CGIの環境変数が必要
- Webサーバが必要
- POSTデータを偽装する必要がある
結果として、
「ブラウザから動かして確認するだけ」
になりがちです。
分割している場合
data_store.py は 純粋なPythonモジュール なので、
WebやCGIとは無関係にテストできます。
例(単体テストのイメージ):
from data_store import save_message, load_messages
def test_save_and_load():
save_message("nishida", "hello")
data = load_messages()
assert "nishida" in data
- CGI不要
- Webサーバ不要
- Pythonだけで確認可能
これが 単体テスト です。
📄 テスト仕様書・テスト結果という考え方
実務では、次のようなドキュメントを作ることがあります。
🔹 テスト仕様書(例)
| No | テスト内容 | 入力 | 期待結果 |
|---|---|---|---|
| 1 | データ保存 | name="A", msg="test" | ファイルに1行追加 |
| 2 | 検索処理 | name="A" | 該当データのみ表示 |
🔹 テスト結果(例)
| No | 結果 | 備考 |
|---|---|---|
| 1 | OK | 正常 |
| 2 | OK | 正常 |
案件によっては、
このテスト仕様書・結果が納品物となり、
検収対象になることもあります。
🔄 テスト工程は単体テストだけではない
今回は 単体テスト までの説明にしていますが、
実際の開発工程では次の流れがあります。
- 単体テスト
- 結合テスト
- システムテスト
- 受け入れテスト
すべてを毎回やるとは限りませんが、
この流れを知っているかどうか は大きな差になります。
👥 チーム開発・製品開発という視点
- 複数人での開発
- 他人が書いたコードの修正
- 数年後の保守対応
こうした現場では、
- 構造化されていること
- テストできること
- 動作確認の証拠が残っていること
が 品質 になります。
🧠 地味だけど「戦力」と見なされる理由
正直なところ、
- テストは地味
- 面倒
- 楽しい作業ではない
です。
それでも、
- 不具合を再現できる
- 修正の影響範囲を説明できる
- 証跡を残せる
こうしたことができる人は、
現場では「安心して任せられる人」 と評価されます。
📘 今回のまとめ
- 構造化すると単体テストが可能になる
- 単体テストは品質確保の第一歩
- テスト仕様・結果が納品物になる場合もある
- 実務ではテスト工程が重要
- 地味だが、職業としてのプログラミングでは非常に大切
ソースファイル一式は以下のgithubに置きました。
https://github.com/ISYNishida/python-cgi-sample
今回はここまでとします。
またいろいろと書きたいと思います。
ありがとうございます。