LoginSignup
12

More than 5 years have passed since last update.

Play Framework アプリの Selenium 用テストを、異なる WebDriver で同じテストコードを実行する時のテンプレート

Posted at

Play Framework 2.xSelenium 用テストを Specs2 で書いたとき、異なる WebDriver で同じテストコードを実行したいときの実装の仕方。

実装

基本は Play Framework が標準で用意している Selenium をサポートする WithBrowser クラスを活用する。

テストを抽象クラスとして作り WebDriverClassTag を暗黙の引数にすることで、具象実装は型パラメータをあてて拡張するだけとなる。

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] の部分はスペックごとに書かなければならないので、 結局コピペは必要になるところが、まだいまひとつなところです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12