すべてのテストはパスした。それでも、ユーザーはゲームをプレイできなかった
「APIは200 OKを返している!」
エンジニアとしての最初の仕事に就いたとき、私は重大な問題を目にした。シニアたちはダッシュボードを好んでいた。高いコードカバレッジを好んでいた。テストがグリーンであれば、製品は動作していると考えていたのだ。
彼らは間違っていた。
コードが動作することと、人間が必要なものを得られることは別物だ。ボタンが成功コードを返しながら、ユーザーを壊れた画面に取り残してしまうこともある。
私は、アプリを実行することなく、こうしたUXの行き止まり(dead-ends)を見つける方法を構築した。私はこれを「2エージェント・スタティック・ウォークスルー(two-agent static walkthrough)」と呼んでいる。これは、2つのAIエージェントがループ内で対話する仕組みだ。
- エージェントAはユーザーだ。このエージェントには特定の目的がある。粘り強く、一度の失敗で諦めない。異なる経路を試行し続ける。
- エージェントBはアプリだ。実際のソースコードへの読み取り権限を持っている。ユーザーのあらゆるアクションに対してコードパスを追跡する。コードが実際に行っていることを正確に報告する。ファイル名と行番号を引用する。コードに存在しないことを想像することはない。
壊れたAIミニゲームジェネレーターでテストを行った。結果は以下の通りだ:
ターン1:ボタンの失敗。 ユーザーが「Generate」をクリックした。コードは新しいエンドポイントではなく、古くて機能していないエンドポイントにリクエストを送っていた。古いAPIはまだ動作していたため、テストはパスしてしまった。
ターン2:クリックできない空白。 ユーザーは結果をクリックしようとした。コードはテキストをただのボックス内に配置しており、クリックハンドラーがなかった。何も起こらなかった。
ターン3:偽りの祝福。 ユーザーはエラーを修正しようとした。IDが不足していたため、バックエンドが失敗した。システムは停止していたにもかかわらず、画面には緑色の成功メッセージが表示された。
ターン4:途切れた希望。 ユーザーはコードを手動でコピーしようとした。APIがテキストを途中で切り捨ててしまった。コードは壊れていた。
ユーザーは離脱した。
ほとんどのユニットテストは、エンドポイントが200を返すかどうかしか確認しない。ユーザーが実際に目的を達成できるかどうかは確認しないのだ。
活用方法:
- ユーザーエージェントを粘り強くさせること。本物のバグは、最初の失敗の裏に隠れている。
- アプリエージェントを実際のコードに基づかせること。これにより、ロールプレイが本物のバグ報告へと変わる。
- テストの補完としてこれを使用すること。ロジックが現実に直面する際のギャップを見つけ出してくれる。
この手法は静的でコストがかからない。テストフィクスチャを一つも書く前に実行できる。「コードは動く」を「ユーザーが成功する」へと変えるのだ。
Source: https://dev.to/terum/every-test-passed-the-user-still-couldnt-play-the-game-388o
Optional learning community: https://t.me/GyaanSetuAi
