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

ささいなことですが。

Windowsアプリテスト自動化ライブラリFriendly開発者の日記です。

Friendly ハンズオン 14-2 テストシナリオ実装

Friendly(Win32, WinForms, WPF)

今回はテストシナリオ実装やってみます。(やっと
これを元に作っていきます。
Ishikawa-Tatsuya/HandsOn14-2 · GitHub

テストシナリオはテストチームの方が書くことを前提としています。若干のプログラム知識とトレーニングで書ける(はず)です。

追加画面のテスト

このクラスは追加画面のテストです。この画面ですね。
f:id:ishikawa-tatsuya:20150425222651p:plain

新しくテストクラスを追加します。
f:id:ishikawa-tatsuya:20150425222211p:plain
f:id:ishikawa-tatsuya:20150425222216p:plain

では、前回作ったTestBaseを継承して、お決まりのコードを書きます。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestScenario
{
    [TestClass]
    public class AddTest : TestBase<AddTest>
    {
        [ClassInitialize]
        public static void ClassInitialize(TestContext c)
        {
            NotifyClassInitialize();
        }

        [ClassCleanup]
        public static void ClassCleanup()
        {
            NotifyClassCleanup();
        }

        [TestInitialize]
        public void TestInitialize()
        {
            NotifyTestInitialize();
        }

        [TestCleanup]
        public void TestCleanup()
        {
            NotifyTestCleanup();
        }
    }
}

正常系

まずは、正常系を書きましょう。前にAppDriverの確認でもちょっと書きましたが、そのままでOKです。
書いたら一回実行してテストが通ることを確認してみてください。

[TestMethod]
public void TestAdd()
{
    var addForm = App.MainForm.ButtonAdd_EmulateClick();
    addForm.TextBoxName.EmulateChangeText("ishikawa-tatsuya");
    addForm.TextBoxAddress.EmulateChangeText("Japan");
    addForm.RadioButtonMan.EmulateCheck();
    addForm.ButtonEntry.EmulateClick();
    Assert.AreEqual("ishikawa-tatsuya(男) Japan", App.MainForm.ListBoxEmployee_GetItemText(0));
}

入力エラー

実はこの画面は、入力が変だとエラーがでます。
基本は以下3パターンです。

f:id:ishikawa-tatsuya:20150426161845p:plain
f:id:ishikawa-tatsuya:20150426161846p:plain
f:id:ishikawa-tatsuya:20150426161847p:plain

で、複数の種類のエラーがあると、上の並びの優先順位でエラーが表示されるというものです。そうすると、以下の組み合わせが考えられますね。こういうの考えるときはExcelが便利だったりします。
f:id:ishikawa-tatsuya:20150426210534p:plain

表形式で表せたら、大体はパラメタライズできます。上のエクセルを使ってやってみましょう。
まずは、上の内容のエクセルをTestScenarioフォルダに作って、ソリューションに取り込みます。エクスプローラ上からD&Dで取り込めます。あ、このエクセルのセルは全部文字列型にしといてくださいね。
f:id:ishikawa-tatsuya:20150426164450p:plain

次にExcelファイルをVisualStuido上で選択し、プロパティーの「出力ディレクトリー」を「新しい場合はコピーする」にします。
f:id:ishikawa-tatsuya:20150426164831p:plain

で、テストシナリオはこれです。ErrorParamのプロパティーはExcelの一行目のカラムと合わせます。

class ErrorParam
{
    public string Name { get; set; }
    public string Address { get; set; }
    public bool Checked { get; set; }
    public string Message { get; set; }
}

[TestMethod]
[DataSource("System.Data.OleDB",
    @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=Params.xlsx; Extended Properties='Excel 12.0;HDR=yes';",
    "AddTest$",
    DataAccessMethod.Sequential
)]     
public void TestError()
{
    var param = GetParam<ErrorParam>();
    var addForm = App.MainForm.ButtonAdd_EmulateClick();
    addForm.TextBoxName.EmulateChangeText(param.Name);
    addForm.TextBoxAddress.EmulateChangeText(param.Address);
    if (param.Checked)
    {
        addForm.RadioButtonMan.EmulateCheck();
    }
    Assert.AreEqual(param.Message, addForm.ButtonEntry_EmulateClickAndGetMessage());
    addForm.Close();
}

テストシナリオは一つで、複数のパラメータの確認ができました。パラメータが多いものだと、一回の実行でも手動テストより低コストでテスト実行できることもあります。(まあ、システムテストではパラメタライズあんまりしなくていいようにテスト設計するべきではありますが)

いかがだったでしょうか?

ちょっと難しい?でもほとんど定型化されているので慣れたら専門職プログラマーでなくても書けます。ポイントはここには内部仕様は出てこないようにすることですね。

このテストシナリオまで書いた状態のサンプルをここにおいておりますので、自分で動かしつつ、検索のテスト追加したりで練習してみてください。
Ishikawa-Tatsuya/HandsOn14-3 · GitHub