SlideShare a Scribd company logo
1 of 76
Download to read offline
Spock
願你的測試
長長久久,生生不息
by 林世鵬
shihpeng.lin@gmail.com
• JAVA/Python/Groovy user
• 開發經驗包含Web app開發、Android app
開發、推薦演算法設計與開發、big data處
理等。
• 其他興趣:異質運算與效能分析。
About Me
• Java與Groovy應用程式的測試框架。
• 使用Groovy語言。
• 透過JUnit runner執行測試。
• 參考JUnit、RSpec、jMock、Mockito...
• Spock = Spec + Mock
Spock
https://github.com/grails-samples/grails-website/
blob/master/test/unit/org/grails/news/
NewsItemControllerSpec.groovy
• 以「擴展Java」為目的而設計的JVM語言。
• 對Java開發者極易學習。
• 利用Java的語法與API。
• 語法精簡、具表達性。
Groovy
Java
class Person {
String firstName
String lastName
}
public class Person {
private String firstName;
private String lastName;
public Person(){}
public Person(Map<String, String> args){
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Groovy
JavaGroovy
Groovy Collections
Projects that use Groovy
1. JDK 6 +
2. Groovy 2.1+
3. Gradle 1.0 +
4. Your favorite IDE
Prerequisite
Setup
// build.gradle
apply plugin: 'java'
apply plugin: 'groovy'
repositories {
mavenCentral()
}
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.3.3'
testCompile 'org.spockframework:spock-core:0.7-groovy-2.0'
}
https://meetspock.appspot.com/
Spock Web Console
1. 建立Specification類別。
2. 定義feature methods。
3. 定義其餘方法與欄位:
– fixture methods、
– fields、
– helper methods。
How to use
• 在Spock中,待測系統 (system under test;
SUT) 的行為是由規格 (specification) 所定
義的。
• 我們透過定義Specification的子類別來
完成SUT行為規格的制定。
• 即JUnit中的test class。
Specification
Specification
import spock.lang.Specification
class MyFirstSpec extends Specification {
// fields
// fixture methods
// feature methods
// helper methods
}
• Feature methods是Spock規格的核心,其
描述了SUT應具備的各項行為。
• 每個feature method會包含數個blocks,
分別表示測試SUT行為時的不同階段。
• 即JUnit中的test methods。
Feature Methods
Feature Methods
Execution
bus.route == ‘BRT’
• setup: or given:
• expect:
• when:
• then:
• where:
• cleanup:
• and:
Blocks in Feature Methods
• setup階段;用於準備測試所需資料與SUT
狀態。
• 必須是第一個出現的block。
• 不能重複出現。
• 第一個block之前出現的
敘述都會被當作setup:
的一部分。
setup: or given:
• 代表測試中的stimulus與response;必須
成對使用。
• 在when:中讓SUT進行動作。
• then:中確認執行結果或
SUT狀態。
• then:中要包含布林運算
式或其他條件判斷敘述
才有意義。
when: and then:
• SUT行為是否符合預期,是以then:或
expect:區塊中的布林運算式運算結果而
定。
• Spock沒有額外的assertion APIs。
• 在JUnit中,應在test methods內挑選合適
的assertion methods來使用。
Assertions
old() value in then:
• old()會取得when:
block之前變數的值。
• Stimulus結合Response。
• 適用於簡單的判斷。
expect:
JUnitSpock
What is this feature?
Given a stack and an
element,
when we push the
element on the stack,
then the size of the
stack should be one
and the peeked
element should be
the one we pushed
on.
• Setup
• Create Specification
• Define feature methods
• Run and show report
Demo
• where:用於提供不同變數內容,作為進行
參數化測試時的data provider。
• 必須是最後一個block。
• JUnit對參數化測試的
支援較薄弱,因此通常
透過JUnitParams完成。
where:
• 可使用data table或list。
• 也可每次動態計算變數值。
where:
JUnitSpock
@Unroll
Exceptional Cases
Exceptional Cases
• cleanup: 外部資源的清理。
• and: 用於分隔block內容,無實質功能。
Other Blocks
Fields
Spock
• Instance fields
• @Shared fields
• Statics
JUnit 4
• Instance fields
• N/A
• Statics
Fixture Methods
Spock
setup(){}
cleanup(){}
setupSpec(){}
cleanupSpec(){}
JUnit 4
@before
@after
@beforeClasss
@afterClass
@Ignore
@IgnoreRest
@IgnoreIf({...})
@AutoCleanup
@Timeout(10)
@Stepwise
Extensions
• Parameterized tests
• Exceptions tests
Demo
• 這就是Spock。
• 還有一些mocking與stubbing功能。
• 是一個方法名稱可以用字串,有很多block,
用Groovy來寫的JUnit。
Conclusion
.........
http://zeroturnaround.com/rebellabs/
java-tools-and-technologies-landscape-for-2014/
http://www.jameselsey.co.uk/blogs/techblog/
why-all-java-devs-should-at-least-consider-
groovy-and-spock-for-testing/
Why Spock?
你平常會寫(單元)測試嗎?
• 18:15 Release前發現還有一個bug
• 18:20 修好了!
• 18:21 發deploy request,打電話問老婆晚上要吃
什麼。
• 18:25 (搭電梯中)
QA來電:那個OOXX怎麼沒出來啊?
• ………(不知過了多久)
• 21: 35 「老婆,還有飯嗎?」
應該蠻常見的…
• 確認程式各單元 (units) 行為是否符合需求。
• 測試時SUT需與外界完全獨立。
– 以test doubles替換實際相依元件。
• 數量多、執行快。
• 結構單純。
– Arrange-Act-Assert, aka,
Given-When-Then
Unit Tests
• 作為程式碼的「安全網」。
• 減少臭蟲。
• 能專注於程式邏輯設計。
• 作為輔助文件、sample code。
Benefits of Unit Tests
• 先實作,再測試。
• 先測試,再實作。
• 測的是程式碼有沒有如開發者想的運作,
而非需求與功能。
• 測試會對程式碼有極高的耦合度。
• 極易造成“規格文件”、“程式碼”、”測試”的
不對應。
Code-First (Test-Last)
• 將測試作為描述元件行為的工具,
• 透過測試的撰寫來確認元件實作後的行為。
• 系統與測試間能保持鬆耦合,實作方式的
改動完全不影響測試本身。
Test-First (Code-Last)
• 語法精簡,容易改動。
• 語法須具表達性,包含高度語意。
• 不會給予太多為追求系統
testability而出現的限制。
• 能協助開發者思考元件行為。
That’s why we should
consider Spock for testing.
1. 建構子要能夠設定金額與貨幣
2. 如果金額是不合法的值,建構子要能丟出
IllegalArgumentException
3. 如果貨幣是不合法的值,建構子要能丟出
IllegalArgumentException
4.equals()對於以相同資料所建立出的
Money物件應該要回傳true
Money類別
Money.groovy
Money.groovy
2000 JUnit
2003 TestNG
JUnitParams、Hamcrest、jMock、EasyMock、
Mockito、Catch-Exception...
2007 Spock
Annotation、@DataProvider、
test configurations...
Test
Class
SUT
A
D
B
C
DOCs
State Tests vs. Interaction Tests
DOC: Depended-On Component
Additional Dependencies
// build.gradle
apply plugin: 'java'
apply plugin: 'groovy'
repositories {
mavenCentral() ""
}
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.3.3'
testCompile 'org.spockframework:spock-core:0.7-groovy-2.0‘
testRuntime 'cglib:cglib-nodep:2.2.2'
testRuntime 'org.objenesis:objenesis:1.2'
}
TargetClass mockTarget = Mock()
def mockTarget = Mock(TargetClass)
1 * mockTarget.receive("msg")
(1..3) * mockTarget.receive(_)
(1.._) * mockTarget.receive(_ as String)
Mocking
class PublisherSpec extends Specification {
Publisher publisher = new Publisher()
Subscriber subscriber = Mock()
Subscriber subscriber2 = Mock()
def setup() {
publisher.subscribers << subscriber
publisher.subscribers << subscriber2
}
def "should send messages to all subscribers"() {
when:
publisher.send("hello")
then:
1 * subscriber.receive("hello")
1 * subscriber2.receive("hello")
}
}
Verify Interactions
stubTarget.receive(_) >> "ok"
stubTarget.receive("msg1") >> "fail"
stubTarget.receive(_) >> { args ->
args[0].size > 3 ? "ok" : "fail"
}
Stubbing
• Spock完全相容現有工具,並能對Java與
Groovy程式進行測試。
• 表達性極高的語法,使測試能完美地擔任
描述SUT行為的工作。
• 結構化的block設計,便於思考測試步驟,
進一步改善SUT的設計。
• Spock是新世代的測試工具,無論撰寫測試
的方式為何,Spock都能給予很大的助益。
Conclusion
Spock + Geb
• Homepage http://spockframework.org
• Documentation http://docs.spockframework.org
• Spock Web console
http://webconsole.spockframework.org
• Source code http://github.spockframework.org/spock
• Spock example
http://github.spockframework.org/spock-example
References

