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  

結果

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

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

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

2021年10月31日日曜日

自動テストの練習5 (UWSC編④) 右クリック




やりたいこと

 前回の続きになります。

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

4回目は右クリックする操作を自動化してみます。


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

IDTestCaseの説明TestCaseの手順出力期待値
TC5Aboutメニュー右クリック
Aboutメニューを選択
Aboutダイアログが表示される
TC6Settingsメニュー右クリック
Settingsメニューを選択
Settingsダイアログが表示される

ソース

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

右クリックするところだけのコードになります。

---
  1. // TC5 About  
  2. CheckAbout()  
  3.   
  4. // About  
  5. PROCEDURE CheckAbout()  
  6.   
  7.     WaitWindowText("memotter""What", 10)  
  8.       
  9.     id = GETID("memotter")  
  10.       
  11.     //①右クリック  
  12.     openbtn = CLKITEM(id, "Open", CLK_RIGHTCLK)  
  13.     IF openbtn = TRUE   
  14.         about = CLKITEM(id, "About")  
  15.         If about = TRUE  
  16.             PRINT "OK About成功"  
  17.             PrintAccText(id)      
  18.                           
  19.             retOkt = CLKITEM(id, "OK")  
  20.         ELSE  
  21.             PRINT "NG About失敗"  
  22.         ENDIF   
  23.     ELSE  
  24.         PRINT "右クリック失敗"   
  25.     ENDIF  
  26.       
  27. FEND  
  28.   
  29.   
  30.   
  31. // ②AccTextを全部出す  
  32. PROCEDURE PrintAccText(id)  
  33.     NUM = GETITEM(id, ITM_ACCTXT)  
  34.   
  35.     FOR j = 0 TO (NUM-1)   
  36.         PRINT ALL_ITEM_LIST[j]  
  37.     NEXT  
  38.   
  39. FEND  
  40.   
  41. // ウィンドウの中のテキストが表示されるのを待つ  
  42. FUNCTION WaitWindowText(WindowTitle, text, timeOut)  
  43.     RESULT = FALSE    
  44.   
  45.     // ウィンドウが表示されるのをtimeOutの時間まで待つ  
  46.     FOR i = 0 TO timeOut  
  47.         //ウィンドウのID取得  
  48.         id = GETID(WindowTitle)  
  49.       
  50.         staticText = GETITEM(id, ITM_STATIC)  
  51.         IF staticText <> 0  
  52.             FOR j = 0 TO staticText -1   
  53.                 n = POS(text, ALL_ITEM_LIST[j])    
  54.                 IFB n >= 1  
  55.                     // PRINT text + "が見つかった"  
  56.                     BREAK 2                       
  57.                 ELSE  
  58.                     // PRINT text + "が見つからない"  
  59.                 ENDIF                 
  60.             NEXT  
  61.         ELSE  
  62.             PRINT "static text なし"  
  63.         ENDIF  
  64.           
  65.         // 1秒待機  
  66.         SLEEP(1)   
  67.     NEXT  
  68.       
  69. FEND  
---

解説

①右クリック
右クリックの操作自体は簡単で、標準関数のCLKITEM()の第3引数に、CLK_RIGHTCLKだけで実現ができます。

ちょっと悩んだのが、どこを右クリックするか? という問題になります。
この関数の場合なにもないところは、右クリックできないので、右クリックの目印になるコントロールが必要になります。

Openボタンを右クリックした場合もコンテキストメニューが表示されることが分かったので、①のように"Open"を右クリックするというコードになってます。

②アバウトダイアログのテキストを表示
成功した場合にPrintAccText(自作関数)でスタティク文字をコンソールに全部表示するようにしてます。
GETITEMの引数でITM_STATICというのもあるのですが、これだと文字列がとれない文字れるがあったので、ITM_ACCTXTを指定して取得してます。

表示された文字が正しいかどうかまでの判定はしてなく、文字列を表示するところまでとなってます。

結果


実行後はコンソールに文字が表示されます。

今回も特に苦労せず進められました。




自動テストの練習4 (UWSC編③) ボタン押す



