SlideShare a Scribd company logo
1 of 63
Download to read offline
#JCConf
淺談 Geb 網站⾃自動化測試
林彥宏 lyhcode@gmail.com
#JCConf
• 遊牧⼯工程師 / Nomadic Developer
• 遠距⼯工作者 / Remote Worker
• 喜歡分享程式設計的樂趣
• Founder of 思創軟體,校園協同教學業師
• Co-founder of PLWeb,開發程式語⾔言學習網
• Groovy user since 2008
Who Am I
林彥宏
lyhcode.info
#JCConf
Geb (pronounced“jeb”)
very groovy browser automation… web testing, screen scraping and more
JCConfTW
2014
Geb (pronounced“jeb”)
very groovy browser automation… web testing, screen scraping and more
瀏覽器⾃自動化
Browser Automation
Groovy Browser Automation
What is Geb?
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Geb 可以做什麼︖?
• Web Application Testing
• Functional Testing
• User Acceptance Testing
• Web Automation Script
• Web Crawler
• Webpage Screenshot
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Geb 的優點
• Based on the WebDriver
• jQuery-like selector and syntax
• 易學易讀易寫的 Groovy DSL
• 實現 Page Object Pattern
• ⾼高度整合測試框架,如 JUnit, Spock, TestNG…
• 開發流程整合,搭配 Grails, Gradle, Maven,
Jenkins CI…
WebDriver
#JCConf
Geb (pronounced“jeb”)
very groovy browser automation… web testing, screen scraping and more
JCConfTW
2014
Java SE
Groovy WebDriver
Geb
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
SeleniumHQ
• Selenium IDE
• Selenium Remote Control
• Selenium WebDriver
• Selenium Grid
Browser Automation Suite
Geb 的核⼼心驅動
Selenium Sponsors:
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Selenium Core
• Created by Jason Huggins in 2004 at ThoughtWorks.
• 源起⾃自⼀一個測試⼯工具 “JavaScriptTestRunner”
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Selenium IDE
• Firefox extension
• Easy record and playback
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
WebDriver
• Selenium 1.0 + WebDriver = Selenium 2.0
• WebDriver API 規範已提交 W3C 標準
• http://www.w3.org/TR/webdriver/
• Selenium WebDriver
• ⽀支援多種程式語⾔言:
• Java, C#, Ruby, Python, Perl
• ⽀支援多種瀏覽器:
• Google Chrome、Firefox 與 Internet Explorer 等
• HtmlUnit (headless browser)
W3C Working Draft Editors
1. Simon Stewart, Facebook
2. David Burns, Mozilla
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Selenium Remote Control
• Selenium RC
• Client / Server 架構
• Great for testing
under a Continuous
Integration system
(e.g. Jenkins CI)
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
殘念
⾃自動化測試的難題
987. WebDriver driver = new FirefoxDriver();
988. driver.get("http://www.google.com");
989. WebElement element = driver.findElement(By.name("q"));
990. element.sendKeys("geb");
991. element.submit();
992. System.out.println("Title: " + driver.getTitle());
993. driver.quit();
為什麼我們還需要 Geb︖?
#JCConf
Geb (pronounced“jeb”)
very groovy browser automation… web testing, screen scraping and more
JCConfTW
2014
Java SE
Groovy WebDriver
Geb
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Why Groovy
• Groovy makes Java better, more powerful and easier
to use.
• Groovy 易學易寫,從 Java 到 Groovy ⾨門檻極低
• 程式碼更精簡,⽀支援以 Scripting ⽅方式執⾏行
• Groovy 發揮 DSL 優勢

DSL, Domain-Specific Language 領域描述語⾔言
• 共享 Java 豐富資源
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Groovy DSL
1. task hello {
2. doLast {
3. println "Hello"
4. }
5. }
6.
Example: Define a Gradle Task
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Why Are DSLs Important?
• To improve programmer’s
productivity.
• Smaller and easier to understand,
allow nonprogrammer to see the
code that drives important parts
of their business.
— Martin Fowler
ThoughtWorks
#JCConf
Geb (pronounced“jeb”)
very groovy browser automation… web testing, screen scraping and more
JCConfTW
2014
Java SE
Groovy WebDriver
Geb
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Geb Awesome
• jQuery-like
• CSS based content lookup (Navigator API)
$('input[name=username]').value()
• Method Chaining
$('h3').children().attr('href')
• DSL featured
Browser.drive {

go 'http://google.com'

}
This is Geb code, not jQuery :)
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
開始使⽤用 Geb
1. 安裝 JDK
2. 安裝 Groovy
3. 使⽤用 Groovy Shell 或 Groovy Console
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
安裝 Groovy
• 建議使⽤用 GVM ⼯工具(for Mac OS X, Linux)
• gvmtool.net
• Install Groovy with GVM tool
gvm install groovy
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
安裝 Geb︖?
• Geb 是⼀一個 Java/Groovy Library,

not standalone software
• 主要套件名稱是 geb-core
• 可以從 Maven Repository 取得所需 JAR 檔案
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Geb with Groovy Shell
$ groovysh
REPL (Read–Eval–Print Loop) 適⽤用於 Geb step-by-step 的執⾏行⽅方式
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Dependencies of Geb
<dependency>
<groupId>org.gebish</groupId>
<artifactId> geb-core </artifactId>
<version>0.10.0</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId> selenium-firefox-driver </artifactId>
<version>2.44.0</version>
</dependency>
Geb 需要 2 個套件(artifact)
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
搜尋 Maven Repository
mvnrepository.com
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Using Grapes
1. groovy.grape.Grape.grab(group: 'org.gebish', module:
'geb-core', version: '0.10.0')
2. groovy.grape.Grape.grab(group: 'org.seleniumhq.selenium',
module: 'selenium-firefox-driver', version: '2.44.0')
Grape lets you quickly add maven repository
dependencies to your classpath.
Attention: Not ‘org.codehaus.geb’
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Browse Google Web Site
3. b = new geb.Browser()
4. b.go 'http://google.com'
5. b.title
建⽴立 Browser 物件
命令瀏覽器開啟 URL 位址顯⽰示網⾴頁
取得網⾴頁標題“Google”
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
檢測元素
利⽤用「檢測器」觀察即時的 DOM
內容︔;⽽而非 HTML 原始碼
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
DOM 選擇器(Selector)
A. $('form.tsf')
B. $('form#tsf')
C. $('form[name=f]')
<form class="tsf" action="/search"
id="tsf" method="GET"
name="f" role="search">
選哪⼀一個好呢︖?
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Geb Navigator API
$('form.tsf').attr('action')
$('form[name=f]').attr('action')
$('form', name: 'f').attr('action')
$('form', id: 'tsf').attr('action')
<form class="tsf" action="/search"
id="tsf" method="GET"
name="f" role="search">
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
表單存取
6. form = b.$('form#tsf')
7. form.q = 'jcconf 2014'
利⽤用選擇器找到⽬目標表單元素
修改表單欄位資料︔;⽴立刻
在瀏覽器畫⾯面產⽣生改變
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
表單送出
8. form.btnk().click()
<input value="Google 搜尋”
name="btnK" type="submit">
點擊「Google 搜尋」按鈕
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
瀏覽器即時互動
groovy:000> b.title
===> jcconf 2014 - Google 搜尋
groovy:000> b.currentUrl
===> https://www.google.com.tw/?gfe_rd=cr&ei=JHtkVN6IIZCZlAWzv4CgBg&gws_rd=ssl#q=jcconf+2014
瀏覽器畫⾯面更新後,Geb 程式
可以獲取新的資料
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
存取網⾴頁內容
9. b.$('h3').collect { it.text() }
10. b.$('h3 a').collect { it.attr('href') }
搜尋結果的所有標題⽂文字
搜尋結果中所有的網⾴頁連結
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
點擊連結 Click
11. b.$('h3 a').first().click()
點進去搜尋排名在第⼀一筆的網站連結
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Scripting with Groovy
1. @Grab('org.gebish:geb-core:0.10.0')
2. @Grab('org.seleniumhq.selenium:selenium-firefox-driver:2.44.0')
3.
4. b = new geb.Browser()
5. b.go 'http://google.com'
6.
7. form = b.$('form#tsf')
8. form.q = 'jcconf 2014'
9. form.btnK().click()
10.
11. b.quit()
GoogleSearch.groovy
$ groovy GoogleSearch.groovy
使⽤用 @Grab 引入需要的套件
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Re-write in DSL Style
1. @Grab('org.gebish:geb-core:0.10.0')
2. @Grab('org.seleniumhq.selenium:selenium-firefox-driver:2.44.0')
3.
4. Browser.drive {
5. go 'http://google.com'
6.
7. $('form#tsf').with {
8. q = 'jcconf 2014'
9. btnK().click()
10. }
11. }.quit()
DSL 語法使⽤用 Groovy Closure 實現
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
waitFor
1. Browser.drive {
2. go 'http://google.com'
3.
4. $('form#tsf').with {
5. q = 'jcconf 2014'
6. btnK().click()
7. }
8.
9. waitFor {
10. title.contains('jcconf 2014')
11. }
12.
13. $('h3').each {
14. println it.text()
15. }
16. }.quit()
⼀一直等…⋯⼀一直等…⋯⼀一直等…⋯
直到標題變成 “jcconf 2014”
或是 Timeout (逾時)
預設的 Wait Timeout 預設值為 5 秒
#JCConf
1. #!/usr/bin/env groovy
2. @Grab('org.gebish:geb-core:0.10.0')
3. @Grab('org.seleniumhq.selenium:selenium-firefox-driver:2.44.0')
4. import geb.Browser
5.
6. def keywords = args.join(' ')
7.
8. Browser.drive {
9. go 'http://google.com'
10.
11. $('form#tsf').with {
12. q = keywords
13. btnK().click()
14. }
15. waitFor {
16. $('h3').size() > 0
17. }
18. $('h3').each {
19. println "* ${it.text()}"
20. }
21. }.quit()
GoogleSearch
command-line tool
$ ./GoogleSearch jcconf 2014 | sort | less
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Reporting
• 產⽣生測試報告
• 原始碼(.html)
• 網⾴頁快照(*.png)
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Reporting
1. Browser.drive {
2. config.reportsDir = new File('.')
3.
4. go 'index.html'
5. report 'home page'
6.
7. go 'login.html'
8. report 'login page'
9.
10. $('#form').with {
11. username = '...'
12. password = '...'
13. btnLogin().click()
14. }
15.
16. waitFor { title.contains('Dashboard') }
17. report 'dashboard page'
18. }
設定報表路徑
report 1
report 2
report 3
#JCConf
ScreenShot
command-line tool
$ ./ScreenShot http://jcconf.tw
#JCConf
1. #!/usr/bin/env groovy
2. @Grab('org.gebish:geb-core:0.10.0')
3. @Grab('org.seleniumhq.selenium:selenium-firefox-driver:2.44.0')
4. import geb.Browser
5. Browser.drive {
6. config.reportsDir = new File('.')
7. go args[0]
8. report "screenshot"
9. }.quit()
ScreenShot
$ ./ScreenShot http://jcconf.tw
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Cross-browser Testing
• selenium-chrome-driver
• selenium-firefox-driver
• selenium-ie-driver
• selenium-safari-driver
• selenium-htmlunit-driver
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
HtmlUnit Driver
• HtmlUnit - Java GUI-Less browser, supporting
JavaScript, to run agains web pages
• 適合沒有桌⾯面環境的 Server 執⾏行
• ⽀支援 JavaScript?
• 優點:速度快;缺點:不適合複雜的網⾴頁
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
1. @Grab('org.gebish:geb-core:0.10.0')
2. @Grab('org.seleniumhq.selenium:selenium-htmlunit-driver:2.44.0')
3. import geb.Browser
4. driver = 'htmlunit'
5.
6. Browser.drive {
7. go ...
8. }.quit()
設定 Geb Driver
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
1. @Grapes([
2. @Grab('org.gebish:geb-core:0.10.0'),
3. @Grab('org.seleniumhq.selenium:selenium-chrome-driver:2.44.0')
4. ])
5. import geb.Browser
6.
7. System.setProperty('webdriver.chrome.driver', '/tmp/chromedriver')
8.
9. driver = {
10. new org.openqa.selenium.chrome.ChromeDriver()
11.}
12.
13.Browser.drive {
14. go ...
15.}
ChromeDriver
需要先下載
chromedriver
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
RemoteWebDriver
Selenium RC Server
Selenium WebDriver
Geb
Selenium RC Client
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
RemoteWebDriver
• Launch a selenium server

