首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

利用 Ruby 簡化 Java 測試(基礎篇):JRuby 與 JtestR 入門實戰

     編輯:Java 相關知識

為什麼 Java 開發者需要 Ruby 測試?

單元測試至關重要,但 Java 準備測試數據極其繁瑣:隨機字符串、樹狀結構構建、集合操作皆需大量樣板碼。Ruby 原生強大的字面量、集合 API、多行字符串、JSON 解析,讓測試數據準備變得輕鬆愉快。

語法速查:Ruby vs Java

# 隨機字母字符串
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 讓測試代碼聚焦業務意圖。

環境搭建:JtestR + Maven

<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 測試,報告合併輸出。

JRuby 基礎互操作

require 'java'
import 'java.util.ArrayList'
list = ArrayList.new
[1,2,3,4,5].to_java  # Ruby 陣列轉 Java List

實戰:關鍵字過濾服務測試

Java 服務介面

public interface KeywordFilterService {
    String[] filter(String[] comments);
    String[] getFiltedComments();
}

Ruby 測試代碼

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關鍵優勢
Ruby35字面量、陣列運算、DSL 風格斷言
Java (+Commons Lang)58類型安全、IDE 支援

總結

JRuby + JtestR 讓 Java 專案零成本引入 Ruby 測試,測試數據構建、集合操作、斷言表達力大幅提升。下一篇將深入 Mock、Stub 等進階主題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved