yfj2’s Automatic Web Test Related Blog

yfj2のWEBテスト自動化に関わるブログ

Geb+Spockの実装例サンプルコード集

Geb+Spockの実装例サンプルコード集

著者:ふじさわゆうき

更新日:2015/01/25

目的

「Gebってせっかく便利で生産性の良い言語なのに多くの資料が英語だからイマイチ日本で広がらない」という問題を解決するには、お手本となる実装例のサンプルコードが沢山あればよいと考えて、このページにサンプルコードを発見し次第、リスト化してみることにします
ちょくちょく更新しようかと思うので、たまにチェックしてみてください

収集方法

サンプルコード集

日本Geb研究会のサンプルコード

muuminさんのサンプルコード

h-mochizukiさんのサンプルコード

Brian Rayさんのサンプルコード

Rob Fletcherさんのサンプルコード

Terry Weymouthさんのサンプルコード

Josh Hamitさんのサンプルコード

Craig Atkinsonさんのサンプルコード

Michael Lexさんのサンプルコード

Geb+SpockでJUnitのように複数テストクラスをグルーピング(TestSuite)して実行したい

【Geb】【Tips】Geb+SpockでJUnitのように複数テストクラスをグルーピング(TestSuite)して実行したい
著者:ふじさわゆうき

問題

  • JUnitのように複数テストクラスをグルーピング(TestSuite)して実行したいがわからない

解決

  • 以下、2つのアノテーションを使うことでTestSuiteを実行することができる
    • @RunWith(Suite.class)
    • @Suite.SuiteClasses
      • ここの引数として、グルーピングしたいTestClassを定義する
  • TestSuiteのクラス名は「***TestSuite」と後ろにTestSuiteとつければ何でもよい
    • 以下、実装例だと「public class GebTestSuite」

実装

import org.junit.runner.RunWith
import org.junit.runners.Suite

@RunWith(Suite.class)
@Suite.SuiteClasses([←ここにグルーピングしたいTestClassを定義する
	***Test.class,
        ***Test.class,
])

public class GebTestSuite {
}

GitHubでGeb+Spockの学習用(お手本用)ソースの公開を開始しました

GitHubでGeb+Spockの学習用(お手本用)ソースの公開を開始しました

著者:ふじさわゆうき

更新日:2015/01/25

目的

「Gebってせっかく便利で生産性の良い言語なのに多くの資料が英語だからイマイチ日本で広がらない」という問題を解決するには、お手本となるソースコードが沢山あればよいと考えてGeb+Spockの学習用(お手本用)ソースを日本Geb研究会で作成、公開を開始しました

想定ユーザー

  • これからGebを始める人
  • Gebの基礎を見直したい人

方針

ゴール

  • 「便利そうだし、サンプルもあるからGebをやってみよう!」となってくれること
  • 「Gebってこんな使い方もできるんだ」と発見があること

実行環境の準備

Gitインストール

  1. 以下のサイトからWindows用のGitをダウンロードしてインストール画面を起動する
    • 2015/01/25時点だと"Ver1.9.5"がダウンロード可能
    • Git
  2. インストール設定
    • インストール先: "C:\Program Files\Git"
    • f:id:yfj2:20141130173129p:plain
    • Adjusting your PATH environment: "Run Git from the Windows Command Prompt"
      • デフォルトはUse Git Bash onlyだが、これは使いにくいのでダメ。"Use Git from the Windows Command Prompt"を選択すること。cmd.exe、PowerShell.exe、MinGW/MSYSのbash.exeなど、他のコマンドラインシェルからもGitコマンドを使えるようになる
      • f:id:yfj2:20141130172755p:plain

Eclipseインストール

  1. Eclipseのインストール
  2. Groovy-Eclipseのインストール
    1. eclipseを起動する
    2. Help > Install New Softwear
    3. http://dist.springsource.org/release/GRECLIPSE/e4.3/ > Add
      • f:id:yfj2:20141026232108p:plain

Geb学習用ソースのダウンロード(Windowsベース)

  1. コマンドプロンプトを起動する
  2. git用のフォルダを作成する
    • (例)mkdir C:\gitrepository
  3. git用のフォルダに移動する
    • (例)cd C:\gitrepository
  4. GebStudy(Geb学習用ソース)をcloneする
  5. EcliseワークスペースにGebStudyをimportする
    • File > Import > Git > Projects from Git > Existing local repository > GebStudy > Import existing projects > Finish
    • f:id:yfj2:20150120005731p:plain
    • f:id:yfj2:20150120005839p:plain
    • f:id:yfj2:20150120010003p:plain
    • f:id:yfj2:20150120010322p:plain
  6. importが終わったらプロジェクトを更新する
    • GebStudy右クリック > Maven > Update Project > OK
    • f:id:yfj2:20150120010910p:plain

