單元測試至關重要,但 Java 準備測試數據極其繁瑣:隨機字符串、樹狀結構構建、集合操作皆需大量樣板碼。Ruby 原生強大的字面量、集合 API、多行字符串、JSON 解析,讓測試數據準備變得輕鬆愉快。
# 隨機字母字符串
def random_alphabetic(size=5)
chars = ('a'..'z').to_a + ('A'..'Z').to_a
(0...size).collect { chars[rand(chars.length)] }.join
end
# JSON 字面量直接解析
data = <<-EOF
{ "order_id": "xxx", "books": [{ "ISBN": "2323", "number": 2, "price": 20.0 }] }
EOF
order = JSON.parse(data)
order['books'][0]['ISBN'] # => "2323"
Java 即便借助 Commons Lang 仍顯冗長;XML 更非人類友好。Ruby 讓測試代碼聚焦業務意圖。
<plugin>
<groupId>org.jtestr</groupId>
<artifactId>jtestr</artifactId>
<version>0.3.1</version>
<configuration>
<tests>src/test/ruby</tests>
</configuration>
<executions>
<execution><goals><goal>test</goal></goals></execution>
</executions>
</plugin>
將測試文件置於 src/test/ruby,mvn test 同時運行 Java 與 Ruby 測試,報告合併輸出。
require 'java'
import 'java.util.ArrayList'
list = ArrayList.new
[1,2,3,4,5].to_java # Ruby 陣列轉 Java List
public interface KeywordFilterService {
String[] filter(String[] comments);
String[] getFiltedComments();
}
require 'test/unit'
import 'com.alisoft.research.JRuby.service.KeywordFilterServiceImpl'
class KeywordFilterServiceTest < Test::Unit::TestCase
def setup
@keywords = %w{X XX XXX XXXX XXXXX XXXXXX XXXXXXX} # 字符串陣列字面量
end
def test_filter
comments = random_comments
service = KeywordFilterServiceImpl.new(@keywords.to_java(:String))
filted = service.filter(comments.to_java(:String))
forbiddens = service.getFiltedComments
assert forbiddens.length == comments.length - filted.length
assert_equal forbiddens.sort, (comments - filted).sort # 陣列減法運算
end
def random_alphabetic(size=5)
chars = ('a'..'z').to_a + ('A'..'Z').to_a
(0...size).collect { chars[rand(chars.length)] }.join
end
def random_comments
comments = []
10.times do
keyword = rand(10) % 3 == 0 ? ' ' : @keywords[rand(@keywords.length)]
comments << random_alphabetic + keyword + random_alphabetic
end
comments
end
end
| 語言 | LOC | 關鍵優勢 |
|---|---|---|
| Ruby | 35 | 字面量、陣列運算、DSL 風格斷言 |
| Java (+Commons Lang) | 58 | 類型安全、IDE 支援 |
JRuby + JtestR 讓 Java 專案零成本引入 Ruby 測試,測試數據構建、集合操作、斷言表達力大幅提升。下一篇將深入 Mock、Stub 等進階主題。