java -jar selenium-server-standalone-2.44.0.jar -port 4000
→ http://192.168.0.144:4120/wd/hub
driver = new RemoteWebDriver(

new URL('http://192.168.0.144:4120/wd/hub'),

DesiredCapabilities.firefox()

)
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Cloud Browser Testing
• VM-based browsers on-demand
• 輕鬆測試各種[瀏覽器/作業系統/版本]的組合
• https://saucelabs.com/
• http://www.browserstack.com/
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
BrowserStack
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
BrowserStack
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
BrowserStack
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Geb + BrowserStack
1. def browserStackBrowser = System.getProperty("geb.browserstack.browser")
2. if (browserStackBrowser) {
3. driver = {
4. def username = System.getenv("GEB_BROWSERSTACK_USERNAME")
5. def accessKey = System.getenv("GEB_BROWSERSTACK_AUTHKEY")
6. new BrowserStackDriverFactory().create(
7. browserStackBrowser, username, accessKey)
8. }
9. }
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Testing Frameworks
Geb 可以搭配多種測試框架
• JUnit 3
• JUnit 4
• Spock
• TestNG
• Cocumber
• EasyB
Geb 與 Spock 搭配很對味
Framework JAR Class Name
Spock geb-spock geb.spock.GebSpec
JUnit 3 geb-junit3 geb.junit3.GebTest
JUnit 4 geb-junit4 geb.junit4.GebTest
TestNG geb-testng geb.testng.GebTest
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
Page Object
1. class LoginPage extends Page {
2. static url = "http://myapp.com/login"
3. static at = { heading.text() == "Please Login" }
4. static content = {
5. heading { $("h1") }
6. loginForm { $("form.login") }
7. loginButton(to: DashboardPage) { loginForm.login() }
8. }
9. }
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
GebSpec
1. class LoginSpec extends GebSpec {
2. def "login to dashboard section"() {
3. given:
4. to LoginPage
5.
6. when:
7. loginForm.with {
8. username = "admin"
9. password = "password"
10. }
11.
12. and:
13. loginButton.click()
14.
15. then:
16. at DashboardPage
17. }
18.}
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
開發流程整合
• Gradle + Geb
• https://github.com/geb/geb-example-gradle
• Maven + Geb
• https://github.com/geb/geb-example-maven
• Grails + Geb
• https://github.com/lyhcode/grails-realestate
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
官⽅方學習資源
www.gebish.org/manual/current/
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
我的教學⽂文章
1. Groovy Tutorial(7)使⽤用 Geb 開發 Web Test 網站⾃自動化測試(上)
2. Groovy Tutorial(8)使⽤用 Geb 開發 Web Test 網站⾃自動化測試(中)
3. Groovy Tutorial(9)使⽤用 Geb 開發 Web Test 網站⾃自動化測試(下)
www.codedata.com.tw/tag/groovy/
#JCConf
JCConfTW
2014
Geb
(pronounced“jeb”)
我的電⼦子書
限
時
免
費
正體中⽂文版
learngeb.readbook.tw
#JCConf
線上直接閱讀全⽂文
PDF, ePub, Kindle
離線閱讀電⼦子書檔案格式下載
幫推、按讚、分享
learngeb.readbook.tw
#JCConf
learngeb.readbook.tw
#JCConf
Thank You
Q & A
lyhcode@gmail.com
lyhcode.info

More Related Content

What's hot

What's hot (20)

[CLIW] Web testing
[CLIW] Web testing[CLIW] Web testing
[CLIW] Web testing
 
20160905 - BrisJS - nightwatch testing
20160905 - BrisJS - nightwatch testing20160905 - BrisJS - nightwatch testing
20160905 - BrisJS - nightwatch testing
 
