第 4 回 勉強会
~ Web での自動結合テストへの
いざない Groovy から Spock まで~
2016/1/23
今日やること
– 前回までは、 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,Inteli-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 時間でマスターする
• リストとマップ
    リストとマップはこんな風に書きます。
    
    これ、なんて出力されると思いますか
    こんなリストの演算もできます。
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 時間でマスターする
• クロージャ 例をまだまだ
    
    
      
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 時間でマスターする
• クロージャ 例 ファイル読み書き
    
    
     input. txtから一行ごとに情報を読み込み
、 Groovy という文字列が含まれていたら大文字に置
換して output.txt に出力します。
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 してオブジェク
トを
     作成するとオブジェクトの作成の後にインスタ
ンス変数や、メソッドを追加できる。
      Java スクリプトの prototype っぽいですね。
     
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
}
}
ラベルを使った期待値の記述方法
テストにあった
名前をメソッド名
をつける
テストデータの組み合わせを
このように表現する
JUnit で記載すっると、
結構これが大変な作業になる
Groovy を使った Web システムのテスト
    次回はここから Geb を使って
    ブラウザテストを行うとこまでいきます。
     
   
息抜きにブログでも呼んで
– リクルートライフスタイル 開発者ブログ
• http://engineer.recruit-lifestyle.co.jp/techblog/
参考 URL
– Groovy
• http://groovy-lang.org/
• https://speakerdeck.com/glaforge/what-makes-groovy-gro
( スライド )
– SPOCK
• https://code.google.com/p/spock/
– Geb
• http://www.slideshare.net/youtaroutakahashi/what-makes
  ( スライド )
• http://www.slideshare.net/hirokotamagawa/20141018-2se
( スライド )
• http://www.gebish.org

第4回勉強会 Groovyの文法からSpockまで

  • 1.
    第 4 回 勉強会 ~Web での自動結合テストへの いざない Groovy から Spock まで~ 2016/1/23
  • 2.
    今日やること – 前回までは、 Javaの文法、 Spring を使った Web アプリケーションの構築、単体テスト、 JUnit を使った Unit テストのお話しでした。今日からはここ
  • 3.
    Web アプリケーションのテストを 自動化するために • SeleniumWeb 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,Inteli-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時間でマスターする • リストとマップ     リストとマップはこんな風に書きます。          これ、なんて出力されると思いますか     こんなリストの演算もできます。 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
  • 17.
    Groovy の文法を 1時間でマスターする • 条件分岐           if 文はこのように書きます。      Java と同じですね。 num = new Random().nextInt(100) if (num % 2){ println "${num} は、奇数 " } else { println "${num} は、偶数 " }
  • 18.
    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} は、奇数 " }
  • 19.
    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"
  • 20.
    Groovy の文法を 1時間でマスターする • クロージャ     こんな風に関数を書きます。            変数 total に関数 each の中からアクセスして います。      さらに it には1から 100 までの数字が外から      渡されています。      関数ブロックの外の変数を操作できる関数の msg = {str -> println " こんにちは、 ${str} さん! " } msg(' 太郎 ') total = 0 (1..100).each { total += it } println total
  • 21.
    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'
  • 22.
    Groovy の文法を 1時間でマスターする • クロージャ 例をさらに一つ          引数にデフォルト値を設定               def mult = {int a, int b = 10 -> a * b} assert mult(2,3) == 6 assert mult(5) == 50
  • 23.
    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(',')
  • 24.
    Groovy の文法を 1時間でマスターする • クロージャ 例 ファイル読み書き                input. txtから一行ごとに情報を読み込み 、 Groovy という文字列が含まれていたら大文字に置 換して output.txt に出力します。 new File('input.txt').withReader { r -> new File('output.txt').withWriter { w -> r.eachlinie { line -> if (line.contains('Groovy')) w << line.toUpperCase() } } }
  • 25.
    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'
  • 26.
    Groovy の文法を 1時間でマスターする • オープンクラス             Expando というクラスを new してオブジェク トを      作成するとオブジェクトの作成の後にインスタ ンス変数や、メソッドを追加できる。       Java スクリプトの prototype っぽいですね。       obj = new Expando() obj.name = "taro" obj.message = " こんにちは! " obj.say = { name = it println message + name } obj.say(" 花子さん ")
  • 27.
    Groovy の文法を 1時間でマスターする • デフォルトで import されるパッケージ – java.io.* – java.lang.* – java.math.BigDecimal – java.math.BigInteger – java.net.* – java.util.* – groovy.lang.* – groovy.util.*
  • 28.
    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 コードが
  • 29.
    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 に
  • 30.
    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)
  • 31.
    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 } } ラベルを使った期待値の記述方法 テストにあった 名前をメソッド名 をつける テストデータの組み合わせを このように表現する JUnit で記載すっると、 結構これが大変な作業になる
  • 32.
    Groovy を使った Webシステムのテスト     次回はここから Geb を使って     ブラウザテストを行うとこまでいきます。          
  • 33.
  • 34.
    参考 URL – Groovy •http://groovy-lang.org/ • https://speakerdeck.com/glaforge/what-makes-groovy-gro ( スライド ) – SPOCK • https://code.google.com/p/spock/ – Geb • http://www.slideshare.net/youtaroutakahashi/what-makes   ( スライド ) • http://www.slideshare.net/hirokotamagawa/20141018-2se ( スライド ) • http://www.gebish.org