您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源單元測(cè)試工具 >
跨越邊界: 在集成框架中進(jìn)行測(cè)試--在 Ruby on Rails 中進(jìn)行單元測(cè)試
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/2/27 15:39:39 ] 推薦標(biāo)簽:

在解決測(cè)試數(shù)據(jù)庫(kù)支持代碼的困擾時(shí),Java 開發(fā)人員經(jīng)常使用 mock 對(duì)象而不是實(shí)際的數(shù)據(jù)庫(kù)代碼。Mock 對(duì)象設(shè)置起來(lái)比較難,通常難于理解,而且對(duì)于在數(shù)據(jù)庫(kù)環(huán)境中工作的代碼,也無(wú)法提供良好的理解。Ruby on Rails 支持不同的方式。

有三個(gè)問(wèn)題影響了對(duì)數(shù)據(jù)庫(kù)支持代碼的測(cè)試。它們都與兩個(gè)特性有關(guān):性能和重復(fù)性。與內(nèi)存中的操作相比較,數(shù)據(jù)庫(kù)調(diào)用的性能是非常低的。如果測(cè)試運(yùn)行需要太長(zhǎng)時(shí)間,那么您可能不想運(yùn)行它們了。另一個(gè)問(wèn)題是一個(gè)測(cè)試用例對(duì)另一個(gè)測(cè)試用例的影響。因?yàn)閿?shù)據(jù)庫(kù)調(diào)用在性質(zhì)上是持續(xù)的,所以要把一個(gè)測(cè)試在數(shù)據(jù)庫(kù)中的變化與另一個(gè)數(shù)據(jù)庫(kù)中的隔離開。后的問(wèn)題是前兩個(gè)問(wèn)題的組合。為了讓數(shù)據(jù)庫(kù)測(cè)試用例可重復(fù)而增加設(shè)置和拆卸的負(fù)擔(dān)時(shí)(為每個(gè)新的測(cè)試用例添加記錄、運(yùn)行測(cè)試并刪除這些記錄),帶來(lái)的開銷可能是讓人無(wú)法接受的。與這種開銷相比,測(cè)試用例開銷簡(jiǎn)直是小巫見(jiàn)大巫。

Ruby on Rails 用 fixture 和事務(wù)回滾來(lái)幫助解決這些問(wèn)題。在 Rails 中,一個(gè) fixture 是一個(gè)包含測(cè)試用例數(shù)據(jù)的文件。在創(chuàng)建這個(gè)簡(jiǎn)單應(yīng)用程序時(shí),同時(shí)還創(chuàng)建了一個(gè)開發(fā)數(shù)據(jù)庫(kù)和一個(gè)測(cè)試數(shù)據(jù)庫(kù)。創(chuàng)建開發(fā)數(shù)據(jù)庫(kù)是很正常的;但是您可能不想讓生產(chǎn)代碼和開發(fā)環(huán)境共享同一個(gè)數(shù)據(jù)庫(kù)。而創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)因?yàn)榱硪粋(gè)原因也很重要。每個(gè)測(cè)試都在測(cè)試用例開始時(shí)裝入 fixture 中的測(cè)試數(shù)據(jù)。然后,測(cè)試用例對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改,并測(cè)試這些修改的結(jié)果。后,Rails 回滾這些變化,將數(shù)據(jù)庫(kù)返回到測(cè)試方法運(yùn)行之前的狀態(tài)。

現(xiàn)在要制作一個(gè)測(cè)試 fixture 并為它編寫一個(gè)測(cè)試。請(qǐng)編輯 test/fixtures/trails.yml 文件,添加一個(gè)記錄,如清單 13 所示:

清單 13. 添加記錄


    first:
      id: 1
      name: "Emma Long"
      description: "A real bike breaker."
      difficulty: "hard"
    another:
      id: 2
      name: "Bear Creek"
      description: "Too many downed trees."
      difficulty: "easy"


清單 13 使用叫做 YAML 的語(yǔ)言,這個(gè)語(yǔ)言描述結(jié)構(gòu)化的數(shù)據(jù)(請(qǐng)參閱 參考資料)。此文件對(duì)空格很敏感,所以該當(dāng)用空格代替制表符并完全按原樣鍵入數(shù)據(jù)項(xiàng)時(shí),請(qǐng)確保刪除了所有尾部空格。

同樣,還要把這個(gè)測(cè)試用例添加到 trails_test.rb 中:

    def test_find
      assert_equal "Emma Long", Trail.find(1).name
      assert_equal "easy", Trail.find(2).difficulty
    end


同樣,可以用 5 個(gè) passing 斷言運(yùn)行這些測(cè)試。如果您愿意,還可以按名稱引用每個(gè) fixture。例如,要根據(jù)名為 first 的 fixture 來(lái)創(chuàng)建對(duì)象,可以使用 Ruby 代碼 trails[:first]。讓 fixture 對(duì)所有測(cè)試用例或只對(duì)需要它們的測(cè)試用例可用,這極大地簡(jiǎn)化了創(chuàng)建或毀壞數(shù)據(jù)庫(kù)數(shù)據(jù)所需要的代碼。

在 Java 編程中測(cè)試

知道了測(cè)試在其他語(yǔ)言中如何發(fā)生,可以改進(jìn)在 Java 平臺(tái)上進(jìn)行測(cè)試的方式。具體地說(shuō),使用這些想法中的一項(xiàng)或多項(xiàng)可以對(duì)測(cè)試產(chǎn)生顯著而直接的影響:

    可以把測(cè)試用例的生成添加到任何現(xiàn)有代碼生成當(dāng)中。Ruby on Rails 通過(guò)在默認(rèn)情況下創(chuàng)建一些簡(jiǎn)單的測(cè)試用例來(lái)取得了巨大優(yōu)勢(shì),您也可以這么做。

    可以用事務(wù)-回滾技術(shù)讓數(shù)據(jù)支持的測(cè)試運(yùn)行得更快。Spring 框架有一些現(xiàn)有的攔截器,可以讓這項(xiàng)技術(shù)易于使用。

    實(shí)際上可以用動(dòng)態(tài)語(yǔ)言驅(qū)動(dòng)測(cè)試。Jython、Ruby 和 Groovy 是三個(gè)實(shí)際可能。

如果覺(jué)得愿意采用其他語(yǔ)言進(jìn)行測(cè)試,那么可以使用某種 JVM 語(yǔ)言,例如 JRuby(請(qǐng)參閱 參考資料)。JRuby 還沒(méi)有高級(jí)到可以運(yùn)行 Ruby on Rails,但是它是 Java 應(yīng)用程序卓越的測(cè)試平臺(tái)。只是作為嘗試,JRuby 的開發(fā)人員 Charles O'Nutter 提供了以下測(cè)試 EJB 的示例:

清單 14. 用 JRuby 測(cè)試 EJB 組件


    require 'test/unit'
    require 'java'

    include_class "my.pkg.EJBHomeFactory"

    class TestMyBean < Test::Unit::TestCase
      def test_finder
        wh = EJBHomeFactory.widget_home
        w = wh.find_by_color("blue")
        assert_not_nil(w)
      end

      def test_widget
        wh = EJBHomeFactory.widget_home
        w = wh.find_by_name ("superWidget")

        assert_equal("blue", w.color)
        assert_equal(14, w.id)
      end
    end


可以看到,用 Ruby 編寫執(zhí)行 Java 代碼的測(cè)試用例實(shí)際上非常容易。在這個(gè)示例中,Ruby 代碼發(fā)現(xiàn)一個(gè) EJB 組件,并為用戶返回的 bean 提供了一些斷言。測(cè)試用例當(dāng)然比多數(shù) Java 測(cè)試都容易,使用 Ruby 編寫測(cè)試用例是一個(gè)獲得更高的生產(chǎn)率和速率的一種好方法。我還看到針對(duì) Jython 或 Groovy 的類似策略。

上一頁(yè)1234下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd