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

34
第4第 第第第 Web 第第第第第第第第第第第 第第第第 Groovy 第第 Spock 第第2016/1/23

Upload: mugen-fujii

Post on 16-Apr-2017

671 views

Category:

Engineering


0 download

TRANSCRIPT

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

第 4 回 勉強会

~ Web での自動結合テストへのいざない Groovy から Spock まで~

2016/1/23

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

今日やること

– 前回までは、 Java の文法、 Spring を使ったWeb アプリケーションの構築、単体テスト、JUnit を使った Unit テストのお話しでした。今日からはここ

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

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

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

Web アプリケーションのテストを自動化するために

• なぜ、 Selenium がダメか?–  コーディングが非常に大変

• 初心者に難しい• 自動化テストを安定動作させるだけでも大変

–   Selenium Web Driver が高速ではない• テストスローの問題を招きやすい

–  まだ、 Edge にドライバが対応していない–  スマートフォン、タブレットに対応しきれて

いない• Selenium3 に期待したいがいつ出るのだろう

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

Groovy + Spock + Geb

• Groovy– Java を極限まで簡単にしたスクリプト言語– 1 時間で学べる学習コストの低さ– Java のクラスライブラリは全部呼び出せる

• Geb– ゲブではなくジェブと読みます– Groovy で動く Selenium WebDriver のラッパー– jQuery のような Locator を指定して記述– コード量が少なく、すっきり

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

Groovy + Spock + Geb

• ツールの立ち位置をマトリックスにしてみると

ブラウザ操作 WebDriver Geb

テスティングフレームワーク

JUnitTestNG

Spock

言語 Java Groovy

マルチブラウザ対応

データ駆動テスト強力な Assert

なんとか Geb でテストケースを書いてブラウザテストを自動実行したい!

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

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

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

Groovy のインストール方法

• Eclipse   Plugin– こちらを詳しくみると Eclipse への対応

https://github.com/groovy/groovy-eclipse/wiki

– EclipseMars(4.5.1) 対応 http://dist.springsource.org/snapshot/GRECLIPSE/e4.5/ 

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

Groovy の文法を 1 時間でマスターする

• 世界最小の一文から

 セミコロンはいらない (あっても動作する) かっこ()もいらない (あっても動作する) さすがに‘’はないと 下記の Exception を吐く。  

println 'Hello'

Exception thrown

groovy.lang.MissingPropertyException: No such property: Hello for class: Helllo

at Helllo.run(Helllo.groovy:1)

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

Groovy の文法を 1 時間でマスターする

• 世界最小の一文から Java Class

Groovy Script   println 'Hello'

public class Main {public static void main(String[] args) {

System.out0.println("Hello");}

}

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

Groovy の文法を 1 時間でマスターする

• 型宣言

 型宣言はいらない  ( 動的型つけ言語)

 Java の型はそのまま使える。型を宣言してもよい

明示的に宣言するのであれば  def を使う

s = 'Hello'println s

String s = 'Hello'println s

def s = 'Hello'println s

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

Groovy の文法を 1 時間でマスターする

•  テキストリテラル

   “” を付けたほうが変数が評価されて展開される 他のスクリプト言語でもよくある動作です

 

msg = “<<This is message>>”println “${msg}”println ‘${msg]’

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

Groovy の文法を 1 時間でマスターする

•  演算子

    これなんて出力されると思います?

 

msg = "Hello"msg -= "l"msg *= 3println msg

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

Groovy の文法を 1 時間でマスターする•  クラスとメソッド

    コンストラクタ、インスタンス変数、メソッド    オブジェクト作成の概念はJavaと同じ

    

 

class Helo { def msg

Helo(s){ msg = s }

def sayHello(){ println msg }}new Helo(" こんにちは ").sayHello()

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

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();

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

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

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

Groovy の文法を 1 時間でマスターする• 条件分岐

    

     if 文はこのように書きます。     Javaと同じですね。

 

num = new Random().nextInt(100)if (num % 2){ println "${num} は、奇数 "} else { println "${num} は、偶数 "}

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

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} は、奇数 "}

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

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"

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

Groovy の文法を 1 時間でマスターする• クロージャ

    こんな風に関数を書きます。

          変数 totalに関数eachの中からアクセスしています。     さらに itには1から100までの数字が外から     渡されています。     関数ブロックの外の変数を操作できる関数の性質のことをクロージャといいます。

        

 

msg = {str -> println " こんにちは、 ${str} さん! " }msg(' 太郎 ')

total = 0 (1..100).each { total += it } println total

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

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'

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

Groovy の文法を 1 時間でマスターする• クロージャ 例をさらに一つ

    

    引数にデフォルト値を設定  

         

 

def mult = {int a, int b = 10 -> a * b}assert mult(2,3) == 6assert mult(5) == 50

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

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(',')

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

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() } }}

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

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'

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

Groovy の文法を 1 時間でマスターする• オープンクラス

         Expandoというクラスをnewしてオブジェクトを     作成するとオブジェクトの作成の後にインスタンス変数や、メソッドを追加できる。      Javaスクリプトのprototypeっぽいですね。

        

 

obj = new Expando() obj.name = "taro" obj.message = " こんにちは! " obj.say = { name = it println message + name } obj.say("花子さん ")

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

Groovy の文法を 1 時間でマスターする• デフォルトで importされるパッケージ

– java.io.*– java.lang.*– java.math.BigDecimal– java.math.BigInteger– java.net.*– java.util.*– groovy.lang.*– groovy.util.*

        

 

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

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 コードが

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

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 に

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

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)

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

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 で記載すっると、結構これが大変な作業になる

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

Groovy を使った Web システムのテスト    次回はここから Geb を使って    ブラウザテストを行うとこまでいきます。

        

 

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

息抜きにブログでも呼んで

– リクルートライフスタイル 開発者ブログ

• http://engineer.recruit-lifestyle.co.jp/techblog/

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

参考 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