要求レベルのテストの自動化

ユーザーの要求が満たされてることをテストときは、要求を元に開発者やテスターがテスト項目を作成し、画面を操作しながら挙動を目視で確認するのが一般的だと思います。しかし、この方法だと、要求とテスト項目を紐づける手間がかかったり、テストが手動なので回帰テストが大変になります。

そのような状況を解決する技術として、「ユーザーと開発者が要求の記述を共有し、その記述を入力にしてテストプログラムを実行する」ツールが登場しています。これらのツールを使えば、要求レベルのテストが自動化できる訳です。

では、ユーザーと開発者が共有する要求の記述とはどのようなものか見てみましょう。

Feature: 車の燃料の補給
  運転手は、車を走らせるために、燃料を補給する必要がある。

Scenario: 燃料の補給
 Given 車のタンクには、10リットルの燃料が入っている
 When 運転手は、50リットルの燃料を補給した
 Then タンクには、60リットルの燃料が入っている

この記述は、BDDのツールとして有名なCucumberでの要求の記述です。

英単語の「Feature」には機能名と機能の説明、「Scenario」にはシナリオを書きます。「Scenario」の中で、1行づつステップを記述します。ステップの頭文字の「Given」は前提条件、「When」は処理の実行、「Then」は事後条件の意味合いになります。この記述であれば、ユーザーと開発者が共有できる内容だと思います。

次に、テストコードを見てましょう。

public class FuelCarSteps {

    private Car car;

    @Given("^車のタンクには、(\\d*)リットルの燃料が入っている$")
    public void createCar(int initialFuelLevel) {
        car = new Car(initialFuelLevel);
    }

    @When("^運転手は、(\\d*)リットルの燃料を補給した$")
    public void addFuel(int addedFuel) {
        car.addFuel(addedFuel);
    }

    @Then("^タンクには、(\\d*)リットルの燃料が入っている$")
    public void checkBalance(int expectedFuelLevel) {
        int actualFuelLevel = car.getFuelLevel();
        assertThat(actualFuelLevel, is(expectedFuelLevel));
    }	
}

このコードは、CucumberをJavaで実装したCucumber-JVMでのテストコードです(Cucumber自体はRubyで実装されています)。
シナリオのステップごとにメソッドを用意し、中身を実装します。詳しい説明は省略しますが、なんとなく、やってることは伝わるかと思います。また、Seleniumと連携して画面レベルでのテストも可能です。

なお、Cucumber-JVMは、JUnitを使用してるので、テストの実行結果はJUnitの画面で表示されます。

  • 導入時の課題

要求レベルのテストの自動化できれば、手動のテストが無くなるかというと、そうはならないと思います。特に、大事な業務で使用するようなシステムでは、自動化したテストが成功したからそのまま本番リリースというのは想像できません。また、画面の見栄えや使い易さ、帳票の印字チェックなどは、最終的に手動でテストせざるを得ません。

とはいえ、要求レベルのテストの自動化ができれば、回帰テストが充実するし、要求漏れのバグも少なくなるでしょう。現場の状況に合わせて、手動と自動の範囲や棲み分けを明確にすることが大事だと思います。