Loading [MathJax]/extensions/tex2jax.js

2021年11月28日日曜日

自動テストの練習8 (Autoit編①) 

 


やりたいこと

今回からはAutoItというアプリケーションを使って、UWPアプリの自動テストの練習をしてみようと思います。

UWSCで行ったことを今度はツールを変更してやってみます。


AutoItとは

Windowsのアプリを自動で操作するためのアプリケーションで、
こちらからダウンロードができます。


インストールすると複数のツールがインストールされます。

使い方を簡単にまとめておきます。


(スクリプトを書いて、実行するまで)
SciTE Script Editorというツールでスクリプトを書きます。

スクリプトを書いたら「Tools」メニュー - 「Go」を選択すると実行できます。


このサンプルだとHello worldのメッセージボックスが表示されます。

(もう一つの実行方法)
SciTE Script EditorでToolメニューからBuildを選択すると、
exeを作ることができます。

exeを実行する方法がもう一つの実行方法となります。

このexeはAutoItがインストールされていない環境でも実行できて、便利です。



2021年11月21日日曜日

自動テストの練習7 (UWSC編⑥) Tips

 


やりたいこと

前回の続きとなります。
UWPアプリの簡単なテスト(スモークテスト?)をUWSCでやってみるの6回目です。

前回で一通り完了したので、テストをブラッシュアップするための便利な小技をまとめておきます。

Print文

標準出力とか、デバック文のような機能です。
デバックしたいときや、処理の結果を表示したい場合に使用できます。

  1. PRINT "成功"  
  2. PRINT "失敗"  

のように書くとUWSCの小窓に文字が表示されます。



PRINTした文字列は、ログファイルとしても記録されるので、後で確認することも可能です。

UWSCを右クリック > 「.INI/.LOG Folder(F)」メニューを選択


フォルダにある 「UWSC.LOG」がログファイル

メモ帳で開くとPRINTしたものが記録されている。


結構便利です。

ログの最大行数はUWSC.iniのLogLinesで定義されてます。


ログファイル

PRINT文でもUWSCの標準のログは残るのですが、
自分専用のログを残したい場合もあると思います。

スクリプトが存在するフォルダに「LogFile.txt」というファイルを作成し、追記していく自作関数を作ってみました。

インプットのstrに日付, 時刻を付与してファイルに出力する関数です。

こちらになります。

  1. // logファイルに書き込む  
  2. PROCEDURE WriteLog(str)  
  3.   
  4.     // 日付作成  
  5.     GETTIME()  
  6.     dateTime =  G_TIME_YY + "/" + G_TIME_MM + "/" + G_TIME_DD + "_" + G_TIME_HH  + ":" + G_TIME_NN + ":" + G_TIME_SS  
  7.   
  8.     // ファイル書き込み  
  9.     fid  = FOPEN("LogFile.txt", F_READ or F_WRITE) // 追記  
  10.     FPUT(fid , dateTime + "<#TAB>" + str)  
  11.     FCLOSE(fid )  
  12. FEND  

ログファイルの中身はこのようになります。



スクリーンショット

自動テストの操作の途中でスクリーンショットに残しておきたいということもあると思います。

UWSCではSAVEIMG()という関数で実現できます。

この関数を用いて、スクリプトが存在するフォルダの直下にIMGというフォルダを作成して、そこに日付をファイル名にしてスクリーンショットを保存していく自作関数を作ってみました。

こちらになります。

  1. // スクリーンショット  
  2. PROCEDURE MySaveImg()  
  3.   
  4.     // 日付作成  
  5.     GETTIME()  
  6.     dateTime = "" + G_TIME_YY + G_TIME_MM + G_TIME_DD + "_" + G_TIME_HH + G_TIME_NN + G_TIME_SS + G_TIME_ZZ  
  7.     filename = "IMG\" + dateTime  
  8.       
  9.     // フォルダ作成  
  10.     Doscmd("mkdir " + "IMG")  
  11.   
  12.     // スクリーンショット  
  13.     SaveImg(filename, """""""""""", 50)  
  14.       
  15. FEND  

SAVEIMG()の最後の引数で指定している50は、圧縮率を表しています。
1が高圧縮、100は低圧縮になります。

このような感じにスクリーンショットができていきます。


各テストの実施前後などに入れておくと、
遡って結果を確認することができて便利です。


スリープ

SLEEP(秒数)

指定した秒数だけスクリプトを一時停止することができます。

タイミングの問題でスクリプトがうまく動作しない場合などに使えます。

UWSCのヘルプ

関数の使い方がわからない場合などは、UWSCのヘルプが軽量で、かつ分かりやすいです。

UWSCを右クリック > Help メニュー 



コントロールの名称を取得

アクセスしたいコントロールの名称を知りたい時が出てくると思います。