やりたいこと

前回の続きになります。

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


ボタンを押す

こちらのUpdateのボタンを押すというテストになります。




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

IDTestCaseの説明TestCaseの手順出力期待値
TC3Updateボタン「あいうえお」を入力する
updateボタンを押す
「あいうえお」が入力される
TC4OpenボタンOpenボタンおすエディタが起動する


ソース

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

長くなるので、ボタンを押すところだけを切り出したコードになってます。


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

解説

①ボタンを押すCLKITEM() という標準関数を使用しております。
以下の引数を指定すると、コントトールをクリックしてくれる関数です。 
第1引数 : WindowのID 
第2引数 : コントトールの名称
(オプションで、コントロールの種別, チェックボックスON,OFF, コントロールの番号)も指定可能ですが、今回は第2引数までしか使ってません。 

ボタンを押す以外は前回も使用した関数を使ってます。 

WaitWindowText()でウィンドウの特定のテキストが表示されるのを待ってます。
その後GetID()でウィンドウのIDを取得して、
SENDSTR()で文字を入力して、
最後にCLKITEM()でボタンを押してます。

Openというボタンもアプリにはあるのですが、その処理はほぼ同じなので、
ここでは説明を省略しました。

 

結果



今回は特に苦労せず進められました。







2021年10月17日日曜日

自動テストの練習3 (UWSC編②) 文字入力


 

やりたいこと

前回の続きになります。

UWPアプリの簡単なテスト(スモークテスト?)をUWSCでやってみたいというものになります。

UWSC編②では文字を入力するテストケースを実施しみました。

こちらの赤枠に文字列を入力するテストになります。

最初に考えたテストケースのTC2になります。

IDTestCaseの説明TestCaseの手順出力期待値
TC2文字の入力「あいうえお」を入力する
enterを押す
「あいうえお」が入力される


ソース

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

前回の分に足してるので、ちょっと長いです。

------
  1. // TC1 起動チェック  
  2. CheckStart()  
  3.   
  4. // TC2 文字の入力  
  5. InputString()  
  6.   
  7.   
  8. // 起動チェック  
  9. PROCEDURE  CheckStart()  
  10.     //起動  
  11.     DOSCMD("C:\test\memotter - ショートカット.lnk")  
  12.   
  13.     //チェック  
  14.     ret = GETID("memotter")  
  15.     IF ret = TRUE   
  16.         PRINT "起動OK"  
  17.     ELSE  
  18.         PRINT "起動NG"  
  19.         EXITEXIT  
  20.     ENDIF  
  21.       
  22. FEND  
  23.   
  24.   
  25. // 文字列入力  
  26. PROCEDURE  InputString()  
  27.   
  28.     WaitWindowText("memotter""What", 10)  
  29.       
  30.     id = GETID("memotter")  
  31.       
  32.     // ⑥  
  33.     SENDSTR(id, "あいうえお", 1, True)   
  34.       
  35.     //enterを送信  
  36.     //sckey(id, vk_enter)  
  37.       
  38. FEND  
  39.   
  40. // ①ウィンドウの中のテキストが表示されるのを待つ  
  41. FUNCTION WaitWindowText(WindowTitle, text, timeOut)  
  42.     RESULT = FALSE    
  43.   
  44.     // ウィンドウが表示されるのをtimeOutの時間まで待つ  
  45.     FOR i = 0 TO timeOut  
  46.         //②ウィンドウのID取得  
  47.         id = GETID(WindowTitle)  
  48.       
  49.         // ③  
  50.         staticText = GETITEM(id, ITM_STATIC)  
  51.         IF staticText <> 0  
  52.             FOR j = 0 TO staticText -1   
  53.                 n = POS(text, ALL_ITEM_LIST[j])  // ④  
  54.                 IFB n >= 1  
  55.                     PRINT text + "が見つかった"  
  56.                     BREAK 2         // ⑤  
  57.                 ELSE  
  58.                     PRINT text + "が見つからない"  
  59.                 ENDIF                 
  60.             NEXT  
  61.         ELSE  
  62.             PRINT "static text なし"  
  63.         ENDIF  
  64.           
  65.         // 1秒待機  
  66.         SLEEP(1)   
  67.     NEXT  
  68.       
  69. FEND  
