test::unit – ruby單元測試框架
介紹:
單元測試是xp的核心部分。xp是偉大的,單元測試已出現了很長一段時間,而且它是乙個很好的思想。好的單元測試的關鍵部分不是寫測試**,而是要測試。兩者有什麼不同嗎?當然,如果你只是寫測試**而不用它,那麼你以後對**的修改將不會得到保證。換句話說,如果你已經測試(當然你首先要寫測試**),然後經常執行它們,那麼你慢慢地建立了乙個好習慣,雖然你不能馬上知道它的益處。
進入單元測試,則ruby內的用於單元測試的框架會幫助你設計,除錯和評估你的**,而你要做的就是寫測試**並執行它。
用法:
單元測試的隱含思想是讓你寫乙個測試方法,該方法為你的**寫些斷言,然後進行測試工作。大多數這些測試方法被打包到乙個測試單元中,並可在開發者需要的任何時候執行。執行的結果被收集在測試結果中並通過一些ui顯示給使用者。讓我們先看看test::unit提供了哪些必需的部分。
斷言:
框架的中心思想是要將斷言做為期望輸出的語句,也就是,「我斷言這個x應該等於y」。當斷言被執行時,如果它返回是正確的,不會有事發生。換句話說,如果你的斷言失敗,則錯誤資訊會反饋給你,以便你返回修改直到你的斷言成功。對斷言的詳細解釋,可參考test::unit::assertions。
測試方法與測試模具
明顯地,這些斷言必須在上下文環境中被呼叫,而這個上下文環境知道它們,並可以用它們的pass/fail值來做些事情。同樣,它也可以很方便地收集相關的測試,每個測試用乙個方法表示,然後放在乙個知道如何執行它們的類中。有三個原因,要將測試同它們要進行測試的**分開存放。首先,它可使你的測試**整潔並易於管理。其次,它允許分離測試**,因為它們只對你有用,而對使用者沒用。第三,它允許你設定通用的測試模具來重複測試。
什麼是測試模具?測試不存活在真空中;而是依賴於它們所要測試的**。通常,測試集依賴於一組資料,也可稱為模具。如果它們被打包在同一測試類中,它們或以共享這些資料的設定與解除,即setup與teardown方法。這可去除不必要的重複,並使模具可以容易地新增其它測試。
test::unit::testcase包裝測試方法在容器內,並允許你很容易地為每個測試設定和解除相同測試模具。這都是通過覆寫setup或teardown方法來做到,它們將在每個測試方法執行前及執行後被呼叫。testcase也知道如何收集你在test::unit::testresult中的斷言結果,然後它將報告顯示給你。想寫乙個測試,得依循下面步驟:
l 確保test::unit在你的庫路徑上。
l 在測試指令碼中請求『test/unit』。
l 建立test::unit::testcase類的子類。
l 為你的類新增以"test"開頭的方法。
l 在你的方法內使用斷言。
l 可按需要定義setup或/及teardown來設定你的測試模具。
l 現在你就可以執行你的測試了。
乙個相對簡單的測試看起來可能是這樣(setup和teardown通常不用給出,它們可選的):
require 'test/unit'
class tc_mytest < test::unit::testcase
# def setup
# end
# def teardown
# end
def test_fail
assert(false, 'assertion was false.')
endend
測試執行器
現在,你有了測試類,但是你還需要一種方式來執行它,並觀察在執行期間可能發生的任何失敗。它就是test::unit::ui::console::testrunner(或是其它的,如test::unit::ui:gtk::testrunner)。如果你在原始檔請求了』test/unit』並執行了這個檔案,則控制台測試執行器是自動被呼叫給你的。若是想使用其它執行器或手工管理執行器,可簡單地呼叫它的run類方法並傳遞乙個物件給它,這個物件應處理test::unit::testsuite的suite訊息。傳遞到你的testcase類(這個類有乙個suite方法)內也這麼簡單。看起來乙個實現應該是樣的:
require 'test/unit/ui/console/testrunner'
test::unit::ui::console::testrunner.run(tc_mytest)
測試單元
工程內的測試單元會越來越多,它終會變得在執行時緩慢。同時它也會讓你得到潛在的測試失敗,因為太多了你忘記了執行它。而易於管理的testrunner可接受任何物件,只要這個物件有與test::unit::testsuite相對應的suite方法。testsuite可以依次包含其它的testsuite或單獨的測試(通常由testsuites建立)。換句話說,你可以很容易地包裝一組testcase和testsuite,像這樣:
require 'test/unit/testsuite'
require 'tc_myfirsttests'
require 'tc_moretestsbyme'
require 'ts_anothersetoftests'
class ts_mytests
def self.suite
suite = test::unit::testsuite.new
suite << tc_myfirsttests.suite
suite << tc_moretestsbyme.suite
suite << ts_anothersetoftests.suite
return suite
endend
test::unit::ui::console::testrunner.run(ts_mytests)
現在,這還有點笨重,即使test::unit已經為我們做了很多,當你請求』test/unit』時自動地為你包裝了這些。這是什麼意思?它的意思是你應該像這個例子一樣寫測試案例:
require 'test/unit'
require 'tc_myfirsttests'
require 'tc_moretestsbyme'
require 'ts_anothersetoftests'
test::unit很聰明,它足以找到所有的objectspace內的測試案例並為你將它們包裝在乙個單元內。然後它使用控制台執行器執行動態單元。
下面文字來自於:
ruby 內建 unit testing framework, test::unit, 使用起來也蠻簡單的.
寫你的測試 class 記得從 test::unit::testcase 繼承
現在有了 test class, 你會想要測試他的執行結果.
require 'test/unit/ui/console/testrunner'test::unit::ui::console::testrunner.run(myfriend)
unittest單元測框架
django預設使用python的標準庫unittest編寫測試用例。學習django單元測試之前,先學習下unittest單元測試框架的基本使用。下面實現乙個簡單的單元測試1.簡單的加法和減法功能實現,module.py 如下 encoding utf 8 class calculator doc...
單元測試應該測什麼
單元測試應該全面覆蓋專案開發的 但是依賴的第三方 不應該被測試。凡是非本專案開發的 都可以認為是第三方 比如,我們專案依賴別的部門提供的儲存服務,連線此服務需要使用他們提供的乙個指令碼,而這個指令碼存放在我們的util目錄中。像這個指令碼,就是所謂的第三方 我用下面這段話來說服領導將這個指令碼從測試...
使用Spring配合Junit進行單元測試的總結
最近公司的專案和自己的專案中都用到了spring整合 junit進行 單元測試,總結一下幾種基本的用法 1.直接對spring中注入的bean進行測試 以dao為例 在測試類上新增 runwith註解指定使用springjunit的測試執行器,contextconfiguration註解指定測試用的...