1

免責事項 - google/stackoverflow を介してこれに対する回答を見つけようとしましたが、問題を定義する方法がわかりません (適切な用語がわかりません)。

次のような多くの小さな AI スニペットがあります。._ai敵のタイプごとに (以下のような) スニペットがありnext()、メインのゲーム ループで有限ステート マシンによって呼び出される関数が 1 つあります (fyi:next関数は更新の反復ごとに呼び出されるわけではなく、敵が列)。

質問:どのようにすべてのケースをテストし (一部の敵の AI スニペットはより複雑で、1000 ターンに 1 回発生するケースがあることを考慮して)、コードが有効であることを確認するにはどうすればよいですか?

以下の例では、count++ の下に行を追加した場合blabla/1、Javascript インタープリターは特定のパスに到達するまでエラーをキャッチしないため、エラーは長時間トリミングされない可能性があります。blabla/1コンパイルされた言語では、コンパイル時にキャッチされるようなガベージを追加します。

// AI Snippet
this._ai = (function(commands){
    var count = 0;

    return {
        next: function(onDone, goodies, baddies) {

            // If the internal counter reaches
            // 2, launch a super attack and 
            // reset the count
            if(count >= 2) {
                commands.super(onDone);
                count = 0;
            }
            else {
                // If not performing the super attack
                // there is a 50% chance of calling
                // the `attack` command
                if(chance(50)) {
                    var target = goodies[0];
                    commands.attack(onDone, target);
                } 
                // Or a 50% chance of calling the 
                // `charge` command
                else {
                    commands.charge(onDone);
                    count++;
                }
            }
        }
    };
})(this._commands); 

乱数発生器を調整して、値のテーブルを返し、各数値に対して何千回も0-n実行することができます。nextすべてのパスにエラーがないことを具体的に教えてくれるとは思えません。

4

1 に答える 1

1

あなたが言うように、単体テストではすべてのパスをテストする必要があるため、すべてがうまく機能することを確認できます。

ただし、テストでメソッドを呼び出す前に、メソッドがたどるパスを決定できる必要があるため、メソッドの動作が期待どおりかどうか、およびエラーがあるかどうかを知ることができます。

したがって、たとえば、1000 回の実行ごとに 1 回だけたどるパスがある場合、0、1、2 ... 999 のすべてのケースをテストする必要はありません。明確に動作する結果の組み合わせは 1 つだけです。

たとえば、示されているスニペットには、次のケースがあります。

  • カウンターが2になった
  • カウンターが 2 に達しておらず、チャンスが true を返す
  • カウンターが 2 に達しておらず、chance が false を返す

これを達成する 1 つの方法は、それらを嘲笑してカウンターとチャンス メソッドを制御することです。

カウンターが 2 に達し、次のメソッドが呼び出されたときに何が起こるかを知りたい場合は、カウンターに 2 を渡して next を呼び出すだけです。すべてのコードを実際に渡すことによって、カウンターで 2 に到達する必要はありません。

ランダマイザーに関しては、ランダマイザーがテストしたい値を返すまで試す必要はありません。これをモックにして、各ケースで必要に応じて動作するように構成します。

これが役立つことを願っています。

于 2013-08-31T08:49:17.677 に答える