読者です 読者をやめる 読者になる 読者になる

ごらくらいふ

プログラミングしたりゲームしたり

BDDの書き方、始め方が分からなかったので、まず書いた

設計 考え方 プログラミング TypeScript

テストは大事なのは分かる。TDDやBDDでキーワードを手繰って、向き不向きやコンセプトの説明も見た。 けどそればかり拾ってしまって、実際にどう考えたらいいのか、どう書き出せばいいのか全くわからない。

「BDDでプログラミングする」を指針にマルバツゲームを作る。 という流れで、BDDで書き始める過程をメモ。

前提

  • typescriptで
  • コーディング環境は構築済みで
  • mocha+chaiを使って進める

まずは考えたことを捨てないことから

「テストのできるコードってなんだ」というQが頭に浮かんだまま、コードを考えようとしていた。

「盤面は3x3で、先手後手があって、つまりプレイヤーが2人いて、3つ記号が並んだら勝ちで」

自分はこの時、句点がひとつ入るたびに前の言葉が頭から消えている。 考えは連続してしていても次のこと考えるたびに「保存しない」を選択していちゃ意味が無い。

「盤面は3x3で」を意識から捨てない

この、「どうあるのか」考えたことをテストに吐き出していくのがBDDの書き方なのでは、と思ったので書きなぐる。 幅、高さが3の二次元配列を想像したので、そのように書く。

命名も多分このタイミングでしないといけない。

describe("Field", function(){
    let field = new MainApp.Field();

    describe("data", function() {
        it("is array", function () {
            expect(field.data).to.be.a("array");
        });

        it("width 3", function() {
            expect(field.data).to.have.lengthOf(3);
        });
        
        it("has array in data", function () {
            field.data.forEach((element)=>{
                expect(element).to.be.a("array");
            });
        });
        
        it("height 3", function () {
            field.data.forEach((element)=>{
                expect(element).to.have.lengthOf(3);
            });
        });
    });
});
実装

今書いたテストをPassするコードを書いた。

namespace MainApp {
    /**
     * Field
     */
    export class Field {
        data:any[][];
        constructor() {
            this.data = [
                [null, null, null],
                [null, null, null],
                [null, null, null],
            ];
        }
    }
}

なんかテスト通った。謎の感動。

所感

テストコードなんて書かないか、思いのままに実装してから動作確認に雑なものを書く程度だから難しい。 この「思いのまま」をテストコードに言語化するのかー。

リポジトリ

github.com