まず、何を正解とするか。
変更してよい範囲と守るべき仕様を区別し、修正前後を同じテストで評価する。
AIを使わない方がよい場面もある
同じ規則を毎回AIに判断させる必要はありません。一度レビューした固定コードとテストで運用します。AIは修正案とレビューを補助し、本番へ自動反映しません。
- 入力は文字列のみ。None・数値・配列はTypeError。
- 前後空白だけを除き、空文字ならValueError。
- ASCII小文字a-zだけを大文字へ。他の文字・内部空白・ハイフンを維持。
- テストを書き換えず、差分と実行結果を確認。
すべて合成教材です。顧客情報・社内資料・認証情報は不要です。機能やデータの取り扱い条件は利用中の契約・組織設定で確認してください。
同じ入力で、試せる。
buggy/normalize_code.py の内容
def normalize_code(value):
# Deliberately incorrect training fixture.
return str(value).strip().upper().replace("-", "")
buggy/test_normalize_code.py の内容
import unittest
from normalize_code import normalize_code
class NormalizeCodeTests(unittest.TestCase):
def test_ascii(self): self.assertEqual(normalize_code("ab"), "AB")
def test_hyphen(self): self.assertEqual(normalize_code("a-01"), "A-01")
def test_trim(self): self.assertEqual(normalize_code(" a-01 "), "A-01")
def test_inner_space(self): self.assertEqual(normalize_code(" a b "), "A B")
def test_japanese(self): self.assertEqual(normalize_code("営業-a"), "営業-A")
def test_non_ascii(self): self.assertEqual(normalize_code("straße"), "STRAßE")
def test_empty(self):
with self.assertRaises(ValueError): normalize_code("")
def test_whitespace(self):
with self.assertRaises(ValueError): normalize_code(" ")
def test_none(self):
with self.assertRaises(TypeError): normalize_code(None)
def test_integer(self):
with self.assertRaises(TypeError): normalize_code(123)
def test_list(self):
with self.assertRaises(TypeError): normalize_code(["a"])
if __name__ == "__main__": unittest.main()
reference/normalize_code.py の内容
def normalize_code(value):
# Normalize only surrounding whitespace and ASCII letter case.
if not isinstance(value, str):
raise TypeError("code must be a string")
value = value.strip()
if not value:
raise ValueError("code must not be empty")
return value.translate(str.maketrans(
"abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
))
reference/test_normalize_code.py の内容
import unittest
from normalize_code import normalize_code
class NormalizeCodeTests(unittest.TestCase):
def test_ascii(self): self.assertEqual(normalize_code("ab"), "AB")
def test_hyphen(self): self.assertEqual(normalize_code("a-01"), "A-01")
def test_trim(self): self.assertEqual(normalize_code(" a-01 "), "A-01")
def test_inner_space(self): self.assertEqual(normalize_code(" a b "), "A B")
def test_japanese(self): self.assertEqual(normalize_code("営業-a"), "営業-A")
def test_non_ascii(self): self.assertEqual(normalize_code("straße"), "STRAßE")
def test_empty(self):
with self.assertRaises(ValueError): normalize_code("")
def test_whitespace(self):
with self.assertRaises(ValueError): normalize_code(" ")
def test_none(self):
with self.assertRaises(TypeError): normalize_code(None)
def test_integer(self):
with self.assertRaises(TypeError): normalize_code(123)
def test_list(self):
with self.assertRaises(TypeError): normalize_code(["a"])
if __name__ == "__main__": unittest.main()
この教材で、手を動かす。
素材・規則を読み、自分の回答を照合して記録します。外部AIの契約や接続は必要ありません。
コードと仕様を読む
素材ZIPを展開してbuggy内のコードとテストを読みます。外部AIへのログインは不要です。実行演習にはPython 3が必要です。
確認:専用フォルダを使い、実プロジェクトや実データを混ぜない。
修正前を実行し、最小差分で直す
buggyフォルダで python -m unittest -v を実行します(Windowsでは py -m unittest -v も利用可)。仕様に沿ってnormalize_code.pyだけを修正します。
確認:テストを書き換えず、ASCII以外の文字も確認する。
実際のテスト結果を照合する
再実行したログからtest_cases・failed・errorsを回答ひな形へ転記し、下の照合を使います。参考解答はreferenceフォルダにあります。
確認:実行できない場合はコードを読む練習に留め、成功件数を作らない。
差分とログを記録する
実行した場合は製品欄をPythonとし、日時・環境・実行コマンドを記録します。読む練習だけなら演習メモで保存します。
確認:期待値ボタンは画面の操作例であり、テスト実行の代わりではない。
AIを使う場合の参考手順・指示文(任意)
専用フォルダへ展開する
演習ZIPを展開し、buggyフォルダとテストを確認します。実プロジェクトや社内リポジトリを開かず、本番資格情報は渡しません。
確認:合成コードと仕様だけで作業。
修正前をテストする
Pythonが利用できる端末でbuggyフォルダへ移動し、Windowsなら py -m unittest -v、ほかは python -m unittest -v を実行します。失敗は想定です。
確認:11件のテスト結果と失敗箇所を記録。
AIに修正範囲を限定して依頼する
利用中の開発支援AIで演習フォルダだけを開き、下の指示を渡します。製品別UIを確認した実環境手順ではありません。テスト変更は許可しません。
確認:指定した範囲以外を変更しない。
自分の環境で再実行する
修正差分を読み、同じテストを再実行。AIの「成功した」という説明だけでは判定しません。新しい依存パッケージも不要です。
確認:11テストと終了コードを記録。
境界条件を説明する
ハイフン、内部空白、ß、空文字、Noneの扱いを説明します。参照実装の成功はAI生成コードの成功の代用ではありません。
確認:守る仕様を説明できる。
指示文
外部AIの利用は任意です。この教材は製品画面の操作や契約ごとの機能を検証したものではありません。利用できる機能がない場合も、上の演習を続けられます。
この画面の使い方
CSV教材の画面で、照合と記録の再開を案内します。画面キャプチャをつないだ無音のスライド動画です。4教材に共通する操作を確認できます。
回答を照合する(28秒・字幕付き)
画面の操作案内 / 収録:2026-09-28 / WF-001 教材1.2。外部AI製品の操作実演ではありません。
- 00秒 回答JSONだけを入力する。
- 07秒 練習には「期待値で操作を試す」を使う。
- 14秒 「期待値と照合する」で一致を確認する。
- 21秒 不一致の項目があれば原文・規則へ戻る。
保存した記録を再開する(28秒・字幕付き)
画面の操作案内 / 収録:2026-09-28 / WF-001 教材1.2。外部AI製品の操作実演ではありません。
- 00秒 回答と実行記録を端末へ保存する。
- 07秒 「保存した記録を確認・再開する」でJSONを選ぶ。
- 14秒 内容を確認する。取り消しても現在の入力は残る。
- 21秒 「この記録で再開する」で入力を戻して再照合する。
教材の操作を準備しています…
「できた」を、別の根拠で確かめる。
回答JSONを教材の期待値と照合
この演習で作成した回答だけを貼り付けてください。外部送信・自動保存はしません。回答は下の実行記録と一緒に保存できます。形式・値の厳密比較であり、自由文の意味やAI一般の能力は判定しません。
期待値を見る
{
"test_cases": 11,
"failed": 0,
"errors": 0
}不一致を、改善の入口にする。
- テストが変更された:元のテストで再評価。
- str(value)にした:型の境界が壊れる。
- upper()で済ませた:非ASCII文字を確認。
- AIが未実行なのに成功と説明:ローカル出力を根拠にする。
実務へ適用する際は、製品・モデル・プラン・実行日・入力・実際の出力を記録します。同じ結果を他の環境で再現できたかは別に確認します。
今回の実行記録を残す
回答・照合結果・学習メモをJSONで保存できます。外部AIを使わない場合は、製品・モデル・プランの記入は不要です。この画面ではサーバーへ送信せず、ブラウザにも自動保存しません。ページを閉じる前に保存してください。氏名は記号でも構いません。
保存した記録を確認・再開する
保存したJSONファイルを選ぶか、内容を貼り付けて確認します。同じ教材・同じ版のみ対応。内容を確認して再開を押すまで、現在の入力は変えません。ファイルは端末内で読み取り、送信しません。
関連する道具
出典・改訂
OpenAI: Codex learning resources ↗
Codexの使い方を学べる公式資料です。当社による操作検証の記録ではありません。 確認記録:2026-09-27
教材作成:2026-09-27。改訂 1.1。教材の確認と外部AI操作を分けて記録します。自習手順・回答ひな形を2026-09-28に追加(回答形式と教材版は維持)。
業務へ組み込む際の判断材料 →