SlideShare a Scribd company logo
Webアプリのシナリオテスト自動化を
運用に乗せるまでの10のステップ
at BIZREACH
2016.9.13
まずは自己紹介。
岩見直樹 https://github.com/naoki-iwami
マネージャ兼チーフエンジニア
主な言語:Java, Spring framework, Groovy, …
Limy Eclipse plugin, ermaster-b, jdynamo, …
最近はDockerが楽しい
今日の話
シナリオテスト自動化を実現するまでに
苦労したことの話とか、テクニックなど
今日のアジェンダ
・使うツールの紹介(Spock, Geb, Gradle)
・環境構築のやり方
・とりあえずGebでテスト書いてみる
・運用に乗せるためのTIPS x 10
・まだやれていないこと、今後やりたいこと
質疑応答
今日のゴール
Webアプリをローカル環境で動かして、画面ベースのシナリ
オテストを実行する。
実行結果はレポート出力され、画面キャプチャも付いてくる。
テストはコマンド一発で実行でき、かつ確実に
動作する
画面テストあるある
作ったはいいが、○○さんのローカルでしか動かない
3回に1回くらいの割合でテストが失敗する
画面のちょっとしたレイアウト変更があるだけで
テストが失敗する
テストコードがDirtyすぎて誰も保守できない
1ケース作るのに2時間くらい掛かる
使うツール
Spock
Geb
Gradle
Chrome
今回導入したプロダクト
https://br-campus.jp/
アプリ構成
【言語】 Java8 + Lombok
【フレームワーク】 Spring Boot
【テンプレート】 Thymeleaf
【フロント】 SCSS, ECMAScript 2015, Knockout.js
【ビルド】 Maven, node.js (gulp)
【IDE】 IntelliJ
Spockの紹介 http://spockframework.org/spock/docs/1.1-rc-2/index.html
Groovy ベースのテストフレームワーク
・JUnit互換
・アサーションが直感的でわかりやすい
when-then など
・豊富なExtension ex. @IgnoreIf, @Unroll
・繰り返しのパターンテストも得意
・Geb と併用すると相性が良い
導入 - Spock
Maven Gradle
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.1-groovy-2.4-rc-1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-spring</artifactId>
<version>1.1-groovy-2.4-rc-1</version>
</dependency>
apply plugin: 'groovy'
testCompile 'org.spockframework:spock-core:1.1-groovy-2.4-rc-1'
testCompile 'org.spockframework:spock-spring:1.1-groovy-2.4-rc-1'
Spock でテスト書いてみる
src/test/groovy/ 以下に .groovy ファイルを作ります。
テスト名はこのように日本語で書くのがSpock流(?)
実行は IDE に応じて Ctrl + Shift + F10 などで。
class SampleSpec extends Specification {
def "サンプルテスト"() {
setup:
// 初期処理
assert count > 0
}
}
← Spock だとsetupブロックが必要
← アサーション処理
導入 - Gradle
Spock は Maven からも使えますが、Groovy ベースというこ
ともあって Gradle との相性がいいです。
というわけで、Gradle 導入しましょう!
Maven のプロジェクトで Gradle を導入するのは、比較的簡
単です。
※ Maven + Gradle のハイブリッド構成
Maven
pom.xml
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.1-groovy-2.4-rc-1</version>
<scope>test</scope>
</dependency>
こんなに簡単です。
Gradle
build.gradle
dependencies {
compile 'org.thymeleaf:thymeleaf:2.1.4.RELEASE'
testCompile 'org.spockframework:spock-core:1.1-groovy-2.4-rc-1'
}
Maven → Gradle
Gradle にはサブプロジェクトの概念があります。
よって、複数のプロジェクトがあっても
build.gradle は共通で一つ作ればOKです。
Maven Gradle
ROOT
|
|-- common
| |
| |-- pom.xml
|
|-- app-a
| |
| |-- pom.xml
|
|-- app-b
|
|-- pom.xml
ROOT
|
|-- common
|-- app-a
|-- app-b
|
|-- build.gradle
|-- settings.gradle
← ここに全ての設定
← サブプロジェクト名の
一覧
Gradle を使ってテストを実行
コマンドラインから以下で。
Gradle では実行の単位を「タスク」と呼びます。
上のコマンドでは、testタスクを実行しています。
※ Maven でいうゴールみたいなもの
gradle test
Gradle にはプラグインという概念があります。
これは一連の依存関係(dependency)やタスクなどを定義
したものです。
build.gradle
apply plugin: 'java' ← これが test タスクを提供
apply plugin: 'groovy'
Geb (ジェブ)の紹介 http://www.gebish.org/
Selenium ベースの画面テストツール
・Groovy なので、コードが読みやすい
・jQuery ライクなAPI
・画面に特化したアサーション
・Groovy のクロージャを使った
わかりやすい alert や新規タブなどの処理
・ページオブジェクトパターン
導入 - Geb
準備が整ったところで、Geb を導入します。
別途 WebDriver が必要になります。
今回は ChromeDriver を採用します。
build.gradle
compile 'org.gebish:geb-spock:0.13.1'
compile 'org.seleniumhq.selenium:selenium-chrome-driver:2.53.1'
compile 'org.seleniumhq.selenium:selenium-support:2.53.1'
compile 'org.seleniumhq.selenium:selenium-api:2.53.1'
ChromeDriver のダウンロード
https://sites.google.com/a/chromium.org/chromedriver/downloads
ここに Linux, Mac, Windows それぞれのバイナリが用意され
ているので、環境に応じたものをダウンロードしておきまし
ょう。
ドライバのバイナリはそれほど大きいサイズではないので、
Git リポジトリに追加してしまいます。
git fetch したら誰でも使えるのが重要!
Geb の設定ファイル
src/test/resources/ の下に
GebConfig.groovy ファイルを作ります。
import org.openqa.selenium.chrome.ChromeDriver
import geb.report.ScreenshotReporter
import java.util.concurrent.TimeUnit
System.setProperty("webdriver.chrome.driver", "./driver/chromedriver_mac")
driver = {
def driver = new ChromeDriver()
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS)
driver
}
reportsDir = "./build/reports/tests/capture"
reporter = new ScreenshotReporter()
← WebDriver バイナリの配置場所
← タイムアウト設定
← return driver の略
← キャプチャ関連
Geb でテスト書いてみる
GebReportingSpec を使うと、画面キャプチャが撮れる。
※ 出力場所は GebConfig に記述
class SampleGebSpec extends GebReportingSpec {
def "画面テスト"() {
setup:
go "http://localhost:8080/mypage/"
$('.main_button').click()
waitFor { $('.next_button').size() > 0 }
report "画面A"
}
}
← ブラウザでURLを開く
← 要素(ボタン)を指定してクリック
← 特定の要素が出現するまで待つ
← 画面キャプチャを撮る
GebReportingSpec を使うと画面キャプチャが撮れる!
Gradle + Geb
ここまで来れば、Gradle + Geb で画面テストをする準備が
整いました。
これで、Geb のテストが実行され
build/reports/tests/
にテストレポートが出力されます。
gradle test
Gradle によるテストレポート
おめでとうございます!
…が、ここからが本番です。
実際にシナリオテストを運用に乗せるためには、これだけで
は全然足りません。
・テストを実行するための前準備が大変
・よくテストが失敗する
・レポート結果がわかりにくい
・スマホでもテストしたい
一つ一つ、解決していきましょう。
【Case 1】クリックに失敗する
画面テストはロジックのユニットテストとは違い、ブラウザ
を介して行われます。
そのため、いくつかのテクニックが必要になります。
【Case 1】クリックに失敗する
ボタンのクリック
Geb では一般的にボタンのクリックは以下のようにします。
しかしこれが失敗することがあります。
Geb には Selenium をラップした WebElement というクラ
スがあり、これの click() は特定の条件下でないと成功しない
$('.btn').click()
クリックに失敗する 解決策
このような場合、WebElement のラップを外し
素の Selenium の click イベントを発動させます。
import org.openqa.selenium.WebElement
import org.openqa.selenium.interactions.Actions
def rawClick($el) {
def actions = new Actions(browser.driver)
if ($el instanceof WebElement) {
actions.click($el).build().perform()
} else {
def $fel = $el.firstElement()
actions.click($fel).build().perform()
}
}
← Actions クラスを使う
← 要素を指定して直接クリックイベントを発動
クリックに失敗する 解決策2
さらに、その要素がスクロール外にある場合は以下のように
します。
def moveToClick($el) {
def actions = new Actions(browser.driver)
def $fel = $el.firstElement()
actions
.moveToElement($fel, ($fel.getSize().width / 2).intValue(), ($fel.getSize().height / 2).intValue())
.build().perform()
$fel.click()
} ↑ 要素までスクロールさせた後クリックする。
確実にクリックできるように、要素の真ん中にオフセットを指定
【Case 2】アニメーションやAjaxのせいでテストが失敗
最近のWebサイトはAjaxやアニメーションなどの非同期処理
が多いので、そのための対策が必要です。
// 単純に一定時間待つ(ms)
sleep 500
// 指定した要素が表示されるまで待つ
waitFor { $('.xxx').size() > 0 }
【Case 2】アニメーションやAjaxのせいでテストが失敗
【Case 3】最初のテストがタイムアウトになる
Webアプリは常駐型アプリなので、アプリ起動時は処理に時
間が掛かる場合があります。
例えば Spring で lazy initialize を使っている場合、最初のア
クセス時に各コンポーネントが初期化されるため時間が掛か
ります。
【Case 3】最初のテストがタイムアウトになる
最初のテストがタイムアウトになる 解決策
このような場合、アプリをあっためる用のテストを別途用意
します。
class AaaStarterSpec extends AbstractScenarioGebSpec {
def "シナリオテスト開始にあたってアプリケーションをあっためるためのテスト"() {
setup:
(1..3).each {
try {
loginCandidate()
} catch (Exception | AssertionError e) { /* ignore */ }
}
}
}
← シナリオの最初に実行するため名前をAAAに
← 3回ループしてログイン処理を行う
↑ 失敗しても無視する
【Case 4】テストケースを作るのが大変
シナリオテストのケースを作成していく上で、プロジェクト
に特化したユーティリティ関数の作成は必須です。
これが無いと、テストケースを作る工数が掛かり、運用が回
らなくなります。
【Case 4】テストケースを作るのが大変
AbstractSpec を作って、ユーティリティ関数を作る!
テストケースを作るのが大変 解決策
・フォームへの入力補助
formInput(
'lastName': '山田',
'firstName': '太郎'
)
・イベントハンドラ
findClickableElement('reportObSubmit').click()
・共通的な画面処理(ユーザ登録など)
registerUser()
・ランダム文字列生成
def email = createRandomEmail()
・ポップアップ関連
waitShowPopup($('#jsi-popup-apply'))
・正規表現で指定可能なURLのアサーション
waitForUrl(~/events¥/[0-9]+/)
← これは必須。
name属性やID指定、JSライブラリ対応など
← イベントハンドラは
JSライブラリに合わせた対応が望ましい
← 複数のシナリオで使う処理は共通化する
← DBのユニーク制約への対応
← 使っているポップアップのライブラリに応じて
← これが無いとアサーションが難しい場合がある
【Case 5】テストレポートにキャプチャが無い
Gradle を使っていれば gradle test とやるだけで
それなりのテストレポートが出力されますが
いくつか足りない点があります。
その一つが画面キャプチャです。
GebReportingSpec を使うと画面キャプチャが撮れる。
が、テストレポートには出力されない!
テストレポートにキャプチャが無い 解決策
やや強引ですが、Gradle スクリプト内でレポートHTMLにキ
ャプチャ画像を貼り付けています。
task appendCaptureToReport() << {
def File basedir = project.projectDir
def root = new File(basedir, 'build/reports/tests/capture')
// キャプチャ画像ファイル一覧を取得
def buffs = [:]
root.eachFileRecurse(FileType.FILES) {
buffs[dir] << picName
}
… コードが長いので、全文は gist で
https://gist.github.com/naoki-iwami/c5ceba0b02bee3b6bbcd1545c111ab98
}
gradle appendCaptureToReport
【Case 6】テストの前準備が大変
シナリオテストをやるには、予めWebアプリを起動しておく
必要があります。
また、テストデータの準備も必要になります。
自動化するためには、その処理も一括してやらなければなり
ません。
テストはコマンド一発で確実に起動できないとダメ!
テストデータについて
シナリオテストをやる上で、テストデータをどうするかは重
要です。
・テストに必要なデータを画面から全て作成する
・予めテストデータを用意しておく
今回は後者を採用します。
テストの前準備が大変 解決策
Gradle でシナリオテスト用のタスクを作ります。
・(既に起動していれば)WebアプリのプロセスをKILL
・テストデータ初期化
・Webアプリ起動
・シナリオテスト実行
・WebアプリのプロセスをKILL
Gradle の独自タスクを使って一括処理を書く!
テストの前準備が大変 解決策
task('e2test', type: Test) {
def Process applicationProcess
doFirst {
killAllBootApplication.execute()
replaceSchema.execute()
applicationProcess = startBoot('zero-candidate', 'jp.bizreach.zero.candidate.CandidateStarter')
e2testPcLocal.execute()
}
finalizedBy(killApplicationTask)
}
← test タスクを継承したタスクを作成
← (1) 既に起動済のWebアプリのプロセスをKILL
← (2) テストデータ初期化
↑ (3) Webアプリを起動
← (4) シナリオテストの実行
← (5) WebアプリのプロセスをKILL
※ doAfter でやると、テスト失敗時に実行されない
テストの前準備が大変 解決策(続き)
task killAllBootApplication(type: Exec) {
executable 'sh'
args '-c', '/usr/bin/pgrep -lf java | grep "jp.*Starter" | cut -d" " -f1 | xargs kill -9'
ignoreExitValue true
}
task replaceSchema(type: Exec) {
workingDir "$rootProject.projectDir/script"
commandLine './replace_schema.sh'
}
task killApplicationTask << {
applicationProcess.destroy()
}
← Exec タスクで外部プロセスを実行できる
← 実行するディレクトリを指定
← finalizedBy から呼び出されるタスク
タスク内で別タスクを呼び出したり
テストの前準備が大変 解決策(続き)
def startBoot(subProjectName, mainClassName) {
ProcessBuilder builder = new ProcessBuilder("./gradlew", ":${subProjectName}:bootRun")
builder.redirectErrorStream(true)
builder.directory(project.projectDir)
builder.environment().put('MAIN_CLASS_NAME', mainClassName)
def process = builder.start()
InputStream processStdout = process.getInputStream()
BufferedReader reader = new BufferedReader(new InputStreamReader(processStdout))
def readyStatusString = 'Tomcat started on port'
def line
while ((line = reader.readLine()) != null) {
println line
if (line.contains(readyStatusString)) {
println 'application ready.'; break
}
}
return process
}
↑ サブプロジェクトのGradleタスク実行
← Webアプリの起動
← アプリの初期処理が完了するまで待つ
タスク内で関数を呼び出したり
【Case 7】スマホでテストしたい
Geb を普通に使うと、ブラウザのサイズはPC用になります。
スマホ用のテストを書く場合は、WebDriver をそれ用にカス
タマイズして初期化する必要があります。
スマホでテストしたい 解決策
GebConfig.groovy
def mobileEmulation = new HashMap<String, String>()
mobileEmulation.put("deviceName", "Apple iPhone 5")
def chromeOptions = new HashMap<String, Object>()
chromeOptions.put("mobileEmulation", mobileEmulation)
def capabilities = DesiredCapabilities.chrome()
capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions)
driver = new ChromeDriver(capabilities)
driver.manage().window().setSize(new Dimension(320, 568))
← デバイス名を指定(WebDriver依存)
← ChromeDriver作成時に capabilities を指定
← 画面解像度の指定
【Case 8】スマホとPC両方でテストしたい
前述したように、WebDriver の初期化時にスマホ用かPC用
かを切り分ける必要があるので
スマホとPC両方のテストをしたい場合は
それ用に Gradle タスクを作る必要があります。
画面テストは複数タスクに切り分ける!
スマホとPC両方でテストしたい 解決策
build.gradle
task('e2testMobileLocal', type: Test) {
systemProperty 'enableE2eMobileTest', 'true'
filter {
includeTestsMatching "jp.bizreach.zero.common.scenario.mobile.*"
}
}
task('e2testPcLocal', type: Test) {
systemProperty 'enableE2ePcTest', 'true'
filter {
includeTestsMatching "jp.bizreach.zero.common.scenario.pc.*"
}
}
← シナリオテスト(スマホ用)タスク
← テストするパッケージを指定
← シナリオテスト(PC用)タスク
← テストするパッケージを指定
タスク毎にテスト実装パッケージを分ける
スマホとPC両方でテストしたい 解決策(続き)
GebConfig.groovy
if (System.getProperty('enableE2eMobileTest')) {
// スマホ用に WebDriver を初期化
} else {
// PC用に WebDriver を初期化
}
切り分けは、build.gradle + GebConfig.groovy で
【Case 9】通常のテストではシナリオテストしたくない
今度は逆のケースで、gradle test とやったときに
シナリオテストが実行されてしまうと
そのための初期処理がされていないので、テストが失敗して
しまいます。
通常のテストではシナリオテストを実行させたくない!
通常のテストではシナリオテストしたくない 解決策
@IgnoreIf({ sys['enableE2ePcTest'] == null})
class CompanyScoutScenarioSpec extends AbstractScenarioGebSpec {
...
}
↑ 特定のシステム変数がセットされている場合のみテストを実行
※ sys[...] は System.getProperty の簡易記法(Spock)
Spock の @IgnoreIf で解決!
通常のテストではシナリオテストしたくない 解決策2
ただしこれだと、IDEからテスト実行した時に
テストがスキップされてしまう。
@IgnoreIf は基底クラスのSpecに付けても機能しないので、
各Specに付ける必要があります。
@IgnoreIf({ sys['enableE2ePcTest'] == null && sys['idea.junit.sm_runner'] == null})
class CompanyScoutScenarioSpec extends AbstractScenarioGebSpec {
...
}
↑ IntelliJ対応
IDEからテスト実行したときの環境変数を使う!
【Case 10】全画面キャプチャを撮りたい
ChromeDriver の画面キャプチャは、表示範囲のみの画面キ
ャプチャとなります。
つまり、スクロールした先の画面までは出力されません。
【Case 10】全画面キャプチャを撮りたい
これを解決するために AShot という
ライブラリがあるのでこれを使います。
全画面キャプチャを撮りたい 解決策
buid.gradle
testCompile 'ru.yandex.qatools.ashot:ashot:1.5.2'
XXXSpec.groovy
def captureFull(label) {
def shot = new AShot()
.shootingStrategy(ShootingStrategies.viewportPasting(100))
.takeScreenshot(driver)
def image = shot.image
File outputfile = new File(getReportGroupDir(), 'FULL-' + label + ".png")
ImageIO.write(image, "png", outputfile)
}
← AShot 対応
← 100msごとに画面をスクロールして
キャプチャを撮る
← 撮ったキャプチャをファイルに保存
AShot はキャプチャのイメージ作るところまで。
ファイル出力は自分でやる
全画面キャプチャを撮りたい 解決策
【Case 11】全画面キャプチャが崩れる
固定ヘッダ・フッタのある画面の場合、前述した方法だと正
しいキャプチャが撮れません。
【Case 11】全画面キャプチャが崩れる
これを解決するために、
固定ヘッダ用のキャプチャクラスを
作りました。
全画面キャプチャが崩れる 解決策
def captureFull(label, prop = [:]) {
capture label
def fixedHeaderHeight = 60
def fixedFooterHeight = 0
if (prop['footer']) {
fixedFooterHeight = prop['footer'].getHeight()
}
def shootingStrategy = new CustomizeViewportPastingDecorator(
new SimpleShootingStrategy(), fixedHeaderHeight, fixedFooterHeight).withScrollTimeout(100)
def shot = new AShot()
.shootingStrategy(shootingStrategy)
.takeScreenshot(driver)
def image = shot.image
File outputfile = new File(getReportGroupDir(), 'FULL-' + label + ".png")
ImageIO.write(image, "png", outputfile)
}
https://gist.github.com/naoki-iwami/4cf5e6aed62b39bb7fd15dbf5adc0940
← ヘッダは60pxで固定
← フッタは画面に応じて変わるので
引数に [ ‘footer’: $(‘.footer’) ]
のように渡す
↑ ヘッダとフッタの高さを指定して
ShootingStrategy を作成
全画面キャプチャが崩れる 解決策
ここまで出来るようになりました。
・テスト成功率の向上(95%以上)
・キャプチャが付与されたテストレポートの出力
・テストの一発実行
・スマホ端末でのテスト
・全画面キャプチャ
しかしまだまだ、足りない点はあります。
・検証環境でもテストしたい
・テストレポートをチーム全員で共有したい
・キャプチャを一覧で確認する画面が欲しい
・テストレポートの履歴を残したい
・シナリオテスト実行時のカバレッジを計測したい
・テスト実行時間をもっと速くしたい
次回があれば、これらについてもトライしていきます。
最後にちょっと宣伝
ビズリーチでは、共に働いてくれる仲間を募集しています。
https://www.bizreach.co.jp/recruit/
・エンジニア
・デザイナー
・プロダクトマネージャ
プロダクトの力を信じている人の
応募をお待ちしています!
ご清聴ありがとうございました
at BIZREACH
2016.9.13