Node.js and Selenium Webdriver, a journey from the Java side
Node.js and Selenium Webdriver, a journey from the Java sideNode.js and Selenium Webdriver, a journey from the Java side
Node.js and Selenium Webdriver, a journey from the Java side
 
Browser Automated Testing Frameworks - Nightwatch.js
Browser Automated Testing Frameworks - Nightwatch.jsBrowser Automated Testing Frameworks - Nightwatch.js
Browser Automated Testing Frameworks - Nightwatch.js
 
"How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie...
"How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie..."How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie...
"How to Use Bazel to Manage Monorepos: The Grammarly Front-End Team’s Experie...
 
High Performance JavaScript 2011
High Performance JavaScript 2011High Performance JavaScript 2011
High Performance JavaScript 2011
 
Test-Driven JavaScript Development (JavaZone 2010)
Test-Driven JavaScript Development (JavaZone 2010)Test-Driven JavaScript Development (JavaZone 2010)
Test-Driven JavaScript Development (JavaZone 2010)
 
Automated Frontend Testing
Automated Frontend TestingAutomated Frontend Testing
Automated Frontend Testing
 
Fullstack End-to-end test automation with Node.js, one year later
Fullstack End-to-end test automation with Node.js, one year laterFullstack End-to-end test automation with Node.js, one year later
Fullstack End-to-end test automation with Node.js, one year later
 
Continous Delivering a PHP application
Continous Delivering a PHP applicationContinous Delivering a PHP application
Continous Delivering a PHP application
 
One commit, one release. Continuously delivering a Symfony project.
One commit, one release. Continuously delivering a Symfony project.One commit, one release. Continuously delivering a Symfony project.
One commit, one release. Continuously delivering a Symfony project.
 
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
 
Efficient JavaScript Unit Testing, May 2012
Efficient JavaScript Unit Testing, May 2012Efficient JavaScript Unit Testing, May 2012
Efficient JavaScript Unit Testing, May 2012
 
Front-End Testing: Demystified
Front-End Testing: DemystifiedFront-End Testing: Demystified
Front-End Testing: Demystified
 
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and GulpOptimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
 
JCConf 2015 workshop 動手玩 Java 專案建置工具
JCConf 2015 workshop 動手玩 Java 專案建置工具JCConf 2015 workshop 動手玩 Java 專案建置工具
JCConf 2015 workshop 動手玩 Java 專案建置工具
 
Test-driven Development with Drupal and Codeception (DrupalCamp Brighton)
Test-driven Development with Drupal and Codeception (DrupalCamp Brighton)Test-driven Development with Drupal and Codeception (DrupalCamp Brighton)
Test-driven Development with Drupal and Codeception (DrupalCamp Brighton)
 
Hitchhiker's guide to the front end development
Hitchhiker's guide to the front end developmentHitchhiker's guide to the front end development
Hitchhiker's guide to the front end development
 
Acceptance tests
Acceptance testsAcceptance tests
Acceptance tests
 
Red Hat and Oracle: Delivering on the Promise of Interoperability in Java EE 7
Red Hat and Oracle: Delivering on the Promise of Interoperability in Java EE 7Red Hat and Oracle: Delivering on the Promise of Interoperability in Java EE 7
Red Hat and Oracle: Delivering on the Promise of Interoperability in Java EE 7
 

Similar to 淺談 Geb 網站自動化測試(JCConf 2014)

PhoneGap:你应该知道的12件事
PhoneGap:你应该知道的12件事PhoneGap:你应该知道的12件事
PhoneGap:你应该知道的12件事
longfei.dong
 
Best of brew city presentation final
Best of brew city presentation finalBest of brew city presentation final
Best of brew city presentation final
Ezekiel Chentnik
 

Similar to 淺談 Geb 網站自動化測試(JCConf 2014) (20)

WeCode IL: Confessions of a java developer that fell in love with the groovy...
WeCode IL:  Confessions of a java developer that fell in love with the groovy...WeCode IL:  Confessions of a java developer that fell in love with the groovy...
WeCode IL: Confessions of a java developer that fell in love with the groovy...
 
