Yomiage
メニュー

Python実践講座 19:総合演習・テストとコマンドとしての配布

更新 2026/9/27 6:22:11 公開

投稿者: しゅりりん

到達点は、別の環境でもインストールと検証ができる状態にすることです。前提は第17・18回です。

利用者のデータを使わず検証する

同じフォルダへtest_tasks.pyを保存します。

import unittest
from pathlib import Path
from tempfile import TemporaryDirectory
from tasks import main, load
from domain import Task


class TaskTests(unittest.TestCase):
    def test_model_rejects_invalid_values(self):
        for task_id, title, done in [(True, "復習", False), (1, " ", False), (1, "復習", "false")]:
            with self.subTest(value=(task_id, title, done)):
                with self.assertRaises(ValueError):
                    Task(task_id, title, done)

    def test_persistence_and_failure(self):
        with TemporaryDirectory() as directory:
            path = Path(directory) / "tasks.json"
            prefix = ["--file", str(path)]
            self.assertEqual(main(prefix + ["add", "復習"]), 0)
            self.assertEqual(main(prefix + ["done", "1"]), 0)
            self.assertEqual(main(prefix + ["done", "1"]), 0)
            self.assertTrue(load(path)[0].done)
            before = path.read_bytes()
            self.assertEqual(main(prefix + ["done", "999"]), 1)
            self.assertEqual(path.read_bytes(), before)
            path.write_text("broken", encoding="utf-8")
            self.assertEqual(main(prefix + ["add", "新規"]), 1)
            self.assertEqual(path.read_text(encoding="utf-8"), "broken")


if __name__ == "__main__":
    unittest.main()

python -m unittest -v test_tasks で二つのテストが成功します。途中のエラー表示は、失敗ケースを意図的に試したものです。テスト全体の結果と、試験対象が出したエラーを区別してください。

pyproject.tomlを用意する

次を同じフォルダへ保存します。配布名は実習用で、公開レジストリへのアップロードは行いません。

[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"

[project]
name = "yomiage-study-tasks"
version = "0.1.0"
requires-python = ">=3.11"
description = "Local task CLI for a programming exercise"

[project.scripts]
study-tasks = "tasks:main"

[tool.setuptools]
py-modules = ["tasks", "domain"]

専用の仮想環境で python -m pip install -e . を実行します。study-tasks --help で操作説明を表示できます。環境を有効化していない場合は .venv/bin/study-tasks、Windowsなら対応するScripts内の実行ファイルを使います。編集可能インストールは開発時に便利で、配布時にはwheelをビルドして新しい環境でも確認します。

練習と解答

練習:Pythonプロセスとしての終了コードまで確かめるには何が必要でしょうか。

解答:subprocess.runでCLIを別プロセスとして起動し、returncode、stdout、stderrを確認します。mainの戻り値の単体テストだけでは、入口がSystemExitへ正しく渡しているかまでは証明しません。第18回のmainガードも含めて検証します。

公式資料

パッケージ作成ガイドを参照できます。


Python全20回の目次 | 前の回 | 次の回

このブラウザでは Web Speech API が利用できません。

1 / 17 · 停止中