More Related Content

What's hot

脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに
Hiroko Tamagawa
 
Gradle handson
Gradle handsonGradle handson
Gradle handson
Nemoto Yusuke
 
Spring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswersSpring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswers
Takuma Watabiki
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basic
Takuma Watabiki
 
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
Yuki Fujisawa
 
今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeomantomo_masakura
 
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
JavaEE7徹底入門 プレゼンテーション層の開発 JSFJavaEE7徹底入門 プレゼンテーション層の開発 JSF
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
Masuji Katoda
 
View customize pluginを使いこなす
View customize pluginを使いこなすView customize pluginを使いこなす
View customize pluginを使いこなす
onozaty
 
テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術
Y Watanabe
 
Jjug 20140430 gradle_advanced
Jjug 20140430 gradle_advancedJjug 20140430 gradle_advanced
Jjug 20140430 gradle_advanced
Masatoshi Hayashi
 
最近作ったもの
最近作ったもの最近作ったもの
最近作ったもの
onozaty
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
Takahiro Sugiura
 
Gradle布教活動
Gradle布教活動Gradle布教活動
Gradle布教活動
Nemoto Yusuke
 
GrailsでSpringをGroovyにしよう!
GrailsでSpringをGroovyにしよう!GrailsでSpringをGroovyにしよう!
GrailsでSpringをGroovyにしよう!
Tsuyoshi Yamamoto
 
【B-1】kintoneでお手軽コールセンター!
【B-1】kintoneでお手軽コールセンター!【B-1】kintoneでお手軽コールセンター!
【B-1】kintoneでお手軽コールセンター!
Sakae Saito
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
Fumihiko Shiroyama
 
テスト自動化ツール[Selenium]を検討してみて
テスト自動化ツール[Selenium]を検討してみてテスト自動化ツール[Selenium]を検討してみて
テスト自動化ツール[Selenium]を検討してみて
裕史 川松
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
Oda Shinsuke
 
JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行
Yoshitaka Kawashima
 
Jenkinsプラグイン開発
Jenkinsプラグイン開発Jenkinsプラグイン開発
Jenkinsプラグイン開発Takahisa Wada
 

What's hot (20)

脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに
 
Gradle handson
Gradle handsonGradle handson
Gradle handson
 
Spring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswersSpring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswers
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basic
 
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
 
今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman
 
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
JavaEE7徹底入門 プレゼンテーション層の開発 JSFJavaEE7徹底入門 プレゼンテーション層の開発 JSF
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
 
View customize pluginを使いこなす
View customize pluginを使いこなすView customize pluginを使いこなす
View customize pluginを使いこなす
 
テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術
 
Jjug 20140430 gradle_advanced
Jjug 20140430 gradle_advancedJjug 20140430 gradle_advanced
Jjug 20140430 gradle_advanced
 