Gebテストを実行しながらGebを理解する

  1. Gebの公式マニュアルページを開く
  2. 4章の"Interacting with content"を開く
  3. 4章の"Interacting with content"学習用のテストファイルを開く
    • /GebStudy/src/test/groovy/jp/org/gebjp/manual/chapter4/InteractingWithContentTestSuite.groovy
    • "Per01_InteractingWithContentTest.groovy"―"Per13_InteractingWithContentTest.groovy"
  4. (Macの場合)GebConfig.groovyを開いて、Mac用のchromedriverを設定する
    • /GebStudy/src/main/resources/GebConfig.groovy
//こっちをコメントアウトする
//chrome - http://chromedriver.storage.googleapis.com/index.html
//System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe")

//コメントを外す
//For Mac
System.setProperty("webdriver.chrome.driver", "driver/chromedriver")
  1. テストスイートを実行する
    • InteractingWithContentTestSuite.groovy右クリック > Run As > JUnit Test
  2. テストが実行されることを確認する
    • 画面キャプチャー: /GebStudy/target/geb-reports/jp/org/gebjp/manual/chapter4
    • テスト結果: /GebStudy/build/spock-reports
  3. ソースコード中の"debug.printContents"を利用するとログが出力されるのでそれをみながら学習する

古くなったらソースコードを最新にしましょう

  1. コマンドプロンプトを起動する
  2. git用のフォルダに移動する
    • (例)cd C:\gitrepository\GebStudy
  3. 同期をとるコマンドを実行する
    • git fetch origin
    • git reset --hard origin/master

まとめ

  • もっとGebを勉強したくなったら、是非、勉強会に参加してください!
  • 今回の"GebStudy"をもとにプレゼンします

GebConfig.groovyに設定値を定義してSpockテストでその定義を呼び出したい

【Geb】【Tips】GebConfig.groovyに設定値を定義してSpockテストでその定義を呼び出したい
著者:ふじさわゆうき

問題

  • Geb+Spockの正常系のテストにおいて、ユーザーID、パスワードを共通設定ファイルに定義しておくと全テストケースで共有できるので定義したい。しかし、Geb+Spockにおいてその方法がわからない

解決

  • "GebConfig.groovy"に共通設定を定義することで全テストケースで共有することができる
  • 以下の文法で"GebConfig.groovy"に定義した設定値をテストケースで呼び出すことができる
browser.config.rawConfig.[key]
例:browser.config.rawConfig.userId

実装

  • 「googleログイン画面にアクセス」→「ログイン処理」→「アカウント設定画面」というテストケースをもとに実装の説明を進める

設定化前

  • 「$("form").Email = "test@gmail.com"」のようにメールアドレスがテストコードに書かれているので、他テストケースとユーザーIDを共有することができない。つまり、ユーザーIDに変更があった場合は、すべてのテストケースを修正する必要がでてくる


  • ConfigTest.groovy
import geb.spock.GebSpec

class ConfigTest extends GebSpec {

	def "google login test"() {
		setup:
		def googleLoginUrl = "https://accounts.google.com"

		when:
		go googleLoginUrl

		then:
		waitFor{ title == "ログイン - Google アカウント" }

		when:
		$("form").Email = "test@gmail.com"
		$("form").Passwd = "password"
		$("input" , name:"signIn").click()

		then:
		waitFor{ title == "アカウント設定"}
	}
}

設定化後

  • "googleUserId"と"googlePassword "を"GebConfig.groovy"に定義することで、他テストケースと共有することができるようにしている
    • 「key = value」の形式で定義
  • "ConfigTest.groovy"では、"GebConfig.groovy"で定義した"googleUserId"と"googlePassword"を呼び出している
    • def googleUserId= browser.config.rawConfig.googleUserId
    • def googlePassword= browser.config.rawConfig.googlePassword


  • GebConfig.groovy
googleUserId = "test@gmail.com"
googlePassword = "password"
  • ConfigTest.groovy
import geb.spock.GebSpec

class ConfigTest extends GebSpec {