More Related Content

What's hot

Entity Framework實戰
Entity Framework實戰Entity Framework實戰
Entity Framework實戰國昭 張
 
Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)Kris Mok
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇Justin Lin
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJustin Lin
 
CH11:執行緒與並行API
CH11:執行緒與並行APICH11:執行緒與並行API
CH11:執行緒與並行APIJustin Lin
 
Grails敏捷项目开发
Grails敏捷项目开发Grails敏捷项目开发
Grails敏捷项目开发Michael Yan
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plusDongxu Yao
 
Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法yiditushe
 
保哥線上講堂:LINQ 快速上手
保哥線上講堂:LINQ 快速上手保哥線上講堂:LINQ 快速上手
保哥線上講堂:LINQ 快速上手Will Huang
 
iOs app 101
iOs app 101iOs app 101
iOs app 101Tom Sun
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)Kris Mok
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
Django
DjangoDjango
DjangoTao He
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
用最潮的 Java script 盡情開發 kde qt 程式
用最潮的 Java script 盡情開發 kde qt 程式用最潮的 Java script 盡情開發 kde qt 程式
用最潮的 Java script 盡情開發 kde qt 程式Fred Chien
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7Justin Lin
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJava SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJustin Lin
 

What's hot (20)

Entity Framework實戰
Entity Framework實戰Entity Framework實戰
Entity Framework實戰
 
Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
 
