SlideShare uma empresa Scribd logo
1 de 50
第 5 回 勉強会
~ Web での自動結合テストへの
いざない Groovy から Spock まで~
2016/2/26
今日やること
– 前回までは、 Java の文法、 Spring を使った
Web アプリケーションの構築、単体テスト、
JUnit を使った Unit テストのお話しでした。今日からはここ
Web アプリケーションのテストを
自動化するために
• Selenium Web Driver  
( http://www.seleniumhq.org/ )
 プログラムを書いてブラウザテストを自動的に実行す
るためによく用いられる
– 特徴1:マルチ言語
• Java   C #  PHP Python   Ruby   Perl JavaScript  
など
– 特徴2:マルチブラウザ対応
• Firefox   InternetExplorer   Safari   Opera   Chrome
※Selenium の情報の探し方
http://qiita.com/gluelan2013/items/a
9096d052dc2ab660728
Web アプリケーションのテストを
自動化するために
• なぜ、 Selenium へのダメだし?
–  コーディングが非常に大変
• 初心者に難しい
• 自動化テストを安定動作させるだけでも大変
–   Selenium Web Driver が高速ではない
• テストスローの問題を招きやすい
–  まだ、 Edge にドライバが対応していない
–  スマートフォン、タブレットに対応しきれ
ていない
• Selenium3 に期待したいがいつ出るのだろう
Groovy + Spock + Geb
• Groovy
– Java を極限まで簡単にしたスクリプト言語
– 1 時間で学べる学習コストの低さ
– Java のクラスライブラリは全部呼び出せる
• Geb
– ゲブではなくジェブと読みます
– Groovy で動く Selenium WebDriver のラッパー
– jQuery のような Locator を指定して記述
– コード量が少なく、すっきり
Groovy + Spock + Geb
• ツールの立ち位置をマトリックスにしてみ
ると
ブラウザ操作 WebDriver Geb
テスティング
フレームワーク
JUnit
TestNG
Spock
言語 Java Groovy
マルチブラウザ対応
データ駆動テスト
強力な Assert
なんとか Geb でテストケースを
書いてブラウザテストを自動実行したい
Groovy のインストール方法
• http://www.groovy-lang.org/download.html
– Windows インストーラでインストール
• ソース配布などもあるが、バイナリ版の Windows イ
ンストーラでのインストールが一番楽
– Build ツールからインストール
• Maven 、 Gradle
– IDE のプラグイン
• Eclipse,NetBeans,Intelli-J など各 IDE にプラグインあり
• http://www.groovy-lang.org/ides.html
Groovy のインストール方法
• Eclipse   Plugin
– こちらを詳しくみると Eclipse への対応
https://github.com/groovy/groovy-eclipse/wiki
– EclipseMars(4.5.1) 対応
http://dist.springsource.org/snapshot/GRECLIPSE/e4.5/
Groovy の文法を 1 時間でマスターする
• 世界最小の一文から
 セミコロンはいらない (あっても動作す
る)
 かっこ()もいらない (あっても動作す
る)
‘’ さすがに はないと 下記の Exception を吐く
。
 
 
println 'Hello'
Exception thrown
groovy.lang.MissingPropertyException: No such property:
Hello for class: Helllo
at Helllo.run(Helllo.groovy:1)
Groovy の文法を 1 時間でマスターする
• 世界最小の一文から
Java Class
Groovy Script
 
 
println 'Hello'
public class Main {
public static void main(String[] args) {
System.out0.println("Hello");
}
}
Groovy の文法を 1 時間でマスターする
• 型宣言
 型宣言はいらない  ( 動的型つけ言語)
 
Java の型はそのまま使える。型を宣言してもよ
い
s = 'Hello'
println s
String s = 'Hello'
println s
def s = 'Hello'
println s
Groovy の文法を 1 時間でマスターする
•  テキストリテラル
”“ を付けたほうが変数が評価されて展開され
る
 他のスクリプト言語でもよくある動作です
 
msg = “<<This is message>>”
println “${msg}”
println ‘${msg]’
Groovy の文法を 1 時間でマスターする
•  演算子
これなんて出力されると思います?
 
msg = "Hello"
msg -= "l"
msg *= 3
println msg
Groovy の文法を 1 時間でマスターする
•  クラスとメソッド
    コンストラクタ、インスタンス変数、メ
ソッド
    オブジェクト作成の概念は Java と同じ
class Helo {
def msg
Helo(s){
msg = s
}
def sayHello(){
println msg
}
}
new Helo(" こんにちは ").sayHello()
Groovy の文法を 1 時間でマスターする
•  クラスとメソッド
 
     クラスの継承や抽象クラスの
     考え方は Java と同じ
abstract class Abstract {
String name
abstract def abstractMethod()
def concreteMethod() {
println 'concrete'
}
}
class Concreate extends Abstract {
def abstractMethod(){
println "AbstractMethod 実装 "
}
}
concrete = new Concreate();
concrete.abstractMethod();
Groovy の文法を 1 時間でマスターする
•  クラスとメソッド
 
     クラスの継承や抽象クラスの
     考え方は Java と同じ
abstract class Abstract {
String name
abstract def abstractMethod()
def concreteMethod() {
println 'concrete'
}
}
class Concreate extends Abstract {
def abstractMethod(){
println "AbstractMethod 実装 "
}
}
concrete = new Concreate();
concrete.abstractMethod();
Groovy の文法を 1 時間でマスターする
• リストとマップ
    リストとマップはこんな風に書きます。
    
    これ、なんて出力されると思いますか
    こんなリストの演算もできます。
arr = [1,2,3]
arr = ['one':1, 'two':2, 'three':3]
arr = [1,2,3]
arr += [4,5]
arr -= [2,4]
arr *= 2
println arr
Groovy の文法を 1 時間でマスターする
• 条件分岐
    
     if 文はこのように書きます。
     Java と同じですね。
num = new Random().nextInt(100)
if (num % 2){
println "${num} は、奇数 "
} else {
println "${num} は、偶数 "
}
Groovy の文法を 1 時間でマスターする
• 条件分岐
    
    
     case 文は Java とちょっとちがいますね
。
    より強力です。
     case の中に配列が渡されています。
val = new Random().nextInt(10)
switch(val){
case [0,2,4,6,8]:
println "${val} は、偶数 "
break
case [1,3,5,7,9]:
println "${val} は、奇数 "
}
Groovy の文法を 1 時間でマスターする
• 繰り返し
    
     for 文も Java とほとんど同じですね。
   
arr = [1,2,3,4,5]
n = 0
for(item in arr){
println("$n + $item = " + (n + item))
n += item
}
println " 合計: $n"
Groovy の文法を 1 時間でマスターする
• クロージャ
    こんな風に関数を書きます。
     
     変数 total に関数 each の中からアクセスして
います。
     さらに it には1から 100 までの数字が外から
     渡されています。
     関数ブロックの外の変数を操作できる関数の
msg = {str -> println " こんにちは、 ${str} さん! " }
msg(' 太郎 ')
total = 0
(1..100).each { total += it }
println total
Groovy の文法を 1 時間でマスターする
• クロージャ 例をもう一つ
    
    引数の型が異なっても大丈夫。  
     
 
    引数が可変長でも大丈夫。
def adder = {a,b -> a + b}
assert adder(1,2) == 3
assert adder(‘a’,’b’) == ‘ab’
def sum = { ... elements -> elements.sum()}
assert sum(1,2) == 3
assert sum('a', 'b' ,'c') == 'abc'
Groovy の文法を 1 時間でマスターする
• クロージャ 例をさらに一つ
    
    引数にデフォルト値を設定
 
     
 
   
def mult = {int a, int b = 10 -> a * b}
assert mult(2,3) == 6
assert mult(5) == 50
Groovy の文法を 1 時間でマスターする
• クロージャ 例をさらに一つ
    
    引数にデフォルト値を設定
 
     
 
   
def mult = {int a, int b = 10 -> a * b}
assert mult(2,3) == 6
assert mult(5) == 50
Groovy の文法を 1 時間でマスターする
• クロージャ 例をまだまだ
    
    
      
Persons の配列から年齢が1 8 歳より下のオブジェクトを取り
出す。                        
@groovy.transform.Immutable
class Person {
String name
int age
}
def Persons = [
new Person('Guillaume',36),
new Person('Marion',6),
new Person('Erine',1)
]
def names =
Persons.findAll { it.age < 18 }
.collect { it.name.toUpperCase()}
.sort()
.join(',')
Groovy の文法を 1 時間でマスターする
• クロージャ 例 ファイル読み書き
    
    
     Persons の配列から年齢が1 8 歳より下のオブジェ
クトを取り出す。
           Java で書くと結構複雑になりますよ。
new File('input.txt').withReader { r ->
new File('output.txt').withWriter { w ->
r.eachlinie { line ->
if (line.contains('Groovy'))
w << line.toUpperCase()
}
}
}
Groovy の文法を 1 時間でマスターする
• クロージャ 例 リストと組み合わせ
た例
    
    
     list ’の配列に d’ を追加した後、クロージャ
を使った
    処理を継続
def list =['a','b','c']
list << 'd'
assert list.contains('d')
assert list.findAll { it.startsWith 'a' }.size() == 1
assert list.collect { it.toUpperCase() } == ['A','B','C','D']
assert list.inject(''){a, b -> a + b} == 'abcd'
Groovy の文法を 1 時間でマスターする
• オープンクラス
   
  
     Expando というクラスを new してオブジェク
トを
     作成するとオブジェクトの作成の後にインスタ
ンス変数や、メソッドを追加できる。
     
   
obj = new Expando()
obj.name = "taro"
obj.message = " こんにちは! "
obj.say = { name = it println message + name }
obj.say(" 花子さん ")
Groovy の文法を 1 時間でマスターする
• デフォルトで import されるパッケージ
– java.io.*
– java.lang.*
– java.math.BigDecimal
– java.math.BigInteger
– java.net.*
– java.util.*
– groovy.lang.*
– groovy.util.*
Groovy の文法を 1 時間でマスターする
• Java
     
   
Public class Greeter {
private String owner;
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String greet(String name) {
return “Hello “ + name + “, I am “ + owner;
}
}
Greeter greeter = new Greeter() ;
greeter.setOwner(“Guillaume”);
System.out.println(greeter.greet(“Marion”));
この Java コードが
Groovy の文法を 1 時間でマスターする
• Groovy Script
     
   
class Greeter {
String owner
String greet(String name) {
“Hello ${name}, I am ${owner}”
}
}
def greeter = new Greeter(owner: “Guillaume”)
println greeter.greet(“Marion”)
こんなに簡単な Script に
Groovy を使った Web システムのテスト
• PowerAssert
     
   
def x = [1,2,3,4,5]
assert (x << 6) == [6,7,8,9,10]
Exception thrown
Assertion failed:
assert (x << 6) == [6,7,8,9,10]
| | |
| | false
| [1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
at Helllo.run(Helllo.groovy:2)
Groovy を使った Web システムのテスト
• Spock を使った記述方法
     
   
@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
import spock.lang.*
class MathSpec extends Specification {
def "maximum of two numbers"() {
expect:
Math.max(a,b) ==c
where:
a|b||c
1|3||3
7|4||7
0|0||0
}
}
ラベルを使った期待値の記述方法
テストにあった
名前をメソッド名
をつける
テストデータの組み合わせを
このように表現する
今までの Groovy 、 Spock の知識を踏まえて、
Geb を使って Web システムの自動実行をする
Geb でできること
1. Cross   Browser ( クロスブラウザ)
2. j Quey-like API (jQuery 的な API)
3. Page   Objects  (ページオブジェクト)
4. Asynchronus Pages( 非同期ページの対応 )
5. Testing( テスティング)
6. Build Integration ( ビルドツールとの統合)
7. Screen Scraping (スクリーンキャプチャ)
     
   
コードで簡単さを体験。
import geb.Browser
/**
* フォームに入力する簡単なコード
*/
Browser.drive {
go "http://myapp.com/login"
   // 見出しが Please   Login であることを確認
assert $("h1").text() == "Please Login"
$("form.login").with {
username = "admin"
password = "password"
login().click()
}
   assert $("h1").text() == "Admin Section"
}
Geb の API を使って簡単
に
j Query のセレクタのよ
うな記述
次のページの h1 を確認し
て
Admin   Section なら OK
PageObject パターンとは
 アプリケーションの画面を1つのオブジェクトとしてモデリングするデザインパターン
 Seleniumの公式サイトで保守性の高いテストコードを作成する書き方として推奨
テストコードに保守性?
テストを継続的に実行していくということを考えると、製品コードの画面変更に合わせて常にテストコードを迅速に、低コストで保守していく必要がある。
テストの自動化のメリットは、同じテストを何度も実行する場合でないと薄いと考えると、テストコードが保守性に強いことは絶対に必要。
     
   
 
PageObject パターンとは
Seleniumの公式サイトに記載してあるPageObjectパターンの原則を紹介
・The public methods represent the services that the page offers
(publicメソッドは、ページが提供するサービスを表す)
・Try not to expose the the internals of the page
(ページの内部を公開しないこと)
・Generally don’t make assertions
(原則としてassertionを行わないこと)
・Methods return other PageObjects
(メソッドは他のPageObjectsを返す)
・Need not represent an entire page
(ページ全体を表す必要はない)
・Different results for the same action are modelled as different as different methods
(同じアクションに対して異なる結果となる場合には異なるメソッドとしてモデル化する)
     
   
 
PageObject パターンとは
実際にSeleniumで記述したコード例を見てみましょう。
コードは大まかに2種類
1.画面を操作するためのPageクラス
画面やダイアログの単位で作成
ボタンやテキストフィールドなどのHTML要素を保持
各要素を操作するためのAPIを定義
2.Pageクラスを操作してテストシナリオを記述するクラス
1. 原則としてPageクラスのAPIだけを呼ぶ
2. 直接HTML要素を操作しない
     
   
 
PageObject パターンとは
public class 商品検索ページ {
WebDriver driver;
// ページ内の要素を定数として定義
By textKeyword = By.name("keyword");
By buttonSearch = By.id("search");
public 商品検索ページ (WebDriver driver) {
this.driver = driver;
}
// そのページで行える動作をメソッドとして定義
public 商品検索ページ 商品検索を行う (String
keyword) {
driver.findElement(textKeyword).sendKeys(keyword);
driver.findElement(buttonSearch).click();
return this;
}
public 商品詳細ページ 商品詳細ページに遷移する
(String name) {
// (詳細ページに遷移する処理)
return new 商品詳細ページ (driver);
}
}
他の PageObject パターン
のページを返す、メソッド
他の PageObject パターン
のページを返す、メソッド
実際に HTML のページ要素
に触るのはこちらだけ
アプリケーションの
レイアウト変更には
かなり強くなる
商品検索ページをモデル化したクラス
PageObject パターンとは
public class 商品詳細ページ {
WebDriver driver;
public 商品詳細ページ (WebDriver driver) {
this.driver = driver;
}
public 商品詳細ページ 商品をカートに入れ
る () {
// (カートに入れる処理)
return this;
}
public 購入確認ページ 購入確認画面に遷移
する () {
// (画面遷移の処理)
return new 購入確認ページ (driver);
}
}
商品詳細ページをモデル化したクラス
他の PageObject パターン
のページを返す、メソッド
他の PageObject パターン
のページを返す、メソッド
PageObject パターンとは
@Before
public void シナリオ実行前に必要な処理
() {
(new ログイン画面 (driver))
. ログインする ()
. 商品画面に遷移する ();
}
@Test
public void 購入フローのテスト () {
(new 商品画面 (driver))
. 商品検索を行う (" 商品名 ")
. 商品詳細画面に遷移する ()
. 商品をカートに入れる ()
. 購入確認画面に遷移する ()
. お届け先を選択する ( 自宅 )
. 支払い方法を選択する ( 代引 )
. 注文確認画面に遷移する ()
. 注文終了後にホーム画面に遷移する ();
}
2つのページをテストする
テストケース
メソッドチェーンを用いて
かなりわかり安い記述になる。
Geb でも PageObject パターン
GebはもちろのんPageObjectパターンをきちんとサポートしています。
     
   
 
class ExamplePage extends Page {
static url = "http://www.example.com/"
static at = { title = "Example Page"}
static content = {
textUserName = {$("input[name=user_name")}
textmailAddress = {$("input[name=mail_address")}
}
}
Browser.drive {
to ExamplePage
at ExamplePage
}
セレクタを用いた
アクセスの仕方に
なるのがまず大きな違い。
Geb でも PageObject パターン
先ほどとは違うGebページオブジェクトパターンの例
     
   
 
GoogleHomePage ( Google の検索ページ用 PageObject )
import geb.*
class GoogleHomePage extends Page {
static url = "http://google.com/?complete=0"
static at = { title == "Google" }
static content = {
//"content"のDSLは以下のように定義する
//«name» { «definition» }
searchField { $("input[name=q]") }
searchButton(to: GoogleResultsPage) { $("input[value='Google Search']") } }
void search(String searchTerm) {
searchField.value searchTerm searchButton.click()
}
}
     
   
 
Geb でも PageObject パターン
先ほどとは違うGebページオブジェクトパターンの例
     
   
 
GoogleHomePage ( Google の検索ページ用 PageObject )
class GoogleResultsPage extends Page {
static at = { waitFor { title.endsWith("Google Search") } }
static content = {
//"wait"オプションによって、Googleの検索結果ページに
//$("li.g")が表示されるまで一定時間待つことができる。
//もし、表示されなかった場合は"RequiredPageContentNotPresent" 例外が
//発生する
results(wait: true) { $("li.g") }
result { index -> results[index] }
resultLink { index -> result(index).find("a") }
}
}
     
   
 
Geb を使った Web システムのテスト
つべこべ言わずにいきなり体験してみましょう。
1. https://github.com/geb/geb-example-gradle
2.  上記を clone して gradlew コマンドを実行
./gradlew.bat chromeTest
./gradlew.bat firefoxTest
./gradlew.bat phantomJsTest
To run with all, you can run:
./gradlew.bat test
Spock をもちいた記述の仕方
class LoginSpec extends GebSpec {
def "ID とパスワードを組み合わせてログインす
る "() {
setup:
to "http://www.example.com/login"
when :
$("#loginId").value("user01")
$("#password").value("pass01")
$("#login").click()
then :
at "http://www.example.com/home/"
cleanup:
}
}
ブロックを使ってテストケースを記述する
Spock をもちいた記述の仕方
class LoginSpec extends GebSpec {
def "ID とパスワードを組み合わせてログインす
る "() {
when :
$("#loginId").value(loginId)
$("#password").value(password)
$("#login").click()
then :
$("#error").text() == errorMessage
where:
loginId | password || errorMessage
"" | "pass01" || " ログイン ID を入力してく
ださい "
"user01" | "" || " パスワードを入力してくだ
さい "
"hoge" | "fuga" || "ID とパスワードの組み合
わせが正しくありません "
}
データ駆動テストのシンプルな記述の仕方
Geb を使った取り組み
どのようなことに Geb を使うか。
応用の可能性として考えられるもの。
1.Web システムのリグレッションテストの自動化
2.Web システムの疎通テストの自動化
3.Web システムのクロスブラウザ試験
4.Web システムの大量スナップショットとり
5.Web システムの受け入れテスト、結合テストの
データ準備
6.Web システムの負荷テスト
7.JavaScript のユニットテスト     
   
参考 URL
– Groovy
• http://groovy-lang.org/
• https://speakerdeck.com/glaforge/what-makes-
groovy-groovy ( スライド )
– SPOCK
• https://code.google.com/p/spock/
– Geb
• http://www.slideshare.net/youtaroutakahashi/what
-makes-geb-groovy   ( スライド )
• http://www.slideshare.net/hirokotamagawa/20141
018-2selenium-40423299?next_slideshow=1 ( スラ
イド )
• http://www.gebish.org
•

Mais conteúdo relacionado

Mais procurados

Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ
Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップWebアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ
Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップNaoki Iwami
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basicTakuma Watabiki
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
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-withanswersTakuma Watabiki
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にTaku Miyakawa
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGUehara Junji
 
テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術Y Watanabe
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Uehara Junji
 
JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行Yoshitaka Kawashima
 
システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法Takuma Watabiki
 
Jjug 20140430 gradle_advanced
Jjug 20140430 gradle_advancedJjug 20140430 gradle_advanced
Jjug 20140430 gradle_advancedMasatoshi Hayashi
 
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -Hayato Mizuno
 
Gws 20141024 gradle_intro
Gws 20141024 gradle_introGws 20141024 gradle_intro
Gws 20141024 gradle_introNobuhiro Sue
 
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUehara Junji
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_GebNobuhiro Sue
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例sohta
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介Shinya Okano
 

Mais procurados (20)

Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ
Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップWebアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ
Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basic
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
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
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
 
テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015
 
JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行
 
システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法
 
Jjug 20140430 gradle_advanced
Jjug 20140430 gradle_advancedJjug 20140430 gradle_advanced
Jjug 20140430 gradle_advanced
 
Gradle布教活動
Gradle布教活動Gradle布教活動
Gradle布教活動
 
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -
 
Gws 20141024 gradle_intro
Gws 20141024 gradle_introGws 20141024 gradle_intro
Gws 20141024 gradle_intro
 
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST API
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
 

Destaque

脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルにHiroko Tamagawa
 
はじめてのWindows Server
はじめてのWindows ServerはじめてのWindows Server
はじめてのWindows Serverjunichi anno
 
初心者でもわかるActive directoryの基本
初心者でもわかるActive directoryの基本初心者でもわかるActive directoryの基本
初心者でもわかるActive directoryの基本Sho Okada
 
今さら聞けない! Windows Server 2012 R2 Active Directory入門【グローバルナレッジ無料セミナー資料】
今さら聞けない! Windows Server 2012 R2 Active Directory入門【グローバルナレッジ無料セミナー資料】今さら聞けない! Windows Server 2012 R2 Active Directory入門【グローバルナレッジ無料セミナー資料】
今さら聞けない! Windows Server 2012 R2 Active Directory入門【グローバルナレッジ無料セミナー資料】Trainocate Japan, Ltd.
 
無料セミナー20170321 awsから始めるlinux入門
無料セミナー20170321 awsから始めるlinux入門無料セミナー20170321 awsから始めるlinux入門
無料セミナー20170321 awsから始めるlinux入門Trainocate Japan, Ltd.
 
WebDriverで始めるUIスモークテスティング入門
WebDriverで始めるUIスモークテスティング入門WebDriverで始めるUIスモークテスティング入門
WebDriverで始めるUIスモークテスティング入門Kohki Nakashima
 
第4回 itil講義資料
第4回 itil講義資料第4回 itil講義資料
第4回 itil講義資料Mugen Fujii
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識shigeya
 
第2回 ITIL講義資料
第2回 ITIL講義資料第2回 ITIL講義資料
第2回 ITIL講義資料Mugen Fujii
 
Selenium2(web driver) ide編
Selenium2(web driver) ide編Selenium2(web driver) ide編
Selenium2(web driver) ide編Tetsuya Hasegawa
 
PowerShell と Active Directory
PowerShell と Active DirectoryPowerShell と Active Directory
PowerShell と Active DirectoryChuki ちゅき
 
Windows使いのための仮想マシン入門
Windows使いのための仮想マシン入門Windows使いのための仮想マシン入門
Windows使いのための仮想マシン入門deflis
 
150523 jpsps ws2012r2_top10_150523
150523 jpsps ws2012r2_top10_150523150523 jpsps ws2012r2_top10_150523
150523 jpsps ws2012r2_top10_150523wintechq
 
2014年12月 ソネット bit-drive セミナー資料
2014年12月 ソネット bit-drive セミナー資料2014年12月 ソネット bit-drive セミナー資料
2014年12月 ソネット bit-drive セミナー資料wintechq
 
中小企業向け Windows server 2003 サポート終了と移行対策 ~ コストを掛けないツール見直し ~
中小企業向け Windows server 2003 サポート終了と移行対策 ~ コストを掛けないツール見直し ~中小企業向け Windows server 2003 サポート終了と移行対策 ~ コストを掛けないツール見直し ~
中小企業向け Windows server 2003 サポート終了と移行対策 ~ コストを掛けないツール見直し ~UNIRITA Incorporated
 
Windows Server 2012 R2 のすべて
Windows Server 2012 R2 のすべてWindows Server 2012 R2 のすべて
Windows Server 2012 R2 のすべてwintechq
 
Ws2003からws2012 r2へのマイグレーション指南 140217
Ws2003からws2012 r2へのマイグレーション指南 140217Ws2003からws2012 r2へのマイグレーション指南 140217
Ws2003からws2012 r2へのマイグレーション指南 140217wintechq
 
AWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきか
AWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきかAWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきか
AWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきか真吾 吉田
 
サーバの種別を理解しよう
サーバの種別を理解しようサーバの種別を理解しよう
サーバの種別を理解しようHiroyuki Ogawa
 
書籍を執筆して気づいた Windows Server 2012 R2 過去のサーバーOSとの違い
書籍を執筆して気づいた Windows Server 2012 R2 過去のサーバーOSとの違い書籍を執筆して気づいた Windows Server 2012 R2 過去のサーバーOSとの違い
書籍を執筆して気づいた Windows Server 2012 R2 過去のサーバーOSとの違いwintechq
 

Destaque (20)

脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに
 
はじめてのWindows Server
はじめてのWindows ServerはじめてのWindows Server
はじめてのWindows Server
 
初心者でもわかるActive directoryの基本
初心者でもわかるActive directoryの基本初心者でもわかるActive directoryの基本
初心者でもわかるActive directoryの基本
 
今さら聞けない! Windows Server 2012 R2 Active Directory入門【グローバルナレッジ無料セミナー資料】
今さら聞けない! Windows Server 2012 R2 Active Directory入門【グローバルナレッジ無料セミナー資料】今さら聞けない! Windows Server 2012 R2 Active Directory入門【グローバルナレッジ無料セミナー資料】
今さら聞けない! Windows Server 2012 R2 Active Directory入門【グローバルナレッジ無料セミナー資料】
 
無料セミナー20170321 awsから始めるlinux入門
無料セミナー20170321 awsから始めるlinux入門無料セミナー20170321 awsから始めるlinux入門
無料セミナー20170321 awsから始めるlinux入門
 
WebDriverで始めるUIスモークテスティング入門
WebDriverで始めるUIスモークテスティング入門WebDriverで始めるUIスモークテスティング入門
WebDriverで始めるUIスモークテスティング入門
 
第4回 itil講義資料
第4回 itil講義資料第4回 itil講義資料
第4回 itil講義資料
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
 
第2回 ITIL講義資料
第2回 ITIL講義資料第2回 ITIL講義資料
第2回 ITIL講義資料
 
Selenium2(web driver) ide編
Selenium2(web driver) ide編Selenium2(web driver) ide編
Selenium2(web driver) ide編
 
PowerShell と Active Directory
PowerShell と Active DirectoryPowerShell と Active Directory
PowerShell と Active Directory
 
Windows使いのための仮想マシン入門
Windows使いのための仮想マシン入門Windows使いのための仮想マシン入門
Windows使いのための仮想マシン入門
 
150523 jpsps ws2012r2_top10_150523
150523 jpsps ws2012r2_top10_150523150523 jpsps ws2012r2_top10_150523
150523 jpsps ws2012r2_top10_150523
 
2014年12月 ソネット bit-drive セミナー資料
2014年12月 ソネット bit-drive セミナー資料2014年12月 ソネット bit-drive セミナー資料
2014年12月 ソネット bit-drive セミナー資料
 
中小企業向け Windows server 2003 サポート終了と移行対策 ~ コストを掛けないツール見直し ~
中小企業向け Windows server 2003 サポート終了と移行対策 ~ コストを掛けないツール見直し ~中小企業向け Windows server 2003 サポート終了と移行対策 ~ コストを掛けないツール見直し ~
中小企業向け Windows server 2003 サポート終了と移行対策 ~ コストを掛けないツール見直し ~
 
Windows Server 2012 R2 のすべて
Windows Server 2012 R2 のすべてWindows Server 2012 R2 のすべて
Windows Server 2012 R2 のすべて
 
Ws2003からws2012 r2へのマイグレーション指南 140217
Ws2003からws2012 r2へのマイグレーション指南 140217Ws2003からws2012 r2へのマイグレーション指南 140217
Ws2003からws2012 r2へのマイグレーション指南 140217
 
AWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきか
AWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきかAWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきか
AWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきか
 
サーバの種別を理解しよう
サーバの種別を理解しようサーバの種別を理解しよう
サーバの種別を理解しよう
 
書籍を執筆して気づいた Windows Server 2012 R2 過去のサーバーOSとの違い
書籍を執筆して気づいた Windows Server 2012 R2 過去のサーバーOSとの違い書籍を執筆して気づいた Windows Server 2012 R2 過去のサーバーOSとの違い
書籍を執筆して気づいた Windows Server 2012 R2 過去のサーバーOSとの違い
 

Semelhante a 第5回勉強会

JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるJJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるKoichi Sakata
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発Kentaro Ohkouchi
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)Nobuhiro Sue
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodAtsuhiro Kubo
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
pi-3. 式の抽象化とメソッド
pi-3. 式の抽象化とメソッドpi-3. 式の抽象化とメソッド
pi-3. 式の抽象化とメソッドkunihikokaneko1
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unithigaki
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)Toru Furukawa
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話Hisateru Tanaka
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
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
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaYuta Kawadai
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitAtsuhiro Kubo
 

Semelhante a 第5回勉強会 (20)

JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるJJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
 
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話 Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
 
FlexUnit4とMockitoFlex
FlexUnit4とMockitoFlexFlexUnit4とMockitoFlex
FlexUnit4とMockitoFlex
 
Spock's world
Spock's worldSpock's world
Spock's world
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)
 
Startup JavaScript
Startup JavaScriptStartup JavaScript
Startup JavaScript
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
pi-3. 式の抽象化とメソッド
pi-3. 式の抽象化とメソッドpi-3. 式の抽象化とメソッド
pi-3. 式の抽象化とメソッド
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unit
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
 
Gws in fukuoka
Gws in fukuokaGws in fukuoka
Gws in fukuoka
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
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
 
Aizu lt tokyo_luxion
Aizu lt tokyo_luxionAizu lt tokyo_luxion
Aizu lt tokyo_luxion
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
 

Mais de Mugen Fujii

Jupiter notebookをawsに構築しよう
Jupiter notebookをawsに構築しようJupiter notebookをawsに構築しよう
Jupiter notebookをawsに構築しようMugen Fujii
 
2020/8/22 IoT 研究会講演
2020/8/22 IoT 研究会講演2020/8/22 IoT 研究会講演
2020/8/22 IoT 研究会講演Mugen Fujii
 