最近作ったもの
最近作ったもの最近作ったもの
最近作ったもの
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
Gradle布教活動
Gradle布教活動Gradle布教活動
Gradle布教活動
 
GrailsでSpringをGroovyにしよう!
GrailsでSpringをGroovyにしよう!GrailsでSpringをGroovyにしよう!
GrailsでSpringをGroovyにしよう!
 
【B-1】kintoneでお手軽コールセンター!
【B-1】kintoneでお手軽コールセンター!【B-1】kintoneでお手軽コールセンター!
【B-1】kintoneでお手軽コールセンター!
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 
テスト自動化ツール[Selenium]を検討してみて
テスト自動化ツール[Selenium]を検討してみてテスト自動化ツール[Selenium]を検討してみて
テスト自動化ツール[Selenium]を検討してみて
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行
 
Jenkinsプラグイン開発
Jenkinsプラグイン開発Jenkinsプラグイン開発
Jenkinsプラグイン開発
 

Viewers also liked

QAアーキテクチャの設計による 説明責任の高いテスト・品質保証
QAアーキテクチャの設計による説明責任の高いテスト・品質保証QAアーキテクチャの設計による説明責任の高いテスト・品質保証
QAアーキテクチャの設計による 説明責任の高いテスト・品質保証
Yasuharu Nishi
 