CH11:執行緒與並行API
CH11:執行緒與並行APICH11:執行緒與並行API
CH11:執行緒與並行API
 
Grails敏捷项目开发
Grails敏捷项目开发Grails敏捷项目开发
Grails敏捷项目开发
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plus
 
Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法
 
Node分享 展烨
Node分享 展烨Node分享 展烨
Node分享 展烨
 
保哥線上講堂:LINQ 快速上手
保哥線上講堂:LINQ 快速上手保哥線上講堂:LINQ 快速上手
保哥線上講堂:LINQ 快速上手
 
iOs app 101
iOs app 101iOs app 101
iOs app 101
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
Django
DjangoDjango
Django
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
用最潮的 Java script 盡情開發 kde qt 程式
用最潮的 Java script 盡情開發 kde qt 程式用最潮的 Java script 盡情開發 kde qt 程式
用最潮的 Java script 盡情開發 kde qt 程式
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
笔记
笔记笔记
笔记
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJava SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
 
ev2oik
ev2oikev2oik
ev2oik
 

Viewers also liked

測試是什麼
測試是什麼測試是什麼
測試是什麼Yvonne Yu
 
淺談JavaFX 遊戲程式
淺談JavaFX 遊戲程式淺談JavaFX 遊戲程式
淺談JavaFX 遊戲程式CodeData
 
全文搜尋引擎的進階實作與應用
全文搜尋引擎的進階實作與應用全文搜尋引擎的進階實作與應用
全文搜尋引擎的進階實作與應用建興 王
 
MOPCON 2015 - 軟體、測試、程式設計家
MOPCON 2015 - 軟體、測試、程式設計家MOPCON 2015 - 軟體、測試、程式設計家
MOPCON 2015 - 軟體、測試、程式設計家家弘 周
 
淺談 Groovy 與 AWS 雲端應用開發整合
淺談 Groovy 與 AWS 雲端應用開發整合淺談 Groovy 與 AWS 雲端應用開發整合
淺談 Groovy 與 AWS 雲端應用開發整合Kyle Lin
 
JDK8 Functional API
JDK8 Functional APIJDK8 Functional API
JDK8 Functional APIJustin Lin
 
淺談 Java GC 原理、調教和 新發展
淺談 Java GC 原理、調教和新發展淺談 Java GC 原理、調教和新發展
淺談 Java GC 原理、調教和 新發展Leon Chen
 
關於測試,我說的其實是......
關於測試,我說的其實是......關於測試,我說的其實是......
關於測試,我說的其實是......hugo lu
 
