Play Framework 2.x の Selenium 用テストを Specs2 で書いたとき、異なる WebDriver で同じテストコードを実行したいときの実装の仕方。
実装
基本は Play Framework が標準で用意している Selenium をサポートする WithBrowser クラスを活用する。
テストを抽象クラスとして作り WebDriver
の ClassTag
を暗黙の引数にすることで、具象実装は型パラメータをあてて拡張するだけとなる。
AuthenticationSpec.scala
import org.specs2.mutable._
import play.api.test._
import play.api.test.Helpers._
import scala.reflect.ClassTag
/** 認証の統合テストの抽象実装 */
abstract class AuthenticationSpecBase[D <: org.openqa.selenium.WebDriver: ClassTag] extends Specification {
protected val webDirverClass = implicitly[ClassTag[D]].runtimeClass.asInstanceOf[Class[D]]
"ブラウザによる認証画面の操作 with " + webDirverClass.getSimpleName should {
"ユーザー名とパスワードを入力してログインするとホームが表示される" in new WithBrowser(webDirverClass) {
val form = browser goTo("http://localhost:" + port) $ "form#login-form"
form find "input[name=name]" text "test-user"
form find "input[name=password]" text "password"
form find "input[type=submit]" click()
browser.title must_== "ホーム"
}
}
}
// 実装別テストクラス
import org.openqa.selenium.firefox.FirefoxDriver
/** HtmlUnit で実行する認証の統合テスト */
class AuthenticationWithHtmlUnitSpec extends AuthenticationSpecBase[HtmlUnitDriver]
/** FireFox で実行する認証の統合テスト */
class AuthenticationWithFireFoxSpec extends AuthenticationSpecBase[FirefoxDriver]
実行方法
- HtmlUnit のだけ実行:
$ test-only AuthenticationWithHtmlUnitSpec
- FireFox のだけ実行:
$ test-only AuthenticationWithFireFoxSpec
- 全部実行:
$ test-only Authentication*
全部実行したときの出力例
[testapp] $ test-only Authentication*
[info] AuthenticationWithHtmlUnitSpec
[info]
[info] ブラウザによる認証画面の操作 with HtmlUnitDriver should
[info] + ユーザー名とパスワードを入力してログインするとホームが表示される
[info]
[info]
[info] Total for specification AuthenticationWithHtmlUnitSpec
[info] Finished in 7 seconds, 236 ms
[info] 1 example, 0 failure, 0 error
[info]
[info] AuthenticationWithFireFoxSpec
[info]
[info] ブラウザによる認証画面の操作 with FirefoxDriver should
[info] + ユーザー名とパスワードを入力してログインするとホームが表示される
[info]
[info]
[info] Total for specification AuthenticationWithFireFoxSpec
[info] Finished in 10 seconds, 645 ms
[info] 1 example, 0 failure, 0 error
[info]
[info] Passed: : Total 2, Failed 0, Errors 0, Passed 2, Skipped 0
[success] Total time: 23 s, completed ...
感想
抽象クラスの [D <: org.openqa.selenium.WebDriver: ClassTag]
の部分はスペックごとに書かなければならないので、 結局コピペは必要になるところが、まだいまひとつなところです。