SeleniumのDockerコンテナをJUnitから管理する!

前回の記事でSeleniumのDockerコンテナを使えばローカルのブラウザ環境に依存せずにテストが行えると書きました。

baubaubau.hatenablog.com

今回はここから一歩進んでDockerコンテナをJUnitから管理してみたいと思います。JUnitでDockerコンテナを管理できるようになれば更に環境依存性を取り除くことができ(Dockerイメージのバージョンとか)さらにテスト前に毎度Dockerコンテナを立ち上げるといった作業を省くことができるようになります。CIなどではこれらの利点が大きくなりそうですね。

DockerコンテナをJUnitから管理するツールを探していたら、求めていたものとジャストフィットするものを発見しました。

github.com

Selenium Docker の立ち上げと WebDriver の取得

TestcontainerはJUnit などのテストフレームワークで簡単にDockerを管理できるようにするJavaライブラリです。基本的な機能を提供するコアモジュールと、特定の環境に特化した個別のモジュールが提供されています。

Testcontainerが動作するにはそれぞれのOSに対するDockerのバージョンを満たす必要があります。以下のリンク先にその一覧が載っています。

セットアップは単にビルドツールへ依存関係を追加するだけです。モジュールごとのバージョンは下記のサイトに載っています。

search.maven.org

Selenium用のモジュールも用意されているので、そちらを使えば簡単にSelenium Server の管理をJUnitで行うことができそうです。

使い方は簡単で @Testcontainers をテストクラスに付与し、 @Rule アノテーションと一緒に BrowserWebDriverContainer クラスをフィールドで初期化するだけです。

というわけで、以下のコードで実行してみたら動作しました。実行時の環境は以下です。

  • macOS Catalina 10.15.2
  • Gradle 6.0.1
  • JVM 1.8.0_191
  • Docker 19.03.5

BrowserWebDriverContainer#webDriver からWebDriverインスタンスを取得することができるのでそれを使用すれば今までと変わらないコードでテストを実行することができます。

ただ、SLF4Jの出力先を正しく設定していないせいか以下の警告が出ているので次はそれを直していきたいと思います。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
SLF4J: Failed to load class "org.slf4j.impl.StaticMDCBinder".
SLF4J: Defaulting to no-operation MDCAdapter implementation.
SLF4J: See http://www.slf4j.org/codes.html#no_static_mdc_binder for further details.

そもそもSLF4Jとは何かについて詳しく調べることができていないので、まずはそもそも何だっけから始めたいと思います。新年一発目の調査はSLF4Jで決まりですね。