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文

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

PRINT "成功"
PRINT "失敗"

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



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

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


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

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


結構便利です。

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


ログファイル

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

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

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

こちらになります。

// logファイルに書き込む
PROCEDURE WriteLog(str)

	// 日付作成
	GETTIME()
	dateTime =  G_TIME_YY + "/" + G_TIME_MM + "/" + G_TIME_DD + "_" + G_TIME_HH  + ":" + G_TIME_NN + ":" + G_TIME_SS

	// ファイル書き込み
	fid  = FOPEN("LogFile.txt", F_READ or F_WRITE) // 追記
	FPUT(fid , dateTime + "<#TAB>" + str)
	FCLOSE(fid )
FEND

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



スクリーンショット

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

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

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

こちらになります。

// スクリーンショット
PROCEDURE MySaveImg()

	// 日付作成
	GETTIME()
	dateTime = "" + G_TIME_YY + G_TIME_MM + G_TIME_DD + "_" + G_TIME_HH + G_TIME_NN + G_TIME_SS + G_TIME_ZZ
	filename = "IMG\" + dateTime
	
	// フォルダ作成
	Doscmd("mkdir " + "IMG")

	// スクリーンショット
	SaveImg(filename, "", "", "", "", "", "", 50)
	
FEND

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

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


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


スリープ

SLEEP(秒数)

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

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

UWSCのヘルプ

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

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



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

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

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

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

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

GID = GETID("ウィンドウタイトル") // ここにコントロールを取得したいウィンドウのタイトルを指定する
GetItemAll(GID)

PROCEDURE GetItemAll(GID)

	PRINT "ボタン"
	NUM = GETITEM(GID,ITM_BTN)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "リストボックス、コンボボックス"
	NUM = GETITEM(GID,ITM_LIST)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "タブコントロール"
	NUM = GETITEM(GID,ITM_TAB)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "メニュー"
	NUM = GETITEM(GID,ITM_MENU)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "ツリービュー"
	NUM = GETITEM(GID,ITM_TREEVEW)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "リストビュー"
	NUM = GETITEM(GID,ITM_LSTVEW)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "エディットボックス"
	NUM = GETITEM(GID,ITM_EDIT)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "スタティックコントロール"
	NUM = GETITEM(GID,ITM_STATIC)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "ステータスバー"
	NUM = GETITEM(GID,ITM_STATUSBAR)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "ツールバー"
	NUM = GETITEM(GID,ITM_TOOLBAR)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "アクセシビリティ用インターフェース経由でのクリック可能なオブジェクト"
	NUM = GETITEM(GID,ITM_ACCCLK)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "アクセシビリティ用インターフェース経由でのテキスト"
	NUM = GETITEM(GID,ITM_ACCTXT)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

FEND


まとめ

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

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

2021年11月7日日曜日

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




やりたいこと

前回の続きになります。

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


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


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

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


ソース

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

// TC7 終了
CloseApp()


// 終了
PROCEDURE CloseApp()

	WaitWindowText("memotter", "What", 10)
	
	id = GETID("memotter")
	
	//①とじるボタンをクリック
	closebtn = CLKITEM(id, "memotter を閉じる")
	IF closebtn = TRUE 
		PRINT "OK とじるボタン押下成功"
	ELSE
		PRINT "NG とじるボタン押下失敗"	
	ENDIF
	
FEND


// ウィンドウの中のテキストが表示されるのを待つ
FUNCTION WaitWindowText(WindowTitle, text, timeOut)
	RESULT = FALSE	

	// ウィンドウが表示されるのをtimeOutの時間まで待つ
	FOR i = 0 TO timeOut
		//ウィンドウのID取得
		id = GETID(WindowTitle)
	
		staticText = GETITEM(id, ITM_STATIC)
		IF staticText <> 0
			FOR j = 0 TO staticText -1 
				n = POS(text, ALL_ITEM_LIST[j])  
				IFB n >= 1
					// PRINT text + "が見つかった"
					BREAK 2						
				ELSE
					// PRINT text + "が見つからない"
				ENDIF				
			NEXT
		ELSE
			PRINT "static text なし"
		ENDIF
		
		// 1秒待機
		SLEEP(1) 
	NEXT
	
FEND
----

解説


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

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

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

GID = GETID("電卓")
GetItemAll(GID)

PROCEDURE GetItemAll(GID)

	PRINT "ボタン"
	NUM = GETITEM(GID,ITM_BTN)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "リストボックス、コンボボックス"
	NUM = GETITEM(GID,ITM_LIST)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "タブコントロール"
	NUM = GETITEM(GID,ITM_TAB)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "メニュー"
	NUM = GETITEM(GID,ITM_MENU)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "ツリービュー"
	NUM = GETITEM(GID,ITM_TREEVEW)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "リストビュー"
	NUM = GETITEM(GID,ITM_LSTVEW)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "エディットボックス"
	NUM = GETITEM(GID,ITM_EDIT)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "スタティックコントロール"
	NUM = GETITEM(GID,ITM_STATIC)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "ステータスバー"
	NUM = GETITEM(GID,ITM_STATUSBAR)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "ツールバー"
	NUM = GETITEM(GID,ITM_TOOLBAR)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "アクセシビリティ用インターフェース経由でのクリック可能なオブジェクト"
	NUM = GETITEM(GID,ITM_ACCCLK)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

	PRINT "アクセシビリティ用インターフェース経由でのテキスト"
	NUM = GETITEM(GID,ITM_ACCTXT)
	FOR i = 0 TO (NUM-1)
		PRINT (i+1) + "番目:<#TAB>" + ALL_ITEM_LIST[i]
	NEXT

FEND


結果

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

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

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