狠狠撸

狠狠撸Share a Scribd company logo
笔测础耻迟辞骋鲍滨等笔测迟丑辞苍ライブラリによる自动化支援
2016/7/24	テスト自動化研究会 事例報告
井芹 洋輝
【アウトライン】
Part.1		PyAutoGUI &	PyUnitによるGUIベースのテスト自動化
(おまけ)Part.2		PyAutoGUI &	PyUnit +色々なPythonライブラリ活用
(おまけ)Part.3		OpenCVによる現実空間のテスト自動化
宣伝
? U30テスト設計コンテスト(30歳以下のテスコン) 開催します!
? チュートリアル開催中。募集は来月予定
? 審査委員長を担当しています
? http://aster.or.jp/business/contest/rulebooku30.html
Part.1	
PyAutoGUI &	PyUnitによる
GUIベースのテスト自動化
PyAutoGUIとは
? マウス操作、キーボード操作、スクリーンショット操作を自動化するPython
向けライブラリ
? https://pyautogui.readthedocs.io/
? コンセプト
? 可能な限りシンプルかつ直感的に使える
? どんな環境(e.g.	win	or	mac	or	linux)でも同じように動く
? テスト自動化ツールというわけではないですが、お手軽に自動化ツールを
組めるため今回紹介
PyAutoGuiの例:APIの例
import	pyautogui
pyautogui.moveTo(100,	200)	#座標100、200にマウスを移動させる
pyautogui.click()	#マウスをクリックする
pyautogui.typewrite('Hello	world!')	#文字を打つ
pyautogui.keyDown('shift')	#シフトキーを押しっぱなしにする
position	=	pyautogui.locateCenterOnScreen('target.png')	#target.pngと一致
する場所の中心の座標を取得する
平易な1ステートメントでGUI操作を記述
PyAutoGuiの例:詳細なパラメータ指定の例
#画面上でhoge.pngとマッチする座標を取得
pyautogui.locateOnScreen(‘hoge.png’)
#グレースケールでマッチングして座標を取得
pyautogui.locateOnScreen(‘hoge.png’,	grayscale=True)
#指定の領域から座標を取得
pyautogui.locateOnScreen(‘hoge.png’,	region=(0,0,	300,	400))
#処理実行のインターバルを変更
pyautogui.PAUSE =	0.2
デフォルトはシンプルに、必要に応じて詳細に
PyUnit
? ライブラリ名unittest。Python向け標準xUnitフレームワーク
? シンプルで汎用性が高い
? ツールチェーンも自由に構築できる
? Jenkis向けXML生成、テスト結果集計などテスト用機能を手軽に利用できる
PyAutoGUI &	PyUnit
? PyUnitでテストフレームワーク構築
実行、結果評価をPyAutoGuiで実装
? PyUnitの機能を使いながら、GUIベースのテスト自動化を実現
? 用途を絞ればSikuli程度のツールは簡単に組める
PyAutoGUIデモ:タッチパッド操作テスト自動化
? 指定のタッチバッド操作でMac	OS情報画面を表示できることを自動テスト
PyAutoGUIデモ:タッチパッド操作テスト自動化
#macアイコンをクリック
position	=	pyautogui.locateCenterOnScreen('mac_icon.png')
pyautogui.click(position)
#情報表示メニューをクリック
position	=	pyautogui.locateCenterOnScreen('about.png')
pyautogui.click(position)
#表示を待つ
time.sleep(1)
#表示確認
position	=	pyautogui.locateOnScreen('os_info.png')
self.assertNotEqual(position,	None)
PyAutoGuiの問題点
? GUI&キャプチャ画像操作しばり
? 画像のマッチングで誤差の許容範囲を指定できない
? 透過効果や強調処理(影、フェード処理など)に弱い
? 処理が遅い
Part.2	
PyAutoGUI &	PyUnit
+色々なPythonライブラリ活用
色々なPythonライブラリの活用
? Pythonはテスト自動化で活用できるライブラリが多数公開されてる
? GUI操作(pyautogui等)、ブラウザ操作(selenium.webdriver等)、Excel操作(openpyxl)、
画像処理(opencv等)、文字識別(tesseract等)、機械学習(TensorFlow、scikit-learn等)、
その他諸々??
? Pythonベースでテスト自動化フレームワークを組むと、それらライブラリの
活用が可能になる
matplotlib
? MATLABを参考にしたライブラリ。
MATLABのような高機能グラフを簡単に出力できる。
? ※テスト自動化用途ではないが、MATLABでシミューレションや検証を行っ
ている人なら、自動化環境の補助チェックとしてスムーズに導入できる
matplotlibデモ
? プログレスバーのテスト自動化(PyAutoGUIで操作を自動化)
? 自動操作で得られたデータを目視確認できるようにグラフ化
プログレスバー画面
テスト対象ソフトウェア
PyUnit
PyAutoGUI
1.自動タッチパッド操作
2.	連続画面キャプチャ 3.	プログレスバーの時間
経過に対する推移
4.	時間×進捗のグラフ
matplotlib
statsmodels(+pandas,	numpy)
? 連続系のモデルやデータの分析ライブラリ
? statsmodels.formula
? Rを参考にしたAPIを使える
? モデルの式を文字列で記述できる
statsmodels.formula
? モデル式
? 「log(OutputData)	=	係数a×log(InputData)+係数b」
? Pythonでの記述(線形回帰分析)
? 「sm.ols(formula=“np.log(OutputData)	~	np.log(InputData)”,	data=datalist)」
(1)	OutputDataとInputDataを指定する
statsmodels.formula
(2)線形回帰分析でモデルの各係数や、モデルとデータの差異を分析
(略)
R-squared: 0.779
(略)
coef std err t P>|t| [95.0% Conf. Int.]
---------------------------------------------------------------------------
Intercept 2.4606 0.325 7.578 0.000 1.794 3.127
np.log(Ouput Data) 0.9564 0.098 9.766 0.000 0.755 1.157
log(Output	Data)	=	係数a×log(Input	Data)+係数b
モデルとの合致性パラメータを複数出力
statsmodels.formulaデモ:プログレスバーの自動テスト
? PyAutoGUIで自動操作。プログレスバー進捗を連続キャプチャで取得
? プログレスバーの進捗推移を、線形回帰分析でモデル化。モデルの係数
で、プログレスバーの進捗が意図通りか自動テストする
プログレスバー機能
テスト対象ソフトウェア
PyUnitPyAutoGUI
1.自動タッチパッド操作
2.	連続画面キャプチャ
3.	プログレスバーの時間
経過に対する推移
statsmodels
4.	プログレスバー進捗の
近似モデルのパラメータ
5.	合否結果
statsmodels.formulaデモ:プログレスバーの自動テスト
#プログレスバーの進捗の回帰分析結果を取得
def analysis_trend(time,	data):
trend_data =	pd.DataFrame([time,	data]).T
trend_data.columns =	["time",	"progress"]
result	=	sm.ols(formula	=	"progress	~	np.log(time)",	data=trend_data).fit()
return	result.params
class	TestProgressBar(unittest.TestCase):
def test_progress_bar(self):
#処理高速化のため、GUI操作対象の領域を特定してそこだけ操作するようにする
target_area =	pyautogui.locateOnScreen('target_area.png')
target_region =	location_to_region(target_area)
#プログレスバーの開始と終了の座標および長さを取得(進捗の取得のため)
start_position =	pyautogui.locateOnScreen('progress_start.png',	grayscale=True,	region=target_region)
end_position =	pyautogui.locateOnScreen('progress_end.png',	region=target_region)
length	=	end_position[0]	- start_position[0]
#プログレスバー 開始操作
position	=	pyautogui.locateCenterOnScreen('start_button.png',	region=target_region)
pyautogui.click(transform_coord(position))
(続く)
statsmodels.formulaデモ:プログレスバーの自動テスト
(続き)
#プログレスバー進捗取得
progress_pos =	[]
progress_time =	[]
start_time =	time.time()
time.sleep(1)
while	True:
position	=	pyautogui.locateCenterOnScreen('progress_current.png',	region=target_region)
if	position	==	None:
break
progress_pos.append((position[0]	 - start_position[0])	*	100	/	length)
progress_time.append(time.time()	- start_time)
#モデルとの合致性確認
result	=	analysis_trend(progress_time,	progress_pos)
self.assertTrue(result[0]	<	20)
self.assertTrue(result[1]	>	50	and	result[1]	<	100)
今回のモデル:progress_pos=	result[1]×log(progress_time)+result[0]
Part.3
OpenCVによる
現実空間のテスト自動化
OpenCV
? オープンソースのコンピュータビジョンのライブラリ
? 基本的な画像処理全般に対応。その他、録画?キャプチャ?カメラ制御、
キーボード操作などを扱える
? ロボットの移動制御やLED表示等、現実空間のテストの自動化を単独でサ
ポートできる
OpenCVデモ:クレーンロボットのテスト自動化
? Macbook Proのカメラで動画撮影。OpenCVでクレーン位置を解析
? テスト自動化環境の配置チェックと、クレーン制御機能テスト(クレーン位
置が指示通りである事をテスト)を自動化
クレーンロボット
1.動作指示通信
2.動画撮影
PC
PyUnit
OpenCV
3.ロボット位置情報
(クレーンの遠さと
座標位置)
4.テスト結果
通信制御
※準備が間に合わなかった
ので今回は人間で代用
OpenCV余談
? 近年のPythonでは、コンピュータビジョンやデータ分析のライブラリが充実
? 誰でも手軽にコンピュータビジョンベースの自動テストを構築できるようになった
? テストオラクルやシミュレーションのモデル作成も敷居が下がった
高精度を求めなければ機械学習のアプローチでモデルを構築できるようになった
? Pythonは組み込みエンジニアにとって重要な基礎教養
おわり

More Related Content

笔测础耻迟辞骋鲍滨等笔测迟丑辞苍ライブラリによる自动化支援