集中型か分散型か
集中型か分散型か集中型か分散型か
集中型か分散型かMugen Fujii
 
ブロックチェーン技術はデジタル経営の基盤になり得るか
ブロックチェーン技術はデジタル経営の基盤になり得るかブロックチェーン技術はデジタル経営の基盤になり得るか
ブロックチェーン技術はデジタル経営の基盤になり得るかMugen Fujii
 
ブロックチェーン技術は幻滅期を超えれるか!?
ブロックチェーン技術は幻滅期を超えれるか!?ブロックチェーン技術は幻滅期を超えれるか!?
ブロックチェーン技術は幻滅期を超えれるか!?Mugen Fujii
 
Blockchainandcriptcurrency ver2
Blockchainandcriptcurrency ver2Blockchainandcriptcurrency ver2
Blockchainandcriptcurrency ver2Mugen Fujii
 
ブロックチェーンと仮想通貨の仕組みアップ用
ブロックチェーンと仮想通貨の仕組みアップ用ブロックチェーンと仮想通貨の仕組みアップ用
ブロックチェーンと仮想通貨の仕組みアップ用Mugen Fujii
 
Kintoneセミナー
KintoneセミナーKintoneセミナー
KintoneセミナーMugen Fujii
 
Kintoneセミナー
KintoneセミナーKintoneセミナー
KintoneセミナーMugen Fujii
 