Hadoop, the Apple of Our Eyes (這些年,我們一起追的 Hadoop)
Hadoop, the Apple of Our Eyes (這些年,我們一起追的 Hadoop)Hadoop, the Apple of Our Eyes (這些年,我們一起追的 Hadoop)
Hadoop, the Apple of Our Eyes (這些年,我們一起追的 Hadoop)Kuo-Chun Su
 
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)Chen Cheng-Wei
 
JavaScript Frameworks and Java EE – A Great Match
JavaScript Frameworks and Java EE – A Great MatchJavaScript Frameworks and Java EE – A Great Match
JavaScript Frameworks and Java EE – A Great MatchReza Rahman
 
Inversion of Control vs. Dependency Inversion Principle vs. Dependency Injection
Inversion of Control vs. Dependency Inversion Principle vs. Dependency InjectionInversion of Control vs. Dependency Inversion Principle vs. Dependency Injection
Inversion of Control vs. Dependency Inversion Principle vs. Dependency InjectionShihpeng Lin
 
Yahoo! 釀的酒 - 淺嚐 Cocktails
Yahoo! 釀的酒 - 淺嚐 CocktailsYahoo! 釀的酒 - 淺嚐 Cocktails
Yahoo! 釀的酒 - 淺嚐 CocktailsYing-Hsiang Liao
 
價值主張設計:如何測試 How to test your value proposition?
價值主張設計:如何測試 How to test your value proposition?價值主張設計:如何測試 How to test your value proposition?
價值主張設計:如何測試 How to test your value proposition?士杰 戴
 
持續整合與單元測試
持續整合與單元測試持續整合與單元測試
持續整合與單元測試昱劭 劉
 
超理性使用者介面設計 - Data-driven A/B Testing
超理性使用者介面設計 - Data-driven A/B Testing超理性使用者介面設計 - Data-driven A/B Testing
超理性使用者介面設計 - Data-driven A/B TestingYing-Hsiang Liao
 
HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28
HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28
HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28Shang Wei Li
 
軟體品質與持續整合
軟體品質與持續整合軟體品質與持續整合
軟體品質與持續整合家弘 周
 

Viewers also liked (20)

測試是什麼
測試是什麼測試是什麼
測試是什麼
 
淺談JavaFX 遊戲程式
淺談JavaFX 遊戲程式淺談JavaFX 遊戲程式
淺談JavaFX 遊戲程式
 
全文搜尋引擎的進階實作與應用
全文搜尋引擎的進階實作與應用全文搜尋引擎的進階實作與應用
全文搜尋引擎的進階實作與應用
 
MOPCON 2015 - 軟體、測試、程式設計家
MOPCON 2015 - 軟體、測試、程式設計家MOPCON 2015 - 軟體、測試、程式設計家
MOPCON 2015 - 軟體、測試、程式設計家
 
淺談 Groovy 與 AWS 雲端應用開發整合
淺談 Groovy 與 AWS 雲端應用開發整合淺談 Groovy 與 AWS 雲端應用開發整合
淺談 Groovy 與 AWS 雲端應用開發整合
 
JDK8 Functional API
JDK8 Functional APIJDK8 Functional API
JDK8 Functional API
 
淺談 Java GC 原理、調教和 新發展
淺談 Java GC 原理、調教和新發展淺談 Java GC 原理、調教和新發展
淺談 Java GC 原理、調教和 新發展
 
關於測試,我說的其實是......
關於測試,我說的其實是......關於測試,我說的其實是......
關於測試,我說的其實是......
 
Hadoop, the Apple of Our Eyes (這些年,我們一起追的 Hadoop)
Hadoop, the Apple of Our Eyes (這些年,我們一起追的 Hadoop)Hadoop, the Apple of Our Eyes (這些年,我們一起追的 Hadoop)
Hadoop, the Apple of Our Eyes (這些年,我們一起追的 Hadoop)
 
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
 
JavaScript Frameworks and Java EE – A Great Match
JavaScript Frameworks and Java EE – A Great MatchJavaScript Frameworks and Java EE – A Great Match
JavaScript Frameworks and Java EE – A Great Match
 
Inversion of Control vs. Dependency Inversion Principle vs. Dependency Injection
Inversion of Control vs. Dependency Inversion Principle vs. Dependency InjectionInversion of Control vs. Dependency Inversion Principle vs. Dependency Injection
Inversion of Control vs. Dependency Inversion Principle vs. Dependency Injection
 
Yahoo! 釀的酒 - 淺嚐 Cocktails
Yahoo! 釀的酒 - 淺嚐 CocktailsYahoo! 釀的酒 - 淺嚐 Cocktails
Yahoo! 釀的酒 - 淺嚐 Cocktails
 
價值主張設計:如何測試 How to test your value proposition?
價值主張設計:如何測試 How to test your value proposition?價值主張設計:如何測試 How to test your value proposition?
價值主張設計:如何測試 How to test your value proposition?
 
教與學之間
教與學之間教與學之間
教與學之間
 
持續整合與單元測試
持續整合與單元測試持續整合與單元測試
持續整合與單元測試
 
超理性使用者介面設計 - Data-driven A/B Testing
超理性使用者介面設計 - Data-driven A/B Testing超理性使用者介面設計 - Data-driven A/B Testing
超理性使用者介面設計 - Data-driven A/B Testing
 
HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28
HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28
HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28
 
軟體品質與持續整合
軟體品質與持續整合軟體品質與持續整合
軟體品質與持續整合
 
屏基 防疫雲簡報20150129
屏基 防疫雲簡報20150129屏基 防疫雲簡報20150129
屏基 防疫雲簡報20150129
 

Similar to Spock:願你的測試長長久久、生生不息

使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)Max Lai
 
Agile Taichung sharing Robot Framework 2018/05/19
Agile Taichung sharing Robot Framework 2018/05/19Agile Taichung sharing Robot Framework 2018/05/19
Agile Taichung sharing Robot Framework 2018/05/19Leo Tseng
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1netdbncku
 
Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Fong Liou
 
广告技术部自动化测试介绍.pdf
广告技术部自动化测试介绍.pdf广告技术部自动化测试介绍.pdf
广告技术部自动化测试介绍.pdfbj_qa
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用勇浩 赖
 
⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨Wen-Tien Chang
 
Btrace intro(撒迦)
Btrace intro(撒迦)Btrace intro(撒迦)
Btrace intro(撒迦)ykdsg
 
钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具taobao.com
 
Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Wen-Tien Chang
 
TQC+ Java 認證研習
TQC+ Java 認證研習TQC+ Java 認證研習
TQC+ Java 認證研習Kyle Lin
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]yiditushe
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具國昭 張
 
J Ruby和Rails 让Ruby语言融入Java项目
J Ruby和Rails 让Ruby语言融入Java项目J Ruby和Rails 让Ruby语言融入Java项目
J Ruby和Rails 让Ruby语言融入Java项目George Ang
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2netdbncku
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scalajavatwo2011
 
Java23种设计模式(总结)
Java23种设计模式(总结)Java23种设计模式(总结)
Java23种设计模式(总结)xuanlong282
 

Similar to Spock:願你的測試長長久久、生生不息 (20)

使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)
 
Agile Taichung sharing Robot Framework 2018/05/19
Agile Taichung sharing Robot Framework 2018/05/19Agile Taichung sharing Robot Framework 2018/05/19
Agile Taichung sharing Robot Framework 2018/05/19
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
 
Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)
 
广告技术部自动化测试介绍.pdf
广告技术部自动化测试介绍.pdf广告技术部自动化测试介绍.pdf
广告技术部自动化测试介绍.pdf
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
 
⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨
 
Btrace intro(撒迦)
Btrace intro(撒迦)Btrace intro(撒迦)
Btrace intro(撒迦)
 
钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具
 
Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛
 
Tip for Editors
Tip for EditorsTip for Editors
Tip for Editors
 
TQC+ Java 認證研習
TQC+ Java 認證研習TQC+ Java 認證研習
TQC+ Java 認證研習
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
 
Android labs part2
Android labs part2Android labs part2
Android labs part2
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具
 
J Ruby和Rails 让Ruby语言融入Java项目
J Ruby和Rails 让Ruby语言融入Java项目J Ruby和Rails 让Ruby语言融入Java项目
J Ruby和Rails 让Ruby语言融入Java项目
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
 
Java23种设计模式(总结)
Java23种设计模式(总结)Java23种设计模式(总结)
Java23种设计模式(总结)
 
Java 網路程式
Java 網路程式Java 網路程式
Java 網路程式
 

Spock:願你的測試長長久久、生生不息