Sikuliデモ
インストーラ
app = App("setup.exe")
app.open()
wait(Pattern_FirstScreen, 30) #最初の画面が出るまで30秒間待つ。
click(Pattern_Next) #OKボタンをクリックする
click(Pattern_Finish) #OKボタンをクリックする
解説1
インストーラは、最初の画面が出てくるまでの間に他の画面が出たり時間が掛かったりするので、wait()を使うのが良い。
解説2
クリックは、Screen().find(text).click() でも可だがOCRのほうが精度が低いのでOKボタンの形が変わるなど特別な事情がなければパターンでやったほうが良い。
スクリーンショットを撮る
filepath=r'c:\tests\test01'
win = app.focusedWindow()
img = win.getScreen().capture(win)
os.rename(img.filename, os.path.join(filepath, 'img.png'))
解説1
指定したfilepathに、カレントウィンドウのスクリーンショット保存する。capture()だとSikuliが指定したフォルダに保存してしまうので、ファイル作成後にファイルを移動する。
テストの条件分岐
Regression testで条件分岐があるのか判らないが、もしものために記しておく。
flag = False
try:
wait("1460624593912.png", 1)
flag = True
except:
flag = False
解説1
wait() の代わりに find() を使うこともできる。もし待ち時間を指定したければwait()を、もしOCRを使いたいfind()を使う。
タブ移動でテキストボックス間を移動する
type(Key.TAB)
Jenkinsやコマンドラインから実行する
PATH-TO-SIKULIsikuli-ide.exe -r xxxx.sikuli
http://doc.sikuli.org/faq/010-command-line.html
解説1
exeだけでなく標準で提供されるbatファイルでもオプションは指定可能。
解説2
-rにはSikuliを保存した時のフォルダ名を指定する。
解説3
Sikuliスクリプトにパラメータを渡したい場合は、—argsパラメータを使うことも可能。
Jenkins向けにテスト結果(XML)を出力する
unittestを使う
http://safx-dev.blogspot.jp/2013/06/sikulixml.html
----イメージ----
import unittest
class MyTestCase(unittest.TestCase):
def test01(self):
pass
if __name__ == '__main__':
loader = unittest.TestLoader()
module = __import__('__main__')
test = loader.loadTestsFromModule(module)
testRunner = xmlrunner.XMLTestRunner(verbosity=2) # XMLTestRunnerにする
testRunner.run(test)
番外編:Sikuli+Selenium連携は必要か?
ウェブの記事を読むと、SikuliとSeleniumを連動させている記事を見かけることがあった。将来的にHTML5のテストも視野に入れたいので、Seleniumとの連動を考えておいたほうが良いのかと迷ったが、以下の状況から、連携はそれほど重要では無いとの結論に至った。それよりも学習コストや立ち上がりスピードを重視したい。
インストーラ:Sikuli
インストーラCLI:expectが候補。少なくてもSeleniumではない
Flex系:Sikuli, SilkTest
HTML5系:Selenium, Sikuli, SilkTest
MMC系:Sikuli, SilkTest
学習コスト
Sikuli≒Selenium<SilkTest
Jenkinsとの連動
SilkTest:できるが大掛かりすぎ
Sikuli:unittest/XMLTestRunnerが必要
Selenium:Node.jsとの組み合わせでできる様子
今後
GUIテスト自動化にはSeleniumなどがあるが、Flexはまだまだ現役なので、Sikuliも並行して使い分けていく必要がありそうだ。
ちなみに、SikuliのOCRのTesseractは標準だと画像認識率がイマイチなので、学習させるか、Flexを拡大表示させるか、などの対策が必要そうだ。