	def "google login test"() {
		setup:
		def googleLoginUrl = "https://accounts.google.com"
		def googleUserId = browser.config.rawConfig.googleUserId
		def googlePassword = browser.config.rawConfig.googlePassword

		when:
		go googleLoginUrl

		then:
		waitFor{ title == "ログイン - Google アカウント" }

		when:
		$("form").Email = googleUserId
		$("form").Passwd = googlePassword
		$("input" , name:"signIn").click()

		then:
		waitFor{ title == "アカウント設定"}
	}
}

第一回Geb勉強会を開催します

Gebって素晴らしい言語だなって感じて、このブログを通じてGeb布教中のふじさわゆうきです。


個人的な感触として、

  • せっかく便利な言語なのに多くの資料が英語だからイマイチ日本で広がらない
  • 言語がGroovyだからとっつきにくい

などの理由でいまいち浸透していない気がするので、まずは勉強会の成果を発信することでそういう問題を解決していこうということが目的の勉強会です。その成果をネットで公開して日本語の資料の充実を図っていく、そしてGebという言語が広がっていったら成功だと思っています。そういう流れを作っていきたいと思います。


そんな目的から、Geb勉強会を2015/01/31(土)に開催します。場所は、「東京都中央区銀座4-12-15(歌舞伎座タワー14Fセミナールーム)」です。

第一回目(2015/01/31(土))は、高橋 陽太郎(@PoohSunny)さんと私で、Gebのメリットを皆さんにお伝えできたらと思っています。


第二回目2015/03ごろ)としては、テスト自動化で有名な玉川紘子さんにもGebのメリットをプレゼンしていただく予定です。
WebDriverよりも生産性の良い言語を探している方、seleniumIDEから自動化のためにWebDriver化を検討しているかた、Gebに興味がある方は、是非、勉強会にお越しください!!

GebとSpockでテストケースの中でクッキー(cookie)の値をテストしたい

【Geb】【Tips】GebとSpockでテストケースの中でクッキー(cookie)の値をテストしたい
著者:ふじさわゆうき

問題

  • クッキーに訪問履歴等を格納するWebサイトにおいて、それらの情報がクッキーに格納されているかテストしたいが、Webツールを使って手動で確認しなければならないので手間になっている

解決

  • クッキーの情報をGebとspockで取得できるようにして自動テストすれば解決する

実装

  • seleniumのライブラリを使って、クッキーを管理するクラス(GebCookieUtilクラス)を作成する
    • "driver.manage()"でOptionsを取得する
    • "options.getCookies()"でクッキーのリストを取得する
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriver.Options;

public class GebCookieUtil {

	private Options options = null;

	public GebCookieUtil(WebDriver driver) {
		this.options = driver.manage();
	}

	/**
	 * Cookiesコンソールに出力します
	 */
	public void printCookies() {
		System.out.println("--start getCookies-----");
		for (Cookie cookie : options.getCookies()) {
			System.out.println(String.format("key: %s, value: %s",
					cookie.getName(), cookie.getValue()));
		}
		System.out.println("--end getCookies-----");
	}

	/**
	 * クッキーから値を取得します
	 * 
	 * @param key
	 * @return
	 */
	public String getCookieVal(String key) {
		String result = null;
		for (Cookie cookie : options.getCookies()) {
			if (cookie.getName().equals(key)) {
				result = cookie.getValue();
				break;
			}
		}
		return result;
	}

        /**
	 * クッキーに値をセットします
	 * 
	 * @param key
	 * @param val
	 */
	public void setCookieVal(String key, String val) {
		options.addCookie(new Cookie(key, val));
	}
}
  • "new GebCookieUtil(driver)"で、GebCookieUtilをdriverで初期化している
  • "@Shared"でテストケース共通でクッキーを取り出せるようにしている
  • "cookieUtil.getCookieVal("JV")"で、"JV"に合致するクッキーの値を取得する
  • 以下、例だと、Yahooは、検索後に"JV"というキーでクッキーに値を記録していることがテストできる
import geb.spock.GebSpec
import spock.lang.Shared
import util.GebCookieUtil

class CookieUtilTest extends GebSpec {

	@Shared GebCookieUtil cookieUtil = new GebCookieUtil(driver)

	def "output cookie"() {
		when:
		go "http://www.yahoo.co.jp"

		then:
		waitFor{ title == "Yahoo! JAPAN"}
		cookieUtil.printCookies()
		assert cookieUtil.getCookieVal("JV") == null

		when:
		$("form").p = "sample"
		$("input",value:"検索").click()

		then:
		waitFor{ title == "「sample」の検索結果 - Yahoo!検索"}
		cookieUtil.printCookies()
		assert cookieUtil.getCookieVal("JV") != null
	}
}
  • 出力結果