-------

解説

①のコード

ウィンドウの中に検索したいテキストが表示されるのを待つ関数を作りました。

UWPアプリは起動時にスプラッシュ画面を表示するのですが、そのスプラッシュが消えて通常の状態になるのを待つ自作関数となります。

UWSCの標準関数GETID()だと、ウィンドウがあるかないかなので、スプラッシュの状態かどうかは判断できませんでした。

また、STATUS()という標準関数で、アクティブかどうかを判断できるのですが、こちらもスプラッシュでもアクティブと判断されるのでだめでした。

ということで、FOR文でループして、ウィンドウの中に、あるテキスト文字があるかどうかを判断する関数を作りました。


②のコード

GETIDをFOR文の中で実施しているのは、スプラッシュとスプラッシュがなくなったウィンドウでIDが違うので、FOR文の中でGETIDしています。


③のコード

GETITEM()はコントロールの内容を取得する標準関数です。

こちらを用いてStaticTextを取得してます。

StaticTextは戻り値として、取得できた文字列の数が入っており、ALL_ITEM_LIST[]に取得できたStaticTextが配列として入ってます。


④のコード

標準関数POS()で文字列が入っているかどうかを判定しています。

この場合"What"という文字列が入っているかどうかを判定してます。


⑤のコード

見つかったらBreakで抜けてます。

Breakの後に数字をいれると、ネストされたfor文の上の2個分抜けることができるので、2を指定してます。

標準関数のSENDSTR()を使って文字列を入力しています。

結果

実行すると文字を入力して、Enterを押すところまで実施できました。


苦労した点

Windowsがスプラッシュから切り替わったかどうかを判定するところ(WaitWindowText)が苦労しました。

Status()という標準関数を最初用いていたいのですが、これだとなんだかうまくいかず、苦肉の策でテキストで判定するようにしました。

次回へ続く。




2021年10月16日土曜日

自動テストの練習2 (UWSC編①) 起動


やりたいこと

UWSCという自動化ツールを使って、自動テストの練習をしてみようと思います。

こういうUIのツールで、こちらからダウンロードできます。

https://www.vector.co.jp/soft/winnt/util/se115105.html

簡単にキャプチャリプレイツールとして使用することができるツールなのですが、スクリプトを書いて、Windowsのアプリの操作も可能です。

このスクリプトの方で、自動テストに取り組んでみたいと思います。

実施したいテストの内容は、以前の記事をご参照ください。

https://pdfandfont.blogspot.com/2021/10/1.html

ざっくり言うと、UWPアプリの簡単なテストとなります。(スモークテスト?)


アプリの起動

最初のテストケース、起動するところをやってみました。

IDTestCaseの説明TestCaseの手順出力期待値
TC1起動exeを実行する起動する

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

  1. // TC1 起動チェック  
  2. CheckStart()  
  3.   
  4.   
  5. // 起動チェック  
  6. PROCEDURE  CheckStart()  
  7.     //①起動  
  8.     DOSCMD("C:\Users\XXX\Desktop\memotter - ショートカット.lnk")  
  9.   
  10.     //②起動チェック  
  11.     ret = Getid("memotter")  
  12.     IF ret = TRUE   
  13.         PRINT "起動OK"  
  14.     ELSE  
  15.         PRINT "起動NG"  
  16.         EXITEXIT  
  17.     ENDIF  
  18.       
  19. FEND  
---
①でアプリを起動しています。
UWPではない通常のアプリ(exe)の場合は、EXECという関数で起動するのですが、
exeで起動できないので、アプリのショートカットを作成して、それをDOSCMDという関数でたたいて無理やり起動してます。
ショートカットの作成方法は前回の記事に記載してあります。