Javascript Apps at Build Artifacts
Javascript Apps at Build ArtifactsJavascript Apps at Build Artifacts
Javascript Apps at Build Artifacts
 
Stanislaw potoczny kra_qa_21.01.20
Stanislaw potoczny kra_qa_21.01.20Stanislaw potoczny kra_qa_21.01.20
Stanislaw potoczny kra_qa_21.01.20
 
Whats New In Groovy 1.6?
Whats New In Groovy 1.6?Whats New In Groovy 1.6?
Whats New In Groovy 1.6?
 
greach 2014 marco vermeulen bdd using cucumber jvm and groovy
greach 2014 marco vermeulen bdd using cucumber jvm and groovygreach 2014 marco vermeulen bdd using cucumber jvm and groovy
greach 2014 marco vermeulen bdd using cucumber jvm and groovy
 
Groovy Finesse
Groovy FinesseGroovy Finesse
Groovy Finesse
 
Groovy Finesse
Groovy FinesseGroovy Finesse
Groovy Finesse
 
Grooving with Jenkins
Grooving with JenkinsGrooving with Jenkins
Grooving with Jenkins
 
Taming Functional Web Testing with Spock and Geb
Taming Functional Web Testing with Spock and GebTaming Functional Web Testing with Spock and Geb
Taming Functional Web Testing with Spock and Geb
 
Groovy And Grails Introduction
Groovy And Grails IntroductionGroovy And Grails Introduction
Groovy And Grails Introduction
 
Java.il - Confessions of a java developer that fell in love with the groovy l...
Java.il - Confessions of a java developer that fell in love with the groovy l...Java.il - Confessions of a java developer that fell in love with the groovy l...
Java.il - Confessions of a java developer that fell in love with the groovy l...
 
Java Web Start czyli jak żyć z tą dziwną technologią & Continuous Delivery w ...
Java Web Start czyli jak żyć z tą dziwną technologią & Continuous Delivery w ...Java Web Start czyli jak żyć z tą dziwną technologią & Continuous Delivery w ...
Java Web Start czyli jak żyć z tą dziwną technologią & Continuous Delivery w ...
 
Geb quick start
Geb quick startGeb quick start
Geb quick start
 
Creating a Responsive Website From Scratch
Creating a Responsive Website From ScratchCreating a Responsive Website From Scratch
Creating a Responsive Website From Scratch
 
Play Framework: Intro & High-Level Overview
Play Framework: Intro & High-Level OverviewPlay Framework: Intro & High-Level Overview
Play Framework: Intro & High-Level Overview
 
PhoneGap:你应该知道的12件事
PhoneGap:你应该知道的12件事PhoneGap:你应该知道的12件事
PhoneGap:你应该知道的12件事
 
Dsl로 만나는 groovy
Dsl로 만나는 groovyDsl로 만나는 groovy
Dsl로 만나는 groovy
 
Javascript testing should be awesome
Javascript testing should be awesomeJavascript testing should be awesome
Javascript testing should be awesome
 
Grails @ Java User Group Silicon Valley
Grails @ Java User Group Silicon ValleyGrails @ Java User Group Silicon Valley
Grails @ Java User Group Silicon Valley
 
Best of brew city presentation final
Best of brew city presentation finalBest of brew city presentation final
Best of brew city presentation final
 

More from Kyle Lin

行動應用開發實務 - Gradle 介紹
行動應用開發實務 - Gradle 介紹行動應用開發實務 - Gradle 介紹
行動應用開發實務 - Gradle 介紹
Kyle Lin
 
Wiki 簡介與操作說明
Wiki 簡介與操作說明Wiki 簡介與操作說明
Wiki 簡介與操作說明
Kyle Lin
 
Tqc+ 物件導向程式語言(java)認證研習會
Tqc+ 物件導向程式語言(java)認證研習會Tqc+ 物件導向程式語言(java)認證研習會
Tqc+ 物件導向程式語言(java)認證研習會
Kyle Lin
 
TQC+團報系統學生版(雲科資管)
TQC+團報系統學生版(雲科資管)TQC+團報系統學生版(雲科資管)
TQC+團報系統學生版(雲科資管)
Kyle Lin
 
