第4回勉強会 groovyの文法からSpockまで
TRANSCRIPT
第 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/a9096d052dc2ab660728
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
テスティングフレームワーク
JUnitTestNG
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 の型はそのまま使える。型を宣言してもよい
明示的に宣言するのであれば def を使う
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 *= 3println 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) == 3assert adder(‘a’,’b’) == ‘ab’
def sum = { ... elements -> elements.sum()}
assert sum(1,2) == 3assert sum('a', 'b' ,'c') == 'abc'
Groovy の文法を 1 時間でマスターする• クロージャ 例をさらに一つ
引数にデフォルト値を設定
def mult = {int a, int b = 10 -> a * b}assert mult(2,3) == 6assert mult(5) == 50
Groovy の文法を 1 時間でマスターする• クロージャ 例をまだまだ
Personsの配列から年齢が18歳より下のオブジェクトを取り出す。 Javaで書くと結構複雑になりますよ。
@groovy.transform.Immutableclass 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() == 1assert 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-groovy ( スライド )
– SPOCK• https://code.google.com/p/spock/
– Geb• http://www.slideshare.net/youtaroutakahashi/what-makes-geb-groovy ( スライ
ド )• http://www.slideshare.net/hirokotamagawa/20141018-2selenium-40423299?next_sli
deshow=1 ( スライド )
• http://www.gebish.org