②で起動したことのチェックをしています。
GETID("アプリのウィンドウのタイトル")はウィンドウIDを返す関数です。
これで、ウィンドウが立ち上がったかどうかをチェックしています。
待ち時間を指定することもできるので、少し時間がかかるアプリであれば、待ち時間を指定したほうが良いかもしれません。
デフォルトの待ち時間は0.1~10秒の間で自動判断されます。

ここまでで一応第一段階が完了しました。

結果


実行すると無事アプリが起動しました。

苦労した点


UWPアプリを起動するとこがとても苦労しました。
コマンドで起動するかよくわからないし、EXECでショートカットのパスを指定しても動かないし...

まとめ

自動テストの練習として、UWSCという自動化ツールを用いて、
UWPアプリを起動するスクリプトを作ってみました。

ちょっと苦労しましたが、なんとか起動することができました。



2021年10月10日日曜日

UWPアプリ コマンドプロンプトから起動2

 前回の続きとなります。

自動化のためにコマンドで起動する方法の第2回となります。

こちらの記事でもっと簡単な手順が紹介されておりました。

詳細はそちらをご確認ください。

簡単にメモしておきます。

1.shell:appsfolder を実行

2.このフォルダにあるUWPアプリを右クリックして、ショートカットを作成

3.作成したショートカットのパスをコピーする。

   (Shift押しながら右クリックでパスのコピーが簡単です。)

4.コマンドプロンプトにそれを張り付けて、実行する。

実行できました。

このショートカットを使う方法が一番手っ取り早そうです。

UWPアプリ コマンドプロンプトから起動

 UWPアプリを自動テストする前段階として、

コマンドプロンプトから起動できるようにしておきます。

いろいろなやり方があるみたいなのですが、MSのサイトに記載されている

こちらのやり方でやってみました。

一応起動するようにはなったのですが、起動時に実行されるコードが通常とはちょっとだけ違うところに行くので、こちらの手順はやめることにしました。

ひとまず調べたので忘れないように記録だけしておきます。

---------------------------------------------

MSのサイトはこちら

https://docs.microsoft.com/ja-jp/windows/uwp/xbox-apps/automate-launching-uwp-apps


Step.1 準備

Visual StudioでUWPアプリのプロジェクトを開く。

Package.appxamanifestを開く。

宣言タブを開く。

使用可能な宣言で「プロトコル」を選択して、追加ボタンを押下。

名前を入力する。



Step.2 コマンドプロンプトで実行

start memotter:

のコマンドで起動ができるようになる。

ただし、これだけだとスプラッシュで止まってしまうので、

以下の手順が必要。


Step.3 OnActivatedの実装

App.xaml.csにOnActivated()を追加して、OnLaunched()の中身と似たようなものを追加すると、スプラッシュ以降も実行されるようになります。

このコードは下記のサイトとOnLaunched()の中身を参考にコードを書いてみました。

  1. protected override void OnActivated(IActivatedEventArgs e)  
  2. {  
  3.     base.OnActivated(e); // 先に継承元のメソッドを処理する  
  4.   
  5.     string argMessage = string.Empty; // Uriから取り出した文字列を格納する変数  
  6.     if (e.Kind == ActivationKind.Protocol)  
  7.     {  
  8.         // プロトコルによって起動されたときは、e.KindがActivationKind.Protocolになっている。  
  9.         // このときの引数eはProtocolActivatedEventArgsクラスなので、キャストして使用する  
  10.         ProtocolActivatedEventArgs eventArgs = e as ProtocolActivatedEventArgs;  
  11.   
  12.         // 画面表示前にプロトコルを処理するなら、ここで行う  
  13.     }  
  14.   
  15.     Frame rootFrame = Window.Current.Content as Frame;  
  16.   
  17.     // ウィンドウに既にコンテンツが表示されている場合は、アプリケーションの初期化を繰り返さずに、  
  18.     // ウィンドウがアクティブであることだけを確認してください  
  19.     if (rootFrame == null)  
  20.     {  
  21.         // ナビゲーション コンテキストとして動作するフレームを作成し、最初のページに移動します  
  22.         rootFrame = new Frame();  
  23.   
  24.         rootFrame.NavigationFailed += OnNavigationFailed;  
  25.   
  26.         if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)  
  27.         {  
  28.             //TODO: 以前中断したアプリケーションから状態を読み込みます  
  29.         }  
  30.   
  31.         // フレームを現在のウィンドウに配置します  
  32.         Window.Current.Content = rootFrame;  
  33.     }  
  34.   
  35.     if (rootFrame.Content == null)  
  36.     {  
  37.         rootFrame.Navigate(typeof(MainPage), argMessage);  
  38.     }  
  39.     // 現在のウィンドウがアクティブであることを確認します  
  40.     Window.Current.Activate();  
  41. }  