(方法1)
UWSCは操作を記録することができるので、記録機能をつかって、目的のコントロールを操作して、記録した操作を保存することで、アクセスしたいコントロールの名称やIDを確認することができます。

(方法2)
GETITEM()という関数を使うことでコントロールの名称を取得することができます。

以下のサンプルは、"ウィンドウタイトル"のところを対象のアプリのウィンドウタイトルに変更すると、GETITEMでコントロールの名称を取得するものとなります。

  1. GID = GETID("ウィンドウタイトル"// ここにコントロールを取得したいウィンドウのタイトルを指定する  
  2. GetItemAll(GID)  
  3.   
  4. PROCEDURE GetItemAll(GID)  
  5.   
  6.     PRINT "ボタン"  
  7.     NUM = GETITEM(GID,ITM_BTN)  
  8.     FOR i = 0 TO (NUM-1)  
  9.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  10.     NEXT  
  11.   
  12.     PRINT "リストボックス、コンボボックス"  
  13.     NUM = GETITEM(GID,ITM_LIST)  
  14.     FOR i = 0 TO (NUM-1)  
  15.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  16.     NEXT  
  17.   
  18.     PRINT "タブコントロール"  
  19.     NUM = GETITEM(GID,ITM_TAB)  
  20.     FOR i = 0 TO (NUM-1)  
  21.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  22.     NEXT  
  23.   
  24.     PRINT "メニュー"  
  25.     NUM = GETITEM(GID,ITM_MENU)  
  26.     FOR i = 0 TO (NUM-1)  
  27.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  28.     NEXT  
  29.   
  30.     PRINT "ツリービュー"  
  31.     NUM = GETITEM(GID,ITM_TREEVEW)  
  32.     FOR i = 0 TO (NUM-1)  
  33.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  34.     NEXT  
  35.   
  36.     PRINT "リストビュー"  
  37.     NUM = GETITEM(GID,ITM_LSTVEW)  
  38.     FOR i = 0 TO (NUM-1)  
  39.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  40.     NEXT  
  41.   
  42.     PRINT "エディットボックス"  
  43.     NUM = GETITEM(GID,ITM_EDIT)  
  44.     FOR i = 0 TO (NUM-1)  
  45.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  46.     NEXT  
  47.   
  48.     PRINT "スタティックコントロール"  
  49.     NUM = GETITEM(GID,ITM_STATIC)  
  50.     FOR i = 0 TO (NUM-1)  
  51.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  52.     NEXT  
  53.   
  54.     PRINT "ステータスバー"  
  55.     NUM = GETITEM(GID,ITM_STATUSBAR)  
  56.     FOR i = 0 TO (NUM-1)  
  57.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  58.     NEXT  
  59.   
  60.     PRINT "ツールバー"  
  61.     NUM = GETITEM(GID,ITM_TOOLBAR)  
  62.     FOR i = 0 TO (NUM-1)  
  63.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  64.     NEXT  
  65.   
  66.     PRINT "アクセシビリティ用インターフェース経由でのクリック可能なオブジェクト"  
  67.     NUM = GETITEM(GID,ITM_ACCCLK)  
  68.     FOR i = 0 TO (NUM-1)  
  69.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  70.     NEXT  
  71.   
  72.     PRINT "アクセシビリティ用インターフェース経由でのテキスト"  
  73.     NUM = GETITEM(GID,ITM_ACCTXT)  
  74.     FOR i = 0 TO (NUM-1)  
  75.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  76.     NEXT  
  77.   
  78. FEND  


まとめ

UWSC編のしめとして、便利な小技をまとめてみました。
ほかにも見つかったら追記していきたいと思います。

UWSC編はいったん終了にして次回からは別の自動化ツールを使って、同じことをしていきたいと思います。

2021年11月7日日曜日

自動テストの練習6 (UWSC編⑤) とじる




やりたいこと

前回の続きになります。

UWPアプリの簡単なテスト(スモークテスト?)をUWSCでやってみるの4回目です。


5回目はとじる(×ボタン)操作を自動化してみます。


最初に設定したテストケースのTC7になります。

IDTestCaseの説明TestCaseの手順出力期待値
TC7終了×ボタンをおす終了する


ソース

ソースコードはこちらになります。

  1. // TC7 終了  
  2. CloseApp()  
  3.   
  4.   
  5. // 終了  
  6. PROCEDURE CloseApp()  
  7.   
  8.     WaitWindowText("memotter""What", 10)  
  9.       
  10.     id = GETID("memotter")  
  11.       
  12.     //①とじるボタンをクリック  
  13.     closebtn = CLKITEM(id, "memotter を閉じる")  
  14.     IF closebtn = TRUE   
  15.         PRINT "OK とじるボタン押下成功"  
  16.     ELSE  
  17.         PRINT "NG とじるボタン押下失敗"     
  18.     ENDIF  
  19.       
  20. FEND  
  21.   
  22.   
  23. // ウィンドウの中のテキストが表示されるのを待つ  
  24. FUNCTION WaitWindowText(WindowTitle, text, timeOut)  
  25.     RESULT = FALSE    
  26.   
  27.     // ウィンドウが表示されるのをtimeOutの時間まで待つ  
  28.     FOR i = 0 TO timeOut  
  29.         //ウィンドウのID取得  
  30.         id = GETID(WindowTitle)  
  31.       
  32.         staticText = GETITEM(id, ITM_STATIC)  
  33.         IF staticText <> 0  
  34.             FOR j = 0 TO staticText -1   
  35.                 n = POS(text, ALL_ITEM_LIST[j])    
  36.                 IFB n >= 1  
  37.                     // PRINT text + "が見つかった"  
  38.                     BREAK 2                       
  39.                 ELSE  
  40.                     // PRINT text + "が見つからない"  
  41.                 ENDIF                 
  42.             NEXT  
  43.         ELSE  
  44.             PRINT "static text なし"  
  45.         ENDIF  
  46.           
  47.         // 1秒待機  
  48.         SLEEP(1)   
  49.     NEXT  
  50.       
  51. FEND  
----

解説


①とじる
標準関数のCLKITEM()でとじるボタンをクリックしてます。
CLKITEM()の第2引数に設定しているとじるボタンのコントロール名は、GetItem()という関数を使って調べました。

GetItem()でウィンドウのコントロールの名前などを調べることができるので、便利です。アイテム名を調べるのに使ったソースはこちらになります。

OS標準の電卓アプリようのサンプルです。電卓の部分を変更するとほかのアプリでも使えます。

  1. GID = GETID("電卓")  
  2. GetItemAll(GID)  
  3.   
  4. PROCEDURE GetItemAll(GID)  
  5.   
  6.     PRINT "ボタン"  
  7.     NUM = GETITEM(GID,ITM_BTN)  
  8.     FOR i = 0 TO (NUM-1)  
  9.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  10.     NEXT  
  11.   
  12.     PRINT "リストボックス、コンボボックス"  
  13.     NUM = GETITEM(GID,ITM_LIST)  
  14.     FOR i = 0 TO (NUM-1)  
  15.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  16.     NEXT  
  17.   
  18.     PRINT "タブコントロール"  
  19.     NUM = GETITEM(GID,ITM_TAB)  
  20.     FOR i = 0 TO (NUM-1)  
  21.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  22.     NEXT  
  23.   
  24.     PRINT "メニュー"  
  25.     NUM = GETITEM(GID,ITM_MENU)  
  26.     FOR i = 0 TO (NUM-1)  
  27.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  28.     NEXT  
  29.   
  30.     PRINT "ツリービュー"  
  31.     NUM = GETITEM(GID,ITM_TREEVEW)  
  32.     FOR i = 0 TO (NUM-1)  
  33.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  34.     NEXT  
  35.   
  36.     PRINT "リストビュー"  
  37.     NUM = GETITEM(GID,ITM_LSTVEW)  
  38.     FOR i = 0 TO (NUM-1)  
  39.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  40.     NEXT  
  41.   
  42.     PRINT "エディットボックス"  
  43.     NUM = GETITEM(GID,ITM_EDIT)  
  44.     FOR i = 0 TO (NUM-1)  
  45.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  46.     NEXT  
  47.   
  48.     PRINT "スタティックコントロール"  
  49.     NUM = GETITEM(GID,ITM_STATIC)  
  50.     FOR i = 0 TO (NUM-1)  
  51.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  52.     NEXT  
  53.   
  54.     PRINT "ステータスバー"  
  55.     NUM = GETITEM(GID,ITM_STATUSBAR)  
  56.     FOR i = 0 TO (NUM-1)  
  57.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  58.     NEXT  
  59.   
  60.     PRINT "ツールバー"  
  61.     NUM = GETITEM(GID,ITM_TOOLBAR)  
  62.     FOR i = 0 TO (NUM-1)  
  63.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  64.     NEXT  
  65.   
  66.     PRINT "アクセシビリティ用インターフェース経由でのクリック可能なオブジェクト"  
  67.     NUM = GETITEM(GID,ITM_ACCCLK)  
  68.     FOR i = 0 TO (NUM-1)  
  69.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  70.     NEXT  
  71.   
  72.     PRINT "アクセシビリティ用インターフェース経由でのテキスト"  
  73.     NUM = GETITEM(GID,ITM_ACCTXT)  
  74.     FOR i = 0 TO (NUM-1)  
  75.         PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]  
  76.     NEXT  
  77.   
  78. FEND  

結果

アプリを閉じることができました。

これで一応やりたいことが全部できました。

スクリーンショットをとるなどもうすこしブラッシュアップしていきたいので、