MENU

Jenkins&CentOSサーバでDOMを利用するテストを実行する

エンジニアブログ

2017-07-05

andyです。

とある機能を開発するにあたり、特定の外部JavaScriptに依存した実装をする必要が出てしまいました。
UnitTestを書く際に、どうしてもこのJSが提供する関数を使う必要があり、かつそのJSが特定のDOMに依存する、という状況でした。
※依存するというより、JSの実行結果を取得するためにDOMのパースが必要、というのが正しい解釈です。
※そのJSの実装はどうなんですか、という話は置いておいて。。

ブラウザ周りの環境はUi4jを利用することにし、これを利用したテストを書きつつ動くコードを完成させます。
ローカルPCでのテストはこれだけで問題なかったのですが、これをステージング環境に投入する際に問題がありました。
※Ui4jを使ってテストを書く、という部分でも苦労があります。その話は担当したエンジニアがきっと記事にしてくれるハズ・・

弊社では、ステージング環境に投入する前にレビューを通すようなフローを組んでいるのですが、レビューにかける前にJenkinsでテストを実行してリグレッションが発生していないか等を自動チェックするようにしています。
※開発フローの詳細はまた別途記事にしたいと思います。

ローカルで確認したテストが、Jenkinsで実行すると以下のようなExceptionを吐き出して失敗するようになってしまいました。

Graphics Device initialization failed for :  es2, sw
Error initializing QuantumRenderer: no suitable pipeline found
java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
	at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:280)
	at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:221)
	at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:205)
	at com.sun.javafx.application.PlatformImpl.isFxApplicationThread(PlatformImpl.java:264)
	at javafx.application.Platform.isFxApplicationThread(Platform.java:99)
	at com.ui4j.webkit.WebKitBrowser.(WebKitBrowser.java:97)
	at com.ui4j.webkit.WebKitBrowserProvider.create(WebKitBrowserProvider.java:27)
	at com.ui4j.api.browser.BrowserFactory.getBrowser(BrowserFactory.java:115)
	at com.ui4j.api.browser.BrowserFactory.getWebKit(BrowserFactory.java:151)
--- snip ---

グラフィックデバイスがない、ということで、そこは至極当たり前ですがJenkinsがテストを実行している環境がCentOSサーバーだから、という結論になります。
※当然グラフィック関連の環境は入っていない。。

というわけで、まずはテストを実行するサーバに仮想ディスプレイ環境を作っていきます。
※対象のOSはCentOS6です。

$ sudo yum install xorg-x11-server-Xvfb firefox libXtst libxslt

かなり試行錯誤した後でのまとめなので、これ以外にも必要なパッケージが存在するかもしれません。。
(例えばgoogle chromeをインストールしようとしたけれど、そもそもCentOSがサポート外だった、とか。。)

次に、Jenkinsでテストのジョブを実行する際にxvfbの起動/停止をする設定を行います。
Jenkinsの管理画面からXvfbプラグインをインストールしておきます。
・Global Tool Configurationでxvfbを呼び出せるように設定

・ジョブの設定で、仮想ディスプレイとしてどう振る舞うか(コマンドの引数に渡すパラメータ)を設定

xvfbとインストールしたfirefoxは特に何もしなくても(firefoxにパスが通っていれば)xvfbから呼び出してくれるようです。

と、ここまでの設定をやってようやくJenkinsからテストを実行することができるようになりました。
1点、心配していることとしてはUi4jの開発が2015年を最後に止まっているようで、例えばJavaのバージョンを上げたりした際にテストが通らなくなってしまったりすることです。
ひとまずはこのまま運用してみて、何かあれば都度対応しようかな、と思います。

ThymeleafとJSPを共存させた話

2017-07-03

BLOG/エンジニアブログ

IntelliJ KEYMAP #1(Mac)

2017-05-29

BLOG/エンジニアブログ

アプリ更新時のブラウザリロードは自動で!

2017-04-30

BLOG/エンジニアブログ