一応これでコマンドプロンプトからstart XXX:とすると起動ができるようになりました。 ただ、OnLaunched()が通常呼び出されるのに対してOnActivated()が呼び出されるため、 動作が変わるのことが気になってやめることにしました。

2021年10月2日土曜日

自動テストの練習 1



やりたいこと

自動テストの練習を兼ねて、最近作ったmemotterをテストしてみたいと思います。

memotterはこんな画面です。UWPアプリです。


準備

自動テストを行うまえにテストケースを事前に考えておきます。

もう少し機能はあるのですが、面倒なのでひとまずここまでにしました。そのうち追加していこうかと思います。

IDTestCaseの説明TestCaseの手順出力期待値
TC1起動exeを実行する起動する
TC2文字の入力「あいうえお」を入力する
enterを押す
「あいうえお」が入力される
TC3Updateボタン「あいうえお」を入力する
updateボタンを押す
「あいうえお」が入力される
TC4OpenボタンOpenボタンおすエディタが起動する
TC5Aboutメニュー右クリック
Aboutメニューを選択
Aboutダイアログが表示される
TC6Settingsメニュー右クリック
Settingsメニューを選択
Settingsダイアログが表示される
TC7終了×ボタンをおす終了する

テストケースはこちらのサイトのものを参考にしました。

まとめ

UWPの自動テストにチャレンジしていこうということで、
ひとまずテストしたい内容のテストケースを作成しました。次回以降で実際にスクリプトを作成していこうと思ってます。


Windows 自動化メモ

Windowsのフリーの自動化できるツールをメモしておきます。

UWSC
・全体的に簡単。
・記録が簡単。
・吹き出しも結構いい。

Autoit
・コードを書く必要がある。
・UWSCより軽快?

Appium
・ちょっとかじったところ、難しい。
・準備が大変。

Power Automate Desktop
・まだ使ったことがない。


2021年8月4日水曜日

2021年7月22日木曜日

UWPアプリ登録完了

5月から作業を初めてやっとこ、アプリの登録が完了しました。

現在申請中です。


認定が無事通りますように。



2021年7月18日日曜日

UWP  アプリ認定キット 実行のめも

 (手順)

1.ソリューションエクスプローラー > プロジェクト名称右クリック > Plublish > アプリパッケージの作成... 

2.ラジオボタンで

(一回目)

新しいアプリ名でMicrosoft Storeに

(2回目以降)

xxxによりYYYとしてmicorosoftストアに

3.次へボタン

4.作成ボタン

   ...   ビルドが始まるのでちょっと待つ

5.パッケージの作成が完了しましたダイアログが表示されたら、

 Windowsアプリ認定キットを起動する。ボタンを押す。

6.テスト選択ダイアログで、次へボタンを押す。

7.終わるのを待つ。

8.合格が表示されたらOK

---------------------------------------------

(引っかかったところ)

①署名がされてなくて手順1実行後にすぐ終了

→ パッケージマニュフェスト>パッケージ化>証明書の選択>

  適当に作成すると解決。

②documentLibraryを使用していたことで、不合格

 正確に言うと合格だけど、documentlibraryは使えないよいうような警告が表示された。

→ localのフォルダにファイルを書くことにして解決。




2021年7月11日日曜日

UWP アプリ だいたいできた

 Formで作ったアプリをUWPで作り直す作業がおおむね完了しました。

あとは、テストを少し行う予定です。

2021年6月24日木曜日

UWPローカライズで苦戦中...