TQC+ Java 認證研習
TQC+ Java 認證研習TQC+ Java 認證研習
TQC+ Java 認證研習
Kyle Lin
 
20101220架構討論
20101220架構討論20101220架構討論
20101220架構討論
Kyle Lin
 
Asp net (1)
Asp net  (1)Asp net  (1)
Asp net (1)
Kyle Lin
 
TQC+ Java 全國教師研習會 PLWeb 介紹
TQC+ Java 全國教師研習會 PLWeb 介紹TQC+ Java 全國教師研習會 PLWeb 介紹
TQC+ Java 全國教師研習會 PLWeb 介紹
Kyle Lin
 

More from Kyle Lin (19)

物件導向系統分析與設計(建國)
物件導向系統分析與設計(建國)物件導向系統分析與設計(建國)
物件導向系統分析與設計(建國)
 
Android 智慧型手機程式設計
Android 智慧型手機程式設計Android 智慧型手機程式設計
Android 智慧型手機程式設計
 
淺談 Groovy 與 AWS 雲端應用開發整合
淺談 Groovy 與 AWS 雲端應用開發整合淺談 Groovy 與 AWS 雲端應用開發整合
淺談 Groovy 與 AWS 雲端應用開發整合
 
行動應用開發實務 - Gradle 介紹
行動應用開發實務 - Gradle 介紹行動應用開發實務 - Gradle 介紹
行動應用開發實務 - Gradle 介紹
 
2013 TQC+ Java 認證研習簡報
2013 TQC+ Java 認證研習簡報2013 TQC+ Java 認證研習簡報
2013 TQC+ Java 認證研習簡報
 
FarmLogs 農場管理軟體預覽
FarmLogs 農場管理軟體預覽FarmLogs 農場管理軟體預覽
FarmLogs 農場管理軟體預覽
 
TQC+物件導向程式語言Java認證班(和春資工)
TQC+物件導向程式語言Java認證班(和春資工)TQC+物件導向程式語言Java認證班(和春資工)
TQC+物件導向程式語言Java認證班(和春資工)
 
Wiki 簡介與操作說明
Wiki 簡介與操作說明Wiki 簡介與操作說明
Wiki 簡介與操作說明
 
Tqc+ 物件導向程式語言(java)認證研習會
Tqc+ 物件導向程式語言(java)認證研習會Tqc+ 物件導向程式語言(java)認證研習會
Tqc+ 物件導向程式語言(java)認證研習會
 
ContPub 雲端電子書自助出版平台
ContPub 雲端電子書自助出版平台ContPub 雲端電子書自助出版平台
ContPub 雲端電子書自助出版平台
 
TQC+團報系統學生版(雲科資管)
TQC+團報系統學生版(雲科資管)TQC+團報系統學生版(雲科資管)
TQC+團報系統學生版(雲科資管)
 
TQC+ Java 認證研習
TQC+ Java 認證研習TQC+ Java 認證研習
TQC+ Java 認證研習
 
20101220架構討論
20101220架構討論20101220架構討論
20101220架構討論
 
Asp net (1)
Asp net  (1)Asp net  (1)
Asp net (1)
 
Asp net
Asp net Asp net
Asp net
 
iisnode Test Drive
iisnode Test Driveiisnode Test Drive
iisnode Test Drive
 
開放源碼電子書與EPUB幕後排版
開放源碼電子書與EPUB幕後排版開放源碼電子書與EPUB幕後排版
開放源碼電子書與EPUB幕後排版
 
TQC+ Java 全國教師研習會 PLWeb 介紹
TQC+ Java 全國教師研習會 PLWeb 介紹TQC+ Java 全國教師研習會 PLWeb 介紹
TQC+ Java 全國教師研習會 PLWeb 介紹
 
Modern Browser as a Programming Editor
Modern Browser as a Programming EditorModern Browser as a Programming Editor
Modern Browser as a Programming Editor
 

Recently uploaded

%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
masabamasaba
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
VictoriaMetrics
 

Recently uploaded (20)

WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaS
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 

淺談 Geb 網站自動化測試(JCConf 2014)