すべてのテストはパスした。それでも、ユーザーはゲームをプレイできなかった

「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