テスト自動化に対するAtlassian製品の有効活用法
テスト自動化に対するAtlassian製品の有効活用法テスト自動化に対するAtlassian製品の有効活用法
テスト自動化に対するAtlassian製品の有効活用法Mugen Fujii
 
第6回 itil講義資料
第6回 itil講義資料第6回 itil講義資料
第6回 itil講義資料Mugen Fujii
 
第5回 itil講義資料
第5回 itil講義資料第5回 itil講義資料
第5回 itil講義資料Mugen Fujii
 
第3回 ITIL講義資料
第3回 ITIL講義資料第3回 ITIL講義資料
第3回 ITIL講義資料Mugen Fujii
 
ITILの基礎、第1回講義資料
ITILの基礎、第1回講義資料ITILの基礎、第1回講義資料
ITILの基礎、第1回講義資料Mugen Fujii
 
Amazon awsを使ったwordpressサイト構築のポイント
Amazon awsを使ったwordpressサイト構築のポイントAmazon awsを使ったwordpressサイト構築のポイント
Amazon awsを使ったwordpressサイト構築のポイントMugen Fujii
 

Mais de Mugen Fujii (17)

Jupiter notebookをawsに構築しよう
Jupiter notebookをawsに構築しようJupiter notebookをawsに構築しよう
Jupiter notebookをawsに構築しよう
 
