21
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SansanAdvent Calendar 2015

Day 21

UWSC を使った自動テスト

Posted at

この記事は Sansanアドベントカレンダー 21日目です。

概要

  • UWSC で自社製 Windows アプリケーションのテストをする
  • この記事では、Windows の メモ帳 の置換機能の自動テストを試してみます

UWSC とは

ざっくりいうと、キー操作などをスクリプトで記述・再生することができます。
詳しくは、↓を参照下さい。
http://www.uwsc.info/

UI 操作の再現ができるので、効率的に UI 操作を伴うテストができます。
(※Window の作りによっては、容易に操作できないアプリケーションもあります)

メモ帳の置換機能をテストしてみる

ABC を入力して、「A1に置換」すると、1BCになっていることを確認する。

Windows のメモ帳

 メモ帳.png
置換ダイアログの UI パーツなど、↑でイメージしておいて下さい。

手順(A1 に置換する)

  • メモ帳を起動する
  • メモ帳に ABC と入力する
  • 置換ダイアログを開く
  • 検索する文字列(N) に、A を入力
  • 置換後の文字列(P) に、1 を入力
  • 全て置換(A) ボタンを押下
  • メモ帳の文字列が、1BC になっていること

UWSC のコード(サンプル)

※ 置換結果の検証だけを目的としているため、メモ帳の終了とかまでは面倒見ていません

notepad_test.uws
メモ帳テスト.起動()
メモ帳テスト.文字入力("ABC")
メモ帳テスト.置換("A", "1")

// 比較
IFB メモ帳テスト.比較("1BC") THEN
    MSGBOX("一致")
ELSE
    MSGBOX("不一致")
ENDIF


CLASS メモ帳テスト

    DIM メモ帳App // メモ帳の Window ID を保持しておく

    PROCEDURE 起動()
        EXEC("notepad.exe")
        メモ帳App =GETID("メモ帳") // ウィンドウタイトルが "メモ帳" のウィンドウID
    FEND

    PROCEDURE 文字入力(文字)
        SENDSTR(メモ帳App, "ABC")
    FEND

    PROCEDURE 置換(検索文字列, 置換文字列)
        置換DLG = 置換ダイアログの表示()
        SCKEY(置換DLG, VK_ALT, VK_N) // 検索する文字列(N)にフォーカスを当てる
        SENDSTR(置換DLG, 検索文字列) // 検索する文字列を入力
        SCKEY(置換DLG, VK_ALT, VK_P) // 置換後の文字列(P)にフォーカスを当てる
        SENDSTR(置換DLG, 置換文字列) // 置換文字列を入力
        SLEEP(1) // デモの便宜上入れた
        CLKITEM(置換DLG, "すべて置換") // [すべて置換]ボタンをクリック
        KBD(VK_ESC) // ダイアログを閉じる
    FEND

    FUNCTION 置換ダイアログの表示()
        // 置換DLGを表示 Alt, E, R
        SCKEY(メモ帳App, VK_ALT, VK_E, VK_R)
        SLEEP(1) // 表示されるまで待つ
        RESULT = GETID(GET_ACTIVE_WIN)
    FEND

    FUNCTION 比較(期待値)
        // クリップボードにテキストを積む(全選択後コピー)
        SCKEY(メモ帳App, VK_CTRL, VK_A)
        SCKEY(メモ帳App, VK_CTRL, VK_C)
        // 比較
        クリップボード文字列 = GETSTR(0)
        RESULT = (クリップボード文字列 = 期待値)
    FEND

ENDCLASS

テストコードを実行する

いろんなやり方があります。

  • UWSC を起動しておいて、読みこみ → ファイル選択 → 再生
  • UWSC を起動しておいて、notepad_test.uws ファイルをドラッグ&ドロップ
  • コマンドラインで、>UWSC notepad_test.uws を実行(パス設定はよしなに…)

自動テストを想定するので、実運用は人手をかけないコマンドラインになるでしょう。

実行結果

成功.png ちゃんと成功しましたね。

試しに、失敗させてみる

上記テストコードを

IFB メモ帳テスト.比較("ABC") THEN

ってして実行すると・・・

失敗.png

ちゃんと失敗しますね。

弊社での導入例

弊社では、Windows 上で動くアプリケーション(← Web アプリケーションではない)もあるので、そのアプリケーションで UWSC を導入した自動テストを実施しています。
今まで人力でテストをしていた部分を、自動で確認できるようになったので、テスト工数の大幅削減&容易な品質維持が可能になりました!

実運用するなら…

  • テスト結果を JUnit 形式で出力する
  • UWSC では FPUT 関数で CSV 形式で出力しておいて、後で別プログラムで XML 形式にコンバートするなど
  • アプリケーションの起動や、ダイアログが表示されるのを SLEEP 関数じゃなくて、状態チェックを行うようにする
  • SLEEP はマシンによっては多すぎるかも知れないし、少なすぎるかも知れない。
  • GETID を一定時間 while で回して、チェック。タイムアウトしたらエラーに。

などの対応が必要になります。(この記事では割愛)

他に UWSC でできること

  • 画像判定(指定した画像が画面内のどこにあるかがわかる)
  • そもそも意図した表示結果になっているかの確認に使える
  • ツールバー上のアイコンや、クリックしたくても指定しづらい場所をクリックするのにも使える
  • スクリーンショット保存
  • テストが失敗したときに、スクリーンショットを保存しておくと、原因特定がしやすい
  • COM オブジェクトの操作
  • ブラウザとか、Excel とかも操作できます。
  • DLL の利用
  • kernel32.dll, user32.dll などの関数も呼び出すことができる
  • → テスト中のアプリケーションのメモリ使用量なんかも取れるかも?

(やったことありますが、この記事では割愛)

言いたいこと

ユニットテストだけではカバーしきれない UI 操作も伴うテストも自動化して、テスト工数を削減して開発効率を向上させよう!

スマホでは!?

同様に自動テストできます!(弊社ではやってます)
↓あたり参考にして頂ければ幸いです。

それではみなさま、良いお年を。。。

21
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?