渋谷Java#2 昔のJavaを振り返る
渋谷Java#2 昔のJavaを振り返る渋谷Java#2 昔のJavaを振り返る
渋谷Java#2 昔のJavaを振り返るNaoki Iwami
 
スタイルシートの長い夢
スタイルシートの長い夢スタイルシートの長い夢
スタイルシートの長い夢
shika kun
 
GDK48総選挙の裏側
GDK48総選挙の裏側GDK48総選挙の裏側
GDK48総選挙の裏側Kiyotaka Oku
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxNobuhiro Sue
 
amCharts勉強会
amCharts勉強会amCharts勉強会
amCharts勉強会
Naoki Iwami
 
The report of JavaOne2011 about groovy
The report of JavaOne2011 about groovyThe report of JavaOne2011 about groovy
The report of JavaOne2011 about groovyYasuharu Nakano
 
JJUG CCC 20150411 grails3 Spring-boot
JJUG CCC 20150411 grails3 Spring-bootJJUG CCC 20150411 grails3 Spring-boot
JJUG CCC 20150411 grails3 Spring-boot
Tsuyoshi Yamamoto
 
【短縮版】OSSのブラウザ自動テストツール「Selenium」を使った、開発・テストの効率化
【短縮版】OSSのブラウザ自動テストツール「Selenium」を使った、開発・テストの効率化【短縮版】OSSのブラウザ自動テストツール「Selenium」を使った、開発・テストの効率化
【短縮版】OSSのブラウザ自動テストツール「Selenium」を使った、開発・テストの効率化
Nozomi Ito
 
JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化
Satoshi Akama
 
20160914 te engineer
20160914 te engineer20160914 te engineer
20160914 te engineer
Kazuaki Matsuo
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用
nagise
 
Web ブラウザで DRM
Web ブラウザで DRMWeb ブラウザで DRM
Web ブラウザで DRM
Yusuke Goto
 
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
さくらインターネット株式会社
 
AWS Blackbelt 2015シリーズ Elastic Load Balancing
AWS Blackbelt 2015シリーズ Elastic Load BalancingAWS Blackbelt 2015シリーズ Elastic Load Balancing
AWS Blackbelt 2015シリーズ Elastic Load Balancing
Amazon Web Services Japan
 
Seleniumの薄っすい話 百八式 @ 第3回 日本Seleniumユーザーコミュニティ勉強会
Seleniumの薄っすい話 百八式 @ 第3回 日本Seleniumユーザーコミュニティ勉強会Seleniumの薄っすい話 百八式 @ 第3回 日本Seleniumユーザーコミュニティ勉強会
Seleniumの薄っすい話 百八式 @ 第3回 日本Seleniumユーザーコミュニティ勉強会
Hiroshi Toda
 
第3回日本seleniumユーザーコミュニティ勉強会
第3回日本seleniumユーザーコミュニティ勉強会第3回日本seleniumユーザーコミュニティ勉強会
第3回日本seleniumユーザーコミュニティ勉強会
Nozomi Ito
 
あなたとAndroid 今すぐダウンロード!? Android開発で変わる SIerのJava技術事情について
あなたとAndroid 今すぐダウンロード!? Android開発で変わる SIerのJava技術事情についてあなたとAndroid 今すぐダウンロード!? Android開発で変わる SIerのJava技術事情について
あなたとAndroid 今すぐダウンロード!? Android開発で変わる SIerのJava技術事情について
Shinichi Kozake
 

Viewers also liked (20)

QAアーキテクチャの設計による 説明責任の高いテスト・品質保証
QAアーキテクチャの設計による説明責任の高いテスト・品質保証QAアーキテクチャの設計による説明責任の高いテスト・品質保証
QAアーキテクチャの設計による 説明責任の高いテスト・品質保証
 
市場で勝ち続けるための品質とテストの技術②
市場で勝ち続けるための品質とテストの技術②市場で勝ち続けるための品質とテストの技術②
市場で勝ち続けるための品質とテストの技術②
 
渋谷Java#2 昔のJavaを振り返る
渋谷Java#2 昔のJavaを振り返る渋谷Java#2 昔のJavaを振り返る
渋谷Java#2 昔のJavaを振り返る
 
スタイルシートの長い夢
スタイルシートの長い夢スタイルシートの長い夢
スタイルシートの長い夢
 
GDK48総選挙の裏側
GDK48総選挙の裏側GDK48総選挙の裏側
GDK48総選挙の裏側
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
 
amCharts勉強会
amCharts勉強会amCharts勉強会
amCharts勉強会
 
The report of JavaOne2011 about groovy
The report of JavaOne2011 about groovyThe report of JavaOne2011 about groovy
The report of JavaOne2011 about groovy
 
JJUG CCC 20150411 grails3 Spring-boot
JJUG CCC 20150411 grails3 Spring-bootJJUG CCC 20150411 grails3 Spring-boot
JJUG CCC 20150411 grails3 Spring-boot
 
【短縮版】OSSのブラウザ自動テストツール「Selenium」を使った、開発・テストの効率化
【短縮版】OSSのブラウザ自動テストツール「Selenium」を使った、開発・テストの効率化【短縮版】OSSのブラウザ自動テストツール「Selenium」を使った、開発・テストの効率化
【短縮版】OSSのブラウザ自動テストツール「Selenium」を使った、開発・テストの効率化
 
JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化
 
JGGUG合宿2011報告
JGGUG合宿2011報告JGGUG合宿2011報告
JGGUG合宿2011報告
 
20160914 te engineer
20160914 te engineer20160914 te engineer
20160914 te engineer
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用
 
Web ブラウザで DRM
Web ブラウザで DRMWeb ブラウザで DRM
Web ブラウザで DRM
 
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
 
AWS Blackbelt 2015シリーズ Elastic Load Balancing
AWS Blackbelt 2015シリーズ Elastic Load BalancingAWS Blackbelt 2015シリーズ Elastic Load Balancing
AWS Blackbelt 2015シリーズ Elastic Load Balancing
 
Seleniumの薄っすい話 百八式 @ 第3回 日本Seleniumユーザーコミュニティ勉強会
Seleniumの薄っすい話 百八式 @ 第3回 日本Seleniumユーザーコミュニティ勉強会Seleniumの薄っすい話 百八式 @ 第3回 日本Seleniumユーザーコミュニティ勉強会
Seleniumの薄っすい話 百八式 @ 第3回 日本Seleniumユーザーコミュニティ勉強会
 
第3回日本seleniumユーザーコミュニティ勉強会
第3回日本seleniumユーザーコミュニティ勉強会第3回日本seleniumユーザーコミュニティ勉強会
第3回日本seleniumユーザーコミュニティ勉強会
 
あなたとAndroid 今すぐダウンロード!? Android開発で変わる SIerのJava技術事情について
あなたとAndroid 今すぐダウンロード!? Android開発で変わる SIerのJava技術事情についてあなたとAndroid 今すぐダウンロード!? Android開発で変わる SIerのJava技術事情について
あなたとAndroid 今すぐダウンロード!? Android開発で変わる SIerのJava技術事情について
 