2020/8/22 IoT 研究会講演
2020/8/22 IoT 研究会講演2020/8/22 IoT 研究会講演
2020/8/22 IoT 研究会講演
 
5 g
5 g5 g
5 g
 
集中型か分散型か
集中型か分散型か集中型か分散型か
集中型か分散型か
 
ブロックチェーン技術はデジタル経営の基盤になり得るか
ブロックチェーン技術はデジタル経営の基盤になり得るかブロックチェーン技術はデジタル経営の基盤になり得るか
ブロックチェーン技術はデジタル経営の基盤になり得るか
 
ブロックチェーン技術は幻滅期を超えれるか!?
ブロックチェーン技術は幻滅期を超えれるか!?ブロックチェーン技術は幻滅期を超えれるか!?
ブロックチェーン技術は幻滅期を超えれるか!?
 
Blockchainandcriptcurrency ver2
Blockchainandcriptcurrency ver2Blockchainandcriptcurrency ver2
Blockchainandcriptcurrency ver2
 
ブロックチェーンと仮想通貨の仕組みアップ用
ブロックチェーンと仮想通貨の仕組みアップ用ブロックチェーンと仮想通貨の仕組みアップ用
ブロックチェーンと仮想通貨の仕組みアップ用
 
Kintoneセミナー
KintoneセミナーKintoneセミナー
Kintoneセミナー
 
