読者です 読者をやめる 読者になる 読者になる

yfj2’s Automatic Web Test Related Blog

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

「第三回 システムテスト自動化 標準ガイド 読書会」を開催します

「第三回 システムテスト自動化 標準ガイド 読書会」を開催します

著者:ふじさわゆうき

更新日:2015/05/26

読書会概要

ソフトウェアのシステムテストの自動化に取り組むエンジニアにとってバイブルともいえる名著の「システムテスト自動化 標準ガイド」を1回2章ずつ進めていこうという勉強会です

開催日

2015/07/04(土) 14:30〜

申込ページ

software-test-automation.connpass.com

内容

  • 第5章 テストウェアアーキテクチャ
  • 第6章 前処理と後処理の自動化

「第二回 システムテスト自動化 標準ガイド 読書会」を開催してきた

「第二回 システムテスト自動化 標準ガイド 読書会」を開催してきた

著者:ふじさわゆうき

更新日:2015/05/24

読書会概要

ソフトウェアのシステムテストの自動化に取り組むエンジニアにとってバイブルともいえる名著の「システムテスト自動化 標準ガイド」を1回2章ずつ進めていこうという勉強会です。
前回、第1章と第2章で、今回は、第3章、第4章でした。

関係者への御礼

  • 「第3章スクリプティングの技法」を担当してくださった、@TakaakiOnoさん, @d_noguchiさん, @camxxmaさん、ありがとうございました。作成していただいた発表資料が良くまとまっていて、さらに、ディスカッションを盛り上げてただき感謝です。
  • 「第4章 自動比較」を担当してくださった、@toku_toku3さん、ありがとうございました。3日徹夜したうえで発表していただいたのにも関わらず、良くまとまっていてよかったです。私なら3徹した後にあの発表は無理です(笑)
  • いしじあつしさん、会場の手配、準備、片づけ、懇親会会場の手配、発表者のフォローなど色々と、コミュニティ運営、お疲れ様でした。いしじあつしさんさんがいなければ、今回も勉強会が成立しませんでした
  • 前回に引き続き、司会、進行を担当してくださった、@nihonbusonさん、ありがとうございました。当日、スムーズに勉強会を進めることができたのは@nihonbusonさんのお蔭です
  • 一緒に懇親会で語った@kanno_kannoさん、@_mirerさん、@azusaさん、@HiroakiTakahashiさん、ありがとうございました。最近の私の悩みや失敗談に突っ込みをいただき参考になりました。アドバイスを踏まえて、「相手の立場を理解する」ってことを意識して仕事を進めていきたいと思います。ブログでかける範囲で一番、印象に残ったのは「良いエンジニアの条件として、学歴は関係が無い。GitHubに自分のコードを上げたり、ツイッターで技術系の投稿を多くしたり、プログラムが好きだったり、そういうことが重要だ」ってところでした。
  • 参加者の皆様も、一緒にディスカッションを盛り上げていただきありがとうございました。
    • nedateさん、masatoshiitohさん、Programmerさん、makopi23さんsazanamiさん、dd_takakazuさん、megurunsさん、kz_suzukiさん、takahiro_itoさん、yamanotakahiroさん、sodaさん、shige-ponさん、i8_5327637さん、masafumi_umemuraさん、kuniiskywalkerさん、ANA_KUMAさん、yoshizawaさん

第3章スクリプティングの技法

  • 共有スクリプトの短所について、「私の仕事上でも困っているなー」ってこと。

私が所属している自動化チームの現状としては「構造化スクリプティング」「共有スクリプト」「データ駆動スクリプト」を組み合わせて、スクリプトを作っているけれど、「共有スクリプト」の管理は、正直、困っています。自動スクリプトを書いていると「あれ?このロジック、似たようなやつが複数あるじゃん」みたいな感じですね。解決していきたいな。。

  • 共有スクリプトの長所
    • 似たようなテストを実装する工数が少なくなる
    • メンテナンスコストがリニアスクリプトより小さくなる
    • あからさまな繰り返しをなくせる
    • 共有スクリプトにもっと知性を持たせることができる
  • 共有スクリプトの短所
    • 把握、ドキュメント化、名前付け、保管の対象となるスクリプトが増える
    • すべてのテストに特有のスクリプトが必要となりメンテナンスコストが高いまま
    • 共有スクリプトはテスト対象ソフトウェアの 一部分に特化されたものになりがちである
  • キーワード駆動スクリプトをできている会社がいたことに驚き
    • 参加者の方も交えて、「現在実施しているスクリプティングはどれでしょうか?」というディスカッションをしたところ「キーワード駆動スクリプト」を実施している会社様が3社ほどいました
    • 1社目は、現状は、「カオス」の一言でした。組織的には、テスト作成者とテストオートメータが分かれていて、その方は、テスト作成者側の人だったのですが、「こっちのキーワードが通るようになると、あちらのキーワードが失敗になる」みたいな現状とのことです。きっと、良い点もあると思うのですが、悪い点のほうが目立ってしまって、「カオス」って感じなんでしょう。
    • あと、残り2社は、「うまく回っている」とのことでした。ただ、上手くいっている要因は、聞く時間がありませんでした。是非、今後、参考にさせてほしいです

第4章スクリプティングの技法

  • 動的比較、実行後比較をわけて解説する必要はあるのだけど、わかりにくい
  • 動的比較とは、テストケースを実行しながら比較する手法のこと
    • 色々なツールでサポートされており人がチェックするのと同じように、画面に表示され るものをチェックするのに適している
  • 実行後比較とは、テストケースを実行した後に行われる比較のこと
    • 生成されたファイルやDBなど、画面出力以外のものを比較する際によく用いられる !
    • サポートしてるテスト実行ツールがあまりないの で、個別のツールを利用することが多い
  • 動的比較というと、xUnit系でassertすることが代表的。しかし、Eclipseだと、「動的比較」だし、Jenkinsだと、実行後に比較結果がでるという意味で「実行後比較」に思える

-

  • 上記ツイートのように「実行後比較」というと人が比較するものと勘違いが発生したりする
  • 画像比較は自動化しなくてもいいんじゃないかな
    • 画像比較は、出席者の方もいっていたが、センシティブなので自動比較はしていないとのこと
    • 自動化するなら、imagemagickを使う
    • Comparing -- IM v6 Examples
    • まとめで「ビットマップの比較を避ける」みたいのがあるし
  • センシティブとロバストの度合いはとても重要
    • 画像比較のようなものが一番センシティブ
    • assertで一つ一つ期待値と実行結果を一つ一つ比較していくのがロバスト
    • という理解
    • センシティブの感度を下げていくのはフィルター(常に失敗してしまう日付を固定文字に置き換えたりすること)を使うことで実現できる
    • センシティブなテストに対して、どの程度までフィルターをかけて、ロバストにしていくのか?その追及は、私のチームでも実施していきたい

次回の勉強会予定

  • 7月4日(土)に次回開催予定
  • 5章、6章です



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に興味がある方は、是非、勉強会にお越しください!!