--start getCookies-----
key: btpdb.2wzBV9u.dGZjLjE0NDcxNDU, value: UkVRVUVTVFMuMA
key: btpdb.2wzBV9u.dGZjLjE0MzQzNDg, value: VVNFUg
key: B, value: 0v43bbpaao770&b=3&s=vt
--end getCookies-----
--start getCookies-----
key: B, value: 0v43bbpaao770&b=3&s=vt
key: SGL, value: oIPUi_mbLv0rvzxfn3RiwyOcEu5XVFDvMP8hqs.NSjxcmNUHFKrcW2A1Hiv94CcPm92FKmgCZbzT7Cz1R54EKfflu_T1YVBuFhc72Hhjbp73_s8HCGWZufrYt5VkJTR5934wHIBE6Nih03mi1sdhnmYpanyFuOiW2kz.P3gAD.zufV4baMXr8ZSS0rPEXdqJTc7mDFm9rtg-
key: JV, value: LgRZRkUq.R_PaPKPFI8dHc1pZfoYZlCYP_19xcf1_hKIvK5dcw5rFM0DkDNIl7XLrOnhfO5Xa6uUGFy6rAT2I2GOnSJn8owoDEvJjy5_AgGH.prYycoGGkHFoYKvFgQpAb9xnfOoQgenrwkcMLox.hA1649ZFGS7lqIlzJXCkA_7qYSkEeRBLy5bM9LTt8i_c9oK3Dz5gj4b.si6igf4y8tTJkd51J.JpYUjP_aGXWrPd4ac_ioh0NavQs2hfcCAQ1enfs8pNJ4ThWIuipotIhi.O2r_aflzQZtrEh7BBnNXE4U_18BS7fMKm2FvHt100pxWUEghsrE.E8etAoOlJeJ1i_boBrC_pb9qIP2Qf8NyeXesnaghII6yw5lu.ReMntJBiyzqev9k9jkyd99aDovHAXMf6vlAGOr2QqIW64R11rb2fJgQ6OeHD14v9fwk.tmvKlxA12CTpHTNkUe91xtvVpWDfiBytYbiacM-
--end getCookies-----

GebとSpockで取得したタグを確認したい

【Geb】【Tips】GebとSpockで取得したタグを確認したい
著者:ふじさわゆうき

問題

  • 取得したいタグが取得できていないが原因がわからずにトライアンドエラーになってしまい問題解決に時間がかかってしまう。

原因

  • タグ検索結果をログ出力しないために手さぐりの解決になってしまっていること

解決

  • タグの検索結果をコンソールログに出力することで、どのようなミスをしているのか確認できるようにする。そうすることで、問題の切り分けが可能になる
  • 以下、ヤフートップページにある"inputタグ"全部をコンソールログに出力するプログラムのサンプル
  • コンソールログに出力することで、"inputタグ"から絞り込むためのヒントとなる
    • 「$("input").each」はgroovyの命令で、"inputタグ"の配列をloopする命令
    • "it"は、"input"タグのこと
      • 詳しくは、「groovy クロージャ it」でgoogle検索してみること
    • "it.getAttribute("name")"は、"input"タグのname属性を取得するメソッド
class DebugTest extends GebSpec {

	def "output debug log"() {
		when:
		go "http://www.yahoo.co.jp"

		then:
		waitFor{ title == "Yahoo! JAPAN"}
		$("input").each{
			println "name: " + it.getAttribute("name") +
					", type: " + it.getAttribute("type") +
					", value: " + it.getAttribute("value")
		}
	}
}
  • 実行結果
name: p, type: text, value: 
name: , type: submit, value: 検索
name: search.x, type: hidden, value: 1
name: fr, type: hidden, value: top_ga1_sa
name: tid, type: hidden, value: top_ga1_sa
name: ei, type: hidden, value: UTF-8
name: aq, type: hidden, value: 
name: oq, type: hidden, value: 
name: afs, type: hidden, value: 
name: p, type: text, value: 
name: , type: submit, value: 検索
name: search.x, type: hidden, value: 1
name: fr, type: hidden, value: top_ft
name: tid, type: hidden, value: top_ft
name: ei, type: hidden, value: UTF-8