Kintoneセミナー
KintoneセミナーKintoneセミナー
Kintoneセミナー
 
テスト自動化に対するAtlassian製品の有効活用法
テスト自動化に対するAtlassian製品の有効活用法テスト自動化に対するAtlassian製品の有効活用法
テスト自動化に対するAtlassian製品の有効活用法
 
第6回 itil講義資料
第6回 itil講義資料第6回 itil講義資料
第6回 itil講義資料
 
第5回 itil講義資料
第5回 itil講義資料第5回 itil講義資料
第5回 itil講義資料
 
第3回 ITIL講義資料
第3回 ITIL講義資料第3回 ITIL講義資料
第3回 ITIL講義資料
 
ハイレゾ
ハイレゾハイレゾ
ハイレゾ
 
ITILの基礎、第1回講義資料
ITILの基礎、第1回講義資料ITILの基礎、第1回講義資料
ITILの基礎、第1回講義資料
 
Amazon awsを使ったwordpressサイト構築のポイント
Amazon awsを使ったwordpressサイト構築のポイントAmazon awsを使ったwordpressサイト構築のポイント
Amazon awsを使ったwordpressサイト構築のポイント
 

Último

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 

Último (9)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 

第5回勉強会

  • 1. 第 5 回 勉強会 ~ Web での自動結合テストへの いざない Groovy から Spock まで~ 2016/2/26
  • 2. 今日やること – 前回までは、 Java の文法、 Spring を使った Web アプリケーションの構築、単体テスト、 JUnit を使った Unit テストのお話しでした。今日からはここ
  • 3. Web アプリケーションのテストを 自動化するために • Selenium Web Driver   ( http://www.seleniumhq.org/ )  プログラムを書いてブラウザテストを自動的に実行す るためによく用いられる – 特徴1:マルチ言語 • Java   C #  PHP Python   Ruby   Perl JavaScript   など – 特徴2:マルチブラウザ対応 • Firefox   InternetExplorer   Safari   Opera   Chrome ※Selenium の情報の探し方 http://qiita.com/gluelan2013/items/a 9096d052dc2ab660728
  • 4. Web アプリケーションのテストを 自動化するために • なぜ、 Selenium へのダメだし? –  コーディングが非常に大変 • 初心者に難しい • 自動化テストを安定動作させるだけでも大変 –   Selenium Web Driver が高速ではない • テストスローの問題を招きやすい –  まだ、 Edge にドライバが対応していない –  スマートフォン、タブレットに対応しきれ ていない • Selenium3 に期待したいがいつ出るのだろう
  • 5. Groovy + Spock + Geb • Groovy – Java を極限まで簡単にしたスクリプト言語 – 1 時間で学べる学習コストの低さ – Java のクラスライブラリは全部呼び出せる • Geb – ゲブではなくジェブと読みます – Groovy で動く Selenium WebDriver のラッパー – jQuery のような Locator を指定して記述 – コード量が少なく、すっきり
  • 6. Groovy + Spock + Geb • ツールの立ち位置をマトリックスにしてみ ると ブラウザ操作 WebDriver Geb テスティング フレームワーク JUnit TestNG Spock 言語 Java Groovy マルチブラウザ対応 データ駆動テスト 強力な Assert なんとか Geb でテストケースを 書いてブラウザテストを自動実行したい
  • 7. Groovy のインストール方法 • http://www.groovy-lang.org/download.html – Windows インストーラでインストール • ソース配布などもあるが、バイナリ版の Windows イ ンストーラでのインストールが一番楽 – Build ツールからインストール • Maven 、 Gradle – IDE のプラグイン • Eclipse,NetBeans,Intelli-J など各 IDE にプラグインあり • http://www.groovy-lang.org/ides.html
  • 8. Groovy のインストール方法 • Eclipse   Plugin – こちらを詳しくみると Eclipse への対応 https://github.com/groovy/groovy-eclipse/wiki – EclipseMars(4.5.1) 対応 http://dist.springsource.org/snapshot/GRECLIPSE/e4.5/
  • 9. Groovy の文法を 1 時間でマスターする • 世界最小の一文から  セミコロンはいらない (あっても動作す る)  かっこ()もいらない (あっても動作す る) ‘’ さすがに はないと 下記の Exception を吐く 。     println 'Hello' Exception thrown groovy.lang.MissingPropertyException: No such property: Hello for class: Helllo at Helllo.run(Helllo.groovy:1)
  • 10. Groovy の文法を 1 時間でマスターする • 世界最小の一文から Java Class Groovy Script     println 'Hello' public class Main { public static void main(String[] args) { System.out0.println("Hello"); } }
  • 11. Groovy の文法を 1 時間でマスターする • 型宣言  型宣言はいらない  ( 動的型つけ言語)   Java の型はそのまま使える。型を宣言してもよ い s = 'Hello' println s String s = 'Hello' println s def s = 'Hello' println s
  • 12. Groovy の文法を 1 時間でマスターする •  テキストリテラル ”“ を付けたほうが変数が評価されて展開され る  他のスクリプト言語でもよくある動作です   msg = “<<This is message>>” println “${msg}” println ‘${msg]’
  • 13. Groovy の文法を 1 時間でマスターする •  演算子 これなんて出力されると思います?   msg = "Hello" msg -= "l" msg *= 3 println msg
  • 14. Groovy の文法を 1 時間でマスターする •  クラスとメソッド     コンストラクタ、インスタンス変数、メ ソッド     オブジェクト作成の概念は Java と同じ class Helo { def msg Helo(s){ msg = s } def sayHello(){ println msg } } new Helo(" こんにちは ").sayHello()
  • 15. Groovy の文法を 1 時間でマスターする •  クラスとメソッド        クラスの継承や抽象クラスの      考え方は Java と同じ abstract class Abstract { String name abstract def abstractMethod() def concreteMethod() { println 'concrete' } } class Concreate extends Abstract { def abstractMethod(){ println "AbstractMethod 実装 " } } concrete = new Concreate(); concrete.abstractMethod();
  • 16. Groovy の文法を 1 時間でマスターする •  クラスとメソッド        クラスの継承や抽象クラスの      考え方は Java と同じ abstract class Abstract { String name abstract def abstractMethod() def concreteMethod() { println 'concrete' } } class Concreate extends Abstract { def abstractMethod(){ println "AbstractMethod 実装 " } } concrete = new Concreate(); concrete.abstractMethod();
  • 17. Groovy の文法を 1 時間でマスターする • リストとマップ     リストとマップはこんな風に書きます。          これ、なんて出力されると思いますか     こんなリストの演算もできます。 arr = [1,2,3] arr = ['one':1, 'two':2, 'three':3] arr = [1,2,3] arr += [4,5] arr -= [2,4] arr *= 2 println arr
  • 18. Groovy の文法を 1 時間でマスターする • 条件分岐           if 文はこのように書きます。      Java と同じですね。 num = new Random().nextInt(100) if (num % 2){ println "${num} は、奇数 " } else { println "${num} は、偶数 " }
  • 19. Groovy の文法を 1 時間でマスターする • 条件分岐                case 文は Java とちょっとちがいますね 。     より強力です。      case の中に配列が渡されています。 val = new Random().nextInt(10) switch(val){ case [0,2,4,6,8]: println "${val} は、偶数 " break case [1,3,5,7,9]: println "${val} は、奇数 " }
  • 20. Groovy の文法を 1 時間でマスターする • 繰り返し           for 文も Java とほとんど同じですね。     arr = [1,2,3,4,5] n = 0 for(item in arr){ println("$n + $item = " + (n + item)) n += item } println " 合計: $n"
  • 21. Groovy の文法を 1 時間でマスターする • クロージャ     こんな風に関数を書きます。            変数 total に関数 each の中からアクセスして います。      さらに it には1から 100 までの数字が外から      渡されています。      関数ブロックの外の変数を操作できる関数の msg = {str -> println " こんにちは、 ${str} さん! " } msg(' 太郎 ') total = 0 (1..100).each { total += it } println total
  • 22. Groovy の文法を 1 時間でマスターする • クロージャ 例をもう一つ          引数の型が異なっても大丈夫。               引数が可変長でも大丈夫。 def adder = {a,b -> a + b} assert adder(1,2) == 3 assert adder(‘a’,’b’) == ‘ab’ def sum = { ... elements -> elements.sum()} assert sum(1,2) == 3 assert sum('a', 'b' ,'c') == 'abc'
  • 23. Groovy の文法を 1 時間でマスターする • クロージャ 例をさらに一つ          引数にデフォルト値を設定               def mult = {int a, int b = 10 -> a * b} assert mult(2,3) == 6 assert mult(5) == 50
  • 24. Groovy の文法を 1 時間でマスターする • クロージャ 例をさらに一つ          引数にデフォルト値を設定               def mult = {int a, int b = 10 -> a * b} assert mult(2,3) == 6 assert mult(5) == 50
  • 25. Groovy の文法を 1 時間でマスターする • クロージャ 例をまだまだ                  Persons の配列から年齢が1 8 歳より下のオブジェクトを取り 出す。                         @groovy.transform.Immutable class Person { String name int age } def Persons = [ new Person('Guillaume',36), new Person('Marion',6), new Person('Erine',1) ] def names = Persons.findAll { it.age < 18 } .collect { it.name.toUpperCase()} .sort() .join(',')
  • 26. Groovy の文法を 1 時間でマスターする • クロージャ 例 ファイル読み書き                Persons の配列から年齢が1 8 歳より下のオブジェ クトを取り出す。            Java で書くと結構複雑になりますよ。 new File('input.txt').withReader { r -> new File('output.txt').withWriter { w -> r.eachlinie { line -> if (line.contains('Groovy')) w << line.toUpperCase() } } }
  • 27. Groovy の文法を 1 時間でマスターする • クロージャ 例 リストと組み合わせ た例                list ’の配列に d’ を追加した後、クロージャ を使った     処理を継続 def list =['a','b','c'] list << 'd' assert list.contains('d') assert list.findAll { it.startsWith 'a' }.size() == 1 assert list.collect { it.toUpperCase() } == ['A','B','C','D'] assert list.inject(''){a, b -> a + b} == 'abcd'
  • 28. Groovy の文法を 1 時間でマスターする • オープンクラス             Expando というクラスを new してオブジェク トを      作成するとオブジェクトの作成の後にインスタ ンス変数や、メソッドを追加できる。           obj = new Expando() obj.name = "taro" obj.message = " こんにちは! " obj.say = { name = it println message + name } obj.say(" 花子さん ")
  • 29. Groovy の文法を 1 時間でマスターする • デフォルトで import されるパッケージ – java.io.* – java.lang.* – java.math.BigDecimal – java.math.BigInteger – java.net.* – java.util.* – groovy.lang.* – groovy.util.*
  • 30. Groovy の文法を 1 時間でマスターする • Java           Public class Greeter { private String owner; public String getOwner() { return owner; } public void setOwner(String owner) { this.owner = owner; } public String greet(String name) { return “Hello “ + name + “, I am “ + owner; } } Greeter greeter = new Greeter() ; greeter.setOwner(“Guillaume”); System.out.println(greeter.greet(“Marion”)); この Java コードが
  • 31. Groovy の文法を 1 時間でマスターする • Groovy Script           class Greeter { String owner String greet(String name) { “Hello ${name}, I am ${owner}” } } def greeter = new Greeter(owner: “Guillaume”) println greeter.greet(“Marion”) こんなに簡単な Script に
  • 32. Groovy を使った Web システムのテスト • PowerAssert           def x = [1,2,3,4,5] assert (x << 6) == [6,7,8,9,10] Exception thrown Assertion failed: assert (x << 6) == [6,7,8,9,10] | | | | | false | [1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6] at Helllo.run(Helllo.groovy:2)
  • 33. Groovy を使った Web システムのテスト • Spock を使った記述方法           @Grab('org.spockframework:spock-core:0.7-groovy-2.0') import spock.lang.* class MathSpec extends Specification { def "maximum of two numbers"() { expect: Math.max(a,b) ==c where: a|b||c 1|3||3 7|4||7 0|0||0 } } ラベルを使った期待値の記述方法 テストにあった 名前をメソッド名 をつける テストデータの組み合わせを このように表現する
  • 34. 今までの Groovy 、 Spock の知識を踏まえて、 Geb を使って Web システムの自動実行をする
  • 35. Geb でできること 1. Cross   Browser ( クロスブラウザ) 2. j Quey-like API (jQuery 的な API) 3. Page   Objects  (ページオブジェクト) 4. Asynchronus Pages( 非同期ページの対応 ) 5. Testing( テスティング) 6. Build Integration ( ビルドツールとの統合) 7. Screen Scraping (スクリーンキャプチャ)          
  • 36. コードで簡単さを体験。 import geb.Browser /** * フォームに入力する簡単なコード */ Browser.drive { go "http://myapp.com/login"    // 見出しが Please   Login であることを確認 assert $("h1").text() == "Please Login" $("form.login").with { username = "admin" password = "password" login().click() }    assert $("h1").text() == "Admin Section" } Geb の API を使って簡単 に j Query のセレクタのよ うな記述 次のページの h1 を確認し て Admin   Section なら OK
  • 37. PageObject パターンとは  アプリケーションの画面を1つのオブジェクトとしてモデリングするデザインパターン  Seleniumの公式サイトで保守性の高いテストコードを作成する書き方として推奨 テストコードに保守性? テストを継続的に実行していくということを考えると、製品コードの画面変更に合わせて常にテストコードを迅速に、低コストで保守していく必要がある。 テストの自動化のメリットは、同じテストを何度も実行する場合でないと薄いと考えると、テストコードが保守性に強いことは絶対に必要。            
  • 38. PageObject パターンとは Seleniumの公式サイトに記載してあるPageObjectパターンの原則を紹介 ・The public methods represent the services that the page offers (publicメソッドは、ページが提供するサービスを表す) ・Try not to expose the the internals of the page (ページの内部を公開しないこと) ・Generally don’t make assertions (原則としてassertionを行わないこと) ・Methods return other PageObjects (メソッドは他のPageObjectsを返す) ・Need not represent an entire page (ページ全体を表す必要はない) ・Different results for the same action are modelled as different as different methods (同じアクションに対して異なる結果となる場合には異なるメソッドとしてモデル化する)            
  • 40. PageObject パターンとは public class 商品検索ページ { WebDriver driver; // ページ内の要素を定数として定義 By textKeyword = By.name("keyword"); By buttonSearch = By.id("search"); public 商品検索ページ (WebDriver driver) { this.driver = driver; } // そのページで行える動作をメソッドとして定義 public 商品検索ページ 商品検索を行う (String keyword) { driver.findElement(textKeyword).sendKeys(keyword); driver.findElement(buttonSearch).click(); return this; } public 商品詳細ページ 商品詳細ページに遷移する (String name) { // (詳細ページに遷移する処理) return new 商品詳細ページ (driver); } } 他の PageObject パターン のページを返す、メソッド 他の PageObject パターン のページを返す、メソッド 実際に HTML のページ要素 に触るのはこちらだけ アプリケーションの レイアウト変更には かなり強くなる 商品検索ページをモデル化したクラス
  • 41. PageObject パターンとは public class 商品詳細ページ { WebDriver driver; public 商品詳細ページ (WebDriver driver) { this.driver = driver; } public 商品詳細ページ 商品をカートに入れ る () { // (カートに入れる処理) return this; } public 購入確認ページ 購入確認画面に遷移 する () { // (画面遷移の処理) return new 購入確認ページ (driver); } } 商品詳細ページをモデル化したクラス 他の PageObject パターン のページを返す、メソッド 他の PageObject パターン のページを返す、メソッド
  • 42. PageObject パターンとは @Before public void シナリオ実行前に必要な処理 () { (new ログイン画面 (driver)) . ログインする () . 商品画面に遷移する (); } @Test public void 購入フローのテスト () { (new 商品画面 (driver)) . 商品検索を行う (" 商品名 ") . 商品詳細画面に遷移する () . 商品をカートに入れる () . 購入確認画面に遷移する () . お届け先を選択する ( 自宅 ) . 支払い方法を選択する ( 代引 ) . 注文確認画面に遷移する () . 注文終了後にホーム画面に遷移する (); } 2つのページをテストする テストケース メソッドチェーンを用いて かなりわかり安い記述になる。
  • 43. Geb でも PageObject パターン GebはもちろのんPageObjectパターンをきちんとサポートしています。             class ExamplePage extends Page { static url = "http://www.example.com/" static at = { title = "Example Page"} static content = { textUserName = {$("input[name=user_name")} textmailAddress = {$("input[name=mail_address")} } } Browser.drive { to ExamplePage at ExamplePage } セレクタを用いた アクセスの仕方に なるのがまず大きな違い。
  • 44. Geb でも PageObject パターン 先ほどとは違うGebページオブジェクトパターンの例             GoogleHomePage ( Google の検索ページ用 PageObject ) import geb.* class GoogleHomePage extends Page { static url = "http://google.com/?complete=0" static at = { title == "Google" } static content = { //"content"のDSLは以下のように定義する //«name» { «definition» } searchField { $("input[name=q]") } searchButton(to: GoogleResultsPage) { $("input[value='Google Search']") } } void search(String searchTerm) { searchField.value searchTerm searchButton.click() } }            
  • 45. Geb でも PageObject パターン 先ほどとは違うGebページオブジェクトパターンの例             GoogleHomePage ( Google の検索ページ用 PageObject ) class GoogleResultsPage extends Page { static at = { waitFor { title.endsWith("Google Search") } } static content = { //"wait"オプションによって、Googleの検索結果ページに //$("li.g")が表示されるまで一定時間待つことができる。 //もし、表示されなかった場合は"RequiredPageContentNotPresent" 例外が //発生する results(wait: true) { $("li.g") } result { index -> results[index] } resultLink { index -> result(index).find("a") } } }            
  • 46. Geb を使った Web システムのテスト つべこべ言わずにいきなり体験してみましょう。 1. https://github.com/geb/geb-example-gradle 2.  上記を clone して gradlew コマンドを実行 ./gradlew.bat chromeTest ./gradlew.bat firefoxTest ./gradlew.bat phantomJsTest To run with all, you can run: ./gradlew.bat test
  • 47. Spock をもちいた記述の仕方 class LoginSpec extends GebSpec { def "ID とパスワードを組み合わせてログインす る "() { setup: to "http://www.example.com/login" when : $("#loginId").value("user01") $("#password").value("pass01") $("#login").click() then : at "http://www.example.com/home/" cleanup: } } ブロックを使ってテストケースを記述する
  • 48. Spock をもちいた記述の仕方 class LoginSpec extends GebSpec { def "ID とパスワードを組み合わせてログインす る "() { when : $("#loginId").value(loginId) $("#password").value(password) $("#login").click() then : $("#error").text() == errorMessage where: loginId | password || errorMessage "" | "pass01" || " ログイン ID を入力してく ださい " "user01" | "" || " パスワードを入力してくだ さい " "hoge" | "fuga" || "ID とパスワードの組み合 わせが正しくありません " } データ駆動テストのシンプルな記述の仕方
  • 49. Geb を使った取り組み どのようなことに Geb を使うか。 応用の可能性として考えられるもの。 1.Web システムのリグレッションテストの自動化 2.Web システムの疎通テストの自動化 3.Web システムのクロスブラウザ試験 4.Web システムの大量スナップショットとり 5.Web システムの受け入れテスト、結合テストの データ準備 6.Web システムの負荷テスト 7.JavaScript のユニットテスト         
  • 50. 参考 URL – Groovy • http://groovy-lang.org/ • https://speakerdeck.com/glaforge/what-makes- groovy-groovy ( スライド ) – SPOCK • https://code.google.com/p/spock/ – Geb • http://www.slideshare.net/youtaroutakahashi/what -makes-geb-groovy   ( スライド ) • http://www.slideshare.net/hirokotamagawa/20141 018-2selenium-40423299?next_slideshow=1 ( スラ イド ) • http://www.gebish.org •