Similar to Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ

UI設計におけるスマートフォン対応のまとめ
UI設計におけるスマートフォン対応のまとめUI設計におけるスマートフォン対応のまとめ
UI設計におけるスマートフォン対応のまとめ
Tomoki Imatomi
 
スマホにおけるWebGL入門
スマホにおけるWebGL入門スマホにおけるWebGL入門
スマホにおけるWebGL入門
Yohta Kanke
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
dcubeio
 
レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】
Yasuhito Yabe
 
冬だからAndroid再入門
冬だからAndroid再入門冬だからAndroid再入門
冬だからAndroid再入門
Katsumi Honda
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_GebNobuhiro Sue
 
2010/8/27 TechEd2010 ライトニングトーク
2010/8/27 TechEd2010 ライトニングトーク2010/8/27 TechEd2010 ライトニングトーク
2010/8/27 TechEd2010 ライトニングトーク
Sunao Tomita
 
Create React App 読解特急
Create React App 読解特急Create React App 読解特急
Create React App 読解特急
Matsuo Obu
 
Jenkinsを用いたAndroidアプリビルド作業効率化
Jenkinsを用いたAndroidアプリビルド作業効率化Jenkinsを用いたAndroidアプリビルド作業効率化
Jenkinsを用いたAndroidアプリビルド作業効率化Kenichi Kambara
 
ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発 ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発
schoowebcampus
 
goog.ui.Component のはぐれかた
goog.ui.Component のはぐれかたgoog.ui.Component のはぐれかた
goog.ui.Component のはぐれかたSoichi Takamura
 
Google I/O 2012 and Android 4.1
Google I/O 2012 and Android 4.1Google I/O 2012 and Android 4.1
Google I/O 2012 and Android 4.1
Katsumi Onishi
 
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 EastiOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
irgaly
 
GruntでJavaScript 前作業の自動化!
GruntでJavaScript 前作業の自動化!GruntでJavaScript 前作業の自動化!
GruntでJavaScript 前作業の自動化!leverages_event
 
20130125 titanium meetupvol5
20130125 titanium meetupvol520130125 titanium meetupvol5
20130125 titanium meetupvol5Hiroshi Oyamada
 
ウェブから情報をあつめる
ウェブから情報をあつめるウェブから情報をあつめる
ウェブから情報をあつめる
Shuhei Iitsuka
 
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみたAlfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Tasuku Otani
 
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
 jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
Takashi Okamoto
 

Similar to Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ (20)

UI設計におけるスマートフォン対応のまとめ
UI設計におけるスマートフォン対応のまとめUI設計におけるスマートフォン対応のまとめ
UI設計におけるスマートフォン対応のまとめ
 
スマホにおけるWebGL入門
スマホにおけるWebGL入門スマホにおけるWebGL入門
スマホにおけるWebGL入門
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】
 
冬だからAndroid再入門
冬だからAndroid再入門冬だからAndroid再入門
冬だからAndroid再入門
 
0621 ndk game
0621 ndk game0621 ndk game
0621 ndk game
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
 
2010/8/27 TechEd2010 ライトニングトーク
2010/8/27 TechEd2010 ライトニングトーク2010/8/27 TechEd2010 ライトニングトーク
2010/8/27 TechEd2010 ライトニングトーク
 
Create React App 読解特急
Create React App 読解特急Create React App 読解特急
Create React App 読解特急
 
Jenkinsを用いたAndroidアプリビルド作業効率化
Jenkinsを用いたAndroidアプリビルド作業効率化Jenkinsを用いたAndroidアプリビルド作業効率化
Jenkinsを用いたAndroidアプリビルド作業効率化
 
ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発 ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発
 
goog.ui.Component のはぐれかた
goog.ui.Component のはぐれかたgoog.ui.Component のはぐれかた
goog.ui.Component のはぐれかた
 
Google I/O 2012 and Android 4.1
Google I/O 2012 and Android 4.1Google I/O 2012 and Android 4.1
Google I/O 2012 and Android 4.1
 
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 EastiOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
 
GruntでJavaScript 前作業の自動化!
GruntでJavaScript 前作業の自動化!GruntでJavaScript 前作業の自動化!
GruntでJavaScript 前作業の自動化!
 
20130125 titanium meetupvol5
20130125 titanium meetupvol520130125 titanium meetupvol5
20130125 titanium meetupvol5
 
RoboVM
RoboVMRoboVM
RoboVM
 
ウェブから情報をあつめる
ウェブから情報をあつめるウェブから情報をあつめる
ウェブから情報をあつめる
 
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみたAlfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
 
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
 jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
 

Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