読者です 読者をやめる 読者になる 読者になる

Windows+Jenkins環境にてGUIテストを動かす

QTのGUI自動テストを試してみたら、
ローカル環境で通ったテストがJenkins環境で上手く動作せずに嵌ったので、メモ。

環境
OS:Windows7
Jenkins:1.567
Qt:5.3.0

QTestLibによるGUI自動テスト

QTestLibを使うことで、Qtで作成したアプリケーションの自動テストを作成することができます。
キー操作やマウス操作のエミュレーションが可能。
詳細は公式チュートリアルを参照。
http://elisp.net/qt-doc-ja_JP/qtestlib-tutorial.html

少なくともマウス操作を用いたテストをする時は、
対象のWidgetをshow()する必要があったので注意。
チュートリアルに記載はなかったので、少し嵌った。

ウィンドウが表示されるまでのタイムラグがあるかもしれないので、
show()の後にqWaitForWindowExposed関数を用いると便利。
タイムアウト時間を過ぎるか、Widgetが表示されるまで待ってくれる。

問題

QTestLibで作成したGUIテストをローカル環境でOKになることを確認した後、
Jenkinsで自動テストを動作させると失敗する問題が発生。
ビルドもテスト実行もできているので、
テストが失敗する要因が全く思いつきませんでした。

検索しようにも、QTestLib自体が情報が少なく、
そのうえでWindows+JenkinsでCIした時の問題となると、
何をキーワードに検索すれば情報が見つかるのか、
さっぱり分かりませんでした。

とにかく思いつくキーワードでひたすら検索してみましたが、
欲しい情報は全然見つかりませんでした。

そして解決へ

あまりに原因が分からず、諦めようとしたときに
以下のTogetterが検索に引っかかりました。
http://t.co/m4qADbfBu5

なんと、仙台の勉強会で良くご一緒する@nnasakiさんと
去年のWACATEでお会いしたことのある@snskさんのやり取りがあって、
ビックリしました。

お二方に繋がりがあることを知らなかったので、そのやり取りに驚いていましたが、
よくよく中身を見ていると、自分の環境で起きている問題と非常によく似た問題について
議論していました。

問題の原因はJenkinsがサービスとして起動されていると、
サービスからGUIアプリケーションを起動できないことでした。

対策としては、JenkinsのJNLPスレーブを作成して、
スレーブにGUIテストを実行させることです。

具体的な手順は以下のページを参考にしました。
http://www50.atwiki.jp/mucho_note/m/pages/17.html?guid=on

まとめ

人と人との意外なつながりを感じつつ、
GUIテストの自動化を試せる環境もできてきて、
快適な開発ライフにまた一歩近づきました。

GUIテスト自動化とかはWeb系だと情報が多い印象があるけど、
C++とかになると、一気に情報が少なくなる気がします。
問題にぶつかったときは毎回大変です。