日付を各言語ごとにローカライズすることを考えています。

標準の日時書式指定文字列

こちらを参考に日付の書式を"d"に指定しておけば、短い日付のパターンで勝手に各言語にローカライズするのかなと 簡単に考えました。

テストのためにOSの地域と言語やロケールを全部英語に変えてみても、なにも変化せず。

UWPではmanifestで既定の言語が定義されていて、それで常に動くのがデフォルトということがわかりました。

グローバリゼーションとローカライズ

まずはこちらをしっかり読もうと思ってます。

2021年6月12日土曜日

UWP スプラッシュ ペイントで

やりたいこと
UWPで新規プロジェクトを作成して、実行すると大きな×印がでたり、タスクバーのアイコンが×になったりしてます。


これはスプラッシュやアイコンの画像が登録していないだけで、登録すると解消されます。
その手順の紹介となります。

参考情報
MSの情報 「スプラッシュ画面の追加」
https://docs.microsoft.com/ja-jp/windows/uwp/launch-resume/add-a-splash-screen

Step.1 ペイントでスプラッシュに表示される画像作成
ペイントを開き、サイズを400x400ピクセルにします。
スプラッシュやアイコンに使いたい色で塗りつぶします。
好きな絵を描きます。
文字を入れる場合は、うまく入りきらないので、サイズを少し大きくしておいて、文字を書いてから400x400のサイズにした方がやりやすいかもしれません。
でであがったら保存します。
Step.2 visual studioに設定
ソリューションエクスプローラー > Pakage.appxmanifestをダブルクリック > ビジュアル資産 > すべてのビジュアル資産を選択 > ソースから先ほど作成した画像を選択 > スプラッシュスクリーンの背景の色を指定 > 生成ボタンを押す。
できた
なんとなくそれっぽくなりました。

2021年5月30日日曜日

syntaxhighliterでxmlをやるとおかしくなることがある

こちらのサイトが参考になったので、めも。 http://markup.webcrew.co.jp/art_20141219.html

UWP コンテキストメニュー

やりたいこと
UWPのアプリでコンテキストメニューを表示するまでの手順を紹介します。

特定のコントロール、例えばボタンとかを右クリックするのではなく、フォームのどこを右クリックしてもメニューが表示されるようにするようにする方法となります。
ちょっと苦労したので、自分用としての意味も含めて記録しておきます。

また、できるようにはなったのですが、本当にこれでよいのかはちょっと怪しいところもあります。
環境
VisualStudio Community 2019 V16.10.0
Windows 10 20H2
準備
空白のアプリ(ユニバーサルWindows)を作成しておきます。
Step.1 xamlの編集
ソリューションエクスプローラー > MainPage.xaml をダブルクリック > XAMLのGridの間に以下のコードを追記します。
Gridにコンテキストメニューを割り当てるようなことをしてます。
追記するコード
  1. <grid>  
  2.     <grid.contextflyout>      ここから  
  3.         <menuflyout>  
  4.             <MenuFlyoutItem Text="テスト1"/>  
  5.             <MenuFlyoutItem Text="テスト2"/>  
  6.             <MenuFlyoutItem Text="テスト3"/>  
  7.         </menuflyout>  
  8.     </grid.contextflyout>   ここまで  
  9. </grid>  
ここまでの手順でコンテキストメニューが表示されてもよいはずなのですが、なぜかコンテキストメニューはまだ表示されません。
Step.2 Gridの背景を塗りつぶす
Step 1のコードを以下のように変更します。
Gridの背景を白で塗りつぶしているだけです。
  1. <grid background="White">   ←これ  
  2.     <grid.contextflyout>  
  3.         <menuflyout>  
  4.             <MenuFlyoutItem Text="テスト1"/>  
  5.             <MenuFlyoutItem Text="テスト2"/>  
  6.             <MenuFlyoutItem Text="テスト3"/>  
  7.         </menuflyout>  
  8.     </grid.contextflyout>  
  9. </grid>  
※このStep.2がちょっと怪しい手順となります。
結果
コンテキストメニューが表示されます。
できた!!