上期文章講到JsonPath工具類封裝,遺留了一個坑,就是關于工具類的單元測試,由于中午得空,所以使用單元測試框架Spock寫了一點點單元測試用例,分享出來,供大家參考。
- 使用
Groovy
語言,spock
測試框架,如需了解請參考文章:
- Maven和Gradle中配置單元測試框架Spock
- Groovy單元測試框架spock基礎功能Demo
- Groovy單元測試框架spock數據驅動Demo
- 人生苦短?試試Groovy進行單元測試
- Spock 2.0 M1版本初探
- 單元測試框架spock和Mockito應用
- 中間用到了
Groovy
的文本塊,有興趣的可以看看Java文本塊。
單元測試用例
package com.FunTester.spock.utils_test
import com.alibaba.fastjson.JSON
import com.fun.utils.JsonUtil
import org.slf4j.Logger
import spock.lang.Shared
import spock.lang.Specification
import java.util.concurrent.atomic.AtomicInteger
import static com.fun.frame.SourceCode.getLogger
public class JsonUtilTest extends Specification {
@Shared
Logger logger = getLogger(this.getClass().getName())
@Shared
AtomicInteger times = new AtomicInteger(1)
@Shared
JsonUtil json = JsonUtil.getInstance(JSON.parseObject("{" +
" \"store\": {" +
" \"book\": [" +
" {" +
" \"category\": \"reference\"," +
" \"author\": \"Nigel Rees\"," +
" \"title\": \"Sayings of the Century\"," +
" \"page\": \"D\"," +
" \"pages\": [\"S\",\"X\",\"G\"]," +
" \"price\": 8.95" +
" }," +
" {" +
" \"category\": \"fiction\"," +
" \"author\": \"Evelyn Waugh\"," +
" \"title\": \"Sword of Honour\"," +
" \"page\": \"A\"," +
" \"pages\": [\"A\",\"B\"]," +
" \"price\": 12.99" +
" }," +
" {" +
" \"category\": \"fiction\"," +
" \"author\": \"Herman Melville\"," +
" \"title\": \"Moby Dick\"," +
" \"isbn\": \"0-553-21311-3\"," +
" \"page\": \"B\"," +
" \"pages\": [\"E\",\"F\"]," +
" \"price\": 8.99" +
" }," +
" {" +
" \"category\": \"fiction\"," +
" \"author\": \"J. R. R. Tolkien\"," +
" \"title\": \"The Lord of the Rings\"," +
" \"isbn\": \"0-395-19395-8\"," +
" \"page\": \"C\"," +
" \"pages\": [\"C\",\"D\"]," +
" \"price\": 22.99" +
" }" +
" ]," +
" \"bicycle\": {" +
" \"color\": \"red\"," +
" \"price\": 19.95" +
" }" +
" }," +
" \"expensive\": 10," +
" \"ss\": [32,32,4,23]" +
"}"))
def setupSpec() {
logger.info "測試類開始! ${logger.getName()}"
}
def setup() {
logger.info "第 ${times.get()} 次測試結束!"
}
def cleanup() {
logger.info "第 ${times.getAndIncrement()} 次測試結束!"
}
def cleanupSpec() {
logger.info "測試類結束! ${logger.getName()}"
}
def "驗證取值效果"() {
expect:
value as String == json.getString(path)
where:
value | path
10 | "\$.expensive"
"Sword of Honour" | "\$.store.book[1].title"
"0-395-19395-8" | "\$.store.book[3].isbn"
19.95 | "\$.store.bicycle.price"
"[19.95,8.95,12.99,8.99,22.99]" | "\$..price"
"[]" | "\$..fdsss"
"" | "\$.fdsss"
}
def "驗證數組相關功能"() {
expect:
value as String == json.getString(path)
where:
value | path
"""["S","X"]""" | "\$..book[0].pages[0,1]"
"""["G"]""" | "\$..book[0].pages[-1]"
"""["C"]""" | "\$..book[?(@.price == 22.99)].page"
"""["C"]""" | "\$..book[?(@.price in [22.99])].page"
"""["D"]""" | "\$..book[?(@.price nin [22.99,8.99,12.99])].page"
"""["C"]""" | "\$..book[?(@.title =~ /.*Lord.*/)].page"
"""["D","C"]""" | "\$..book[?(@.title =~ /.*the.*/)].page"
"""["B","C"]""" | "\$..book[?(@.pages subsetof ['D','C','E','F'])].page"
}
def "驗證處理數組的函數"() {
expect:
value == json.getDouble(path)
where:
value | path
91 | "\$.ss.sum()"
4 | "\$.ss.min()"
32 | "\$.ss.max()"
22.75 | "\$.ss.avg()"
11.4318 | "\$.ss.stddev()"
4 | "\$.ss.length()"
}
}
- 最后一個用例里面,我特意留了一個BUG,就是在計算標準差的時候,我省去了后面的幾位數字,導致一個用例失敗。
控制臺輸出
- 這里只放了最后一個方法的輸出,其他的都是成功的,所以就省去了。
INFO-> 第 16 次測試結束!
INFO-> 第 16 次測試結束!
INFO-> 第 17 次測試結束!
INFO-> 第 17 次測試結束!
INFO-> 第 18 次測試結束!
INFO-> 第 18 次測試結束!
INFO-> 第 19 次測試結束!
INFO-> 第 19 次測試結束!
INFO-> 第 20 次測試結束!
INFO-> 第 20 次測試結束!
INFO-> 第 21 次測試結束!
INFO-> 第 21 次測試結束!
Condition not satisfied:
value == json.getDouble(path)
| | | | |
| | | | $.ss.stddev()
| | | 11.431863365173676
| | <com.fun.utils.JsonUtil@192d74fb json=[ss:[32, 32, 4, 23], store:[bicycle:[color:red, price:19.95], book:[[pages:[S, X, G], author:Nigel Rees, price:8.95, page:D, category:reference, title:Sayings of the Century], [pages:[A, B], author:Evelyn Waugh, price:12.99, page:A, category:fiction, title:Sword of Honour], [pages:[E, F], author:Herman Melville, price:8.99, isbn:0-553-21311-3, page:B, category:fiction, title:Moby Dick], [pages:[C, D], author:J. R. R. Tolkien, price:22.99, isbn:0-395-19395-8, page:C, category:fiction, title:The Lord of the Rings]]], expensive:10]>
| false
11.4318
<Click to see difference>
at com.FunTester.spock.utils_test.JsonUtilTest.驗證處理數組的函數(JsonUtilTest.groovy:120)
- 公眾號FunTester首發,原創分享愛好者,騰訊云和掘金社區首頁推薦,知乎七級原創作者,更多原創文章,歡迎關注、交流,禁止第三方擅自轉載。