2021年10月31日日曜日

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




やりたいこと

 前回の続きになります。

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

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


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

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

ソース

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

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

---
// TC5 About
CheckAbout()

// About
PROCEDURE CheckAbout()

	WaitWindowText("memotter", "What", 10)
	
	id = GETID("memotter")
	
	//①右クリック
	openbtn = CLKITEM(id, "Open", CLK_RIGHTCLK)
	IF openbtn = TRUE 
		about = CLKITEM(id, "About")
		If about = TRUE
			PRINT "OK About成功"
			PrintAccText(id)	
						
			retOkt = CLKITEM(id, "OK")
		ELSE
			PRINT "NG About失敗"
		ENDIF 
	ELSE
		PRINT "右クリック失敗"	
	ENDIF
	
FEND



// ②AccTextを全部出す
PROCEDURE PrintAccText(id)
	NUM = GETITEM(id, ITM_ACCTXT)

	FOR j = 0 TO (NUM-1) 
		PRINT ALL_ITEM_LIST[j]
	NEXT

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()の第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ボタンおすエディタが起動する


ソース

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

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


-----
// TC3 Updateボタンテスト
CheckUpdateButton()


// UpdateButton
PROCEDURE  CheckUpdateButton()

	WaitWindowText("memotter", "What", 10)
	
	id = GETID("memotter")
	
	// 文字列入力
	SENDSTR(id, "あいうえお_CheckUpdateButton", 1, True) 
	
	//①Updateボタン押す
	ret = CLKITEM(id, "Update")
	IF ret = TRUE 
		PRINT "OK Updateボタン押下成功"
	ELSE
		PRINT "NG Updateボタン押下失敗"	
	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() という標準関数を使用しております。
以下の引数を指定すると、コントトールをクリックしてくれる関数です。 
第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を押す
「あいうえお」が入力される


ソース

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

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

------
// TC1 起動チェック
CheckStart()

// TC2 文字の入力
InputString()


// 起動チェック
PROCEDURE  CheckStart()
	//起動
	DOSCMD("C:\test\memotter - ショートカット.lnk")

	//チェック
	ret = GETID("memotter")
	IF ret = TRUE 
		PRINT "起動OK"
	ELSE
		PRINT "起動NG"
		EXITEXIT
	ENDIF
	
FEND


// 文字列入力
PROCEDURE  InputString()

	WaitWindowText("memotter", "What", 10)
	
	id = GETID("memotter")
	
	// ⑥
	SENDSTR(id, "あいうえお", 1, True) 
	
	//enterを送信
	//sckey(id, vk_enter)
	
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
-------

解説

①のコード

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

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を実行する起動する

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

// TC1 起動チェック
CheckStart()


// 起動チェック
PROCEDURE  CheckStart()
	//①起動
	DOSCMD("C:\Users\XXX\Desktop\memotter - ショートカット.lnk")

	//②起動チェック
	ret = Getid("memotter")
	IF ret = TRUE 
		PRINT "起動OK"
	ELSE
		PRINT "起動NG"
		EXITEXIT
	ENDIF
	
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()の中身を参考にコードを書いてみました。

protected override void OnActivated(IActivatedEventArgs e)
{
    base.OnActivated(e); // 先に継承元のメソッドを処理する

    string argMessage = string.Empty; // Uriから取り出した文字列を格納する変数
    if (e.Kind == ActivationKind.Protocol)
    {
        // プロトコルによって起動されたときは、e.KindがActivationKind.Protocolになっている。
        // このときの引数eはProtocolActivatedEventArgsクラスなので、キャストして使用する
        ProtocolActivatedEventArgs eventArgs = e as ProtocolActivatedEventArgs;

        // 画面表示前にプロトコルを処理するなら、ここで行う
    }

    Frame rootFrame = Window.Current.Content as Frame;

    // ウィンドウに既にコンテンツが表示されている場合は、アプリケーションの初期化を繰り返さずに、
    // ウィンドウがアクティブであることだけを確認してください
    if (rootFrame == null)
    {
        // ナビゲーション コンテキストとして動作するフレームを作成し、最初のページに移動します
        rootFrame = new Frame();

        rootFrame.NavigationFailed += OnNavigationFailed;

        if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
        {
            //TODO: 以前中断したアプリケーションから状態を読み込みます
        }

        // フレームを現在のウィンドウに配置します
        Window.Current.Content = rootFrame;
    }

    if (rootFrame.Content == null)
    {
        rootFrame.Navigate(typeof(MainPage), argMessage);
    }
    // 現在のウィンドウがアクティブであることを確認します
    Window.Current.Activate();
}


一応これでコマンドプロンプトから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
・まだ使ったことがない。