午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > 用Ruby實現一個單元測試框架的教程

用Ruby實現一個單元測試框架的教程

熱門標簽:天津外呼系統怎么收費 征服者企業地圖標注 柯城手機地圖如何做地圖標注 漯河電銷 巫師3地圖標注魔力之所 淮安自動外呼系統供應商 外呼線路從哪里出來的 AI電銷機器人 線路 中牟外呼系統違法嗎

在去年的YOW Melbourne開發者大會上,我參加了一些研習班。這些研習班由@coreyhaines和 @rains負責,因此TDD(測試驅動開發)成為了主要討論的內容。通常這不是一個問題,但是令人沮喪的是(考慮到這是2010年舉辦的開發者大會),那時上網還不是很方便,我剛裝上linux的筆記本無法下載Rspec。幸運的是幾周前,我決定自己寫一個單元測試框架(因為我有這個能力:)),接著我就有了一個可用的測試框架,問題解決了。但是,這讓我想到一個問題,最少可以用多少代碼寫成一個可用的單元測試框架?

一個最小可用的單元測試

剛開始寫一個單元測試框架的時候代碼是很少的,但當我想給它加入一些特性時就變得沒有那么精煉了:) 幸運的是重寫是很容易的。我們真正需要做的是執行下面的代碼:
 

describe "some test" do
 it "should be true" do
  true.should == true
 end
 
 it "should show that an expression can be true" do
  (5 == 5).should == true
 end
 
 it "should be failing deliberately" do
  5.should == 6
 end
end

正如你看到的,它很像是一個基本的Rspec測試。讓我們寫一些代碼來執行它。

譯注:RSpec 工具是一個 Ruby 軟件包,可以用它構建有關您的軟件的規范。該規范實際上是一個描述系統行為的測試。

構建一個簡單的框架

首先要做的是使用“describe”來定義一個新的測試。既然我們想要把”describe” block放在任何地方(例如,文件本身),我們需要對Ruby做一點擴展。“puts”函數在Kernel block中,因此可以在任何地方使用(因為Object類包含了Kernel并且Ruby中的每個對象都繼承自Object類),同樣的我們會把describe放到Kernel block中以賦予同樣的能力):
 

module Kernel
 def describe(description, block)
  tests = Dsl.new.parse(description, block)
  tests.execute
 end
end

譯注:Ruby block:Ruby語言的block功能類似回調函數。

正如你看到的,”describe”接收一個用來描述測試的字符串和包含了測試代碼的block。在這里,我們將測試的代碼和”describe”分開講解(例如,”it” block)。因此我們創建了Dsl類,用它的parse函數處理待測試的block,結果會產生一個可以執行我們所有測試的對象,但是不要高興得太早。Dsl類看上去是這樣的:

class Dsl
 def initialize
  @tests = {}
 end
 def parse(description, block)
  self.instance_eval(block)
  Executor.new(description, @tests)
 end
 def it(description, block)
  @tests[description] = block
 end
end

這里要做的是在Dsl對象的上下文里對block求值:
 

self.instance_eval(block)

我們的Dsl對象有一個”it”函數,同樣也接收一個描述和一個block,這里和describe block包含的內容完全一致,一切都運行得很好(例如,我們基本上會在幾個函數調用時使用”it”函數,每次都傳入一個描述和一個block)。我們還可以在Dsl對象中定義其他的函數,并且這些函數會成為允許在”describe” block中使用的“語言”的一部分)。

在describe block中,”it”函數會為每個”it” block調用一次。每次調用時,會把輸入的block以測試描述作為鍵值存儲在哈希表中。完成這些以后,我們只要創建一個Executor對象,可以對我們所有的測試block進行迭代,調用它們并產生執行結果。Executor代碼如下:
 

class Executor
 def initialize(description, tests)
  @description = description
  @tests = tests
  @success_count = 0
  @failure_count = 0
 end
 def execute
  puts "#{@description}"
  @tests.each_pair do |name, block|
   print " - #{name}"
   result = self.instance_eval(block)
   result ? @success_count += 1 : @failure_count += 1
   puts result ? " SUCCESS" : " FAILURE"
  end
  summary
 end
 def summary
  puts "\n#{@tests.keys.size} tests, #{@success_count} success, #{@failure_count} failure"
 end
end

我們的executor代碼非常簡單。輸出”describe” block的描述,然后遍歷所有存儲的”it” block并且在executor對象中執行它們。這么處理沒有什么特別原因,但這意味著executor對象同樣也可以包含其他函數,并且可以在”it” block中作為一種“語言”來使用(比如,我們dsl的一部分可以定義為executor的一個函數)。譬如,我們可以在executor上定義下列函數:
 

def should_be_five(x)
 5 == x
end

這個函數同樣可以在”it” block內部使用,但對于我們這個簡單的測試沒有這個必要。

所以,”it” block會計算并存儲結果,通常結果只是”it” block最后一個語句的返回值(按照常規的Ruby)。這里,我們希望確保最后一個語句總是返回一個布爾值(標明測試通過或失敗),通過它我們可以輸出一些有意義提示。

我們還差最后一步,”should”函數代碼如下:
 

true.should == true
5.should == 5

每個對象都應當提供自己”should”函數,代碼如下:
 

class Object
 def should
  self
 end
end

這個函數并沒有真正做什么工作(僅僅是返回對象本身);它僅僅是一個讓測試讀起來更好的語法。

在這個階段,我們只是將測試計算的結構轉換成一個字符串,表明測試結果通過或失敗并輸出。在這個過程中,我們會統計通過或失敗的測試數量,所以可以在最后給出一個總結報告。這就是我們所需要的所有的代碼,如果我們將他們放到一起,就是下面的44行代碼:

module Kernel
 def describe(description, block)
  tests = Dsl.new.parse(description, block)
  tests.execute
 end
end
class Object
 def should
  self
 end
end
class Dsl
 def initialize
  @tests = {}
 end
 def parse(description, block)
  self.instance_eval(block)
  Executor.new(description, @tests)
 end
 def it(description, block)
  @tests[description] = block
 end
end
class Executor
 def initialize(description, tests)
  @description = description
  @tests = tests
  @success_count = 0
  @failure_count = 0
 end
 def execute
  puts "#{@description}"
  @tests.each_pair do |name, block|
   print " - #{name}"
   result = self.instance_eval(block)
   result ? @success_count += 1 : @failure_count += 1
   puts result ? " SUCCESS" : " FAILURE"
  end
  summary
 end
 def summary
  puts "\n#{@tests.keys.size} tests, #{@success_count} success, #{@failure_count} failure"
 end
end

如果我們“需要”使用這個框架執行最初的那個測試,我們會得到下面輸出結果:

    some test

    - should be true SUCCESS

    - should show that an expression can be true SUCCESS

    - should be failing deliberately FAILURE

    3 tests, 2 success, 1 failure

太好了!現在,如果你因沒有一個單元測試框架而煩惱并且不想莽撞地寫代碼,只要花上5分鐘你就可以得到一個能夠助你一臂之力的測試框架。當然,這里有一些略微夸大;你很快就會想到這里缺少額外的驗證API、更好的輸出、對象仿真和測試樁等等。然而,我們可以很容易的在精簡的框架上擴展其中的一些功能(例如,增加額外的DSL元素)——只消花費很小的努力。如果你不相信我,可以看看bacon ,它只用了幾百行代碼就完成了Rspec一個精簡版。我編寫的Attest測試框架是另一個很好的例子(這么說有自賣自夸的嫌疑:P)。這兩者都缺少任何內建的test double 支持,我會在另外一個時間討論如何添加test double支持。

譯注:Test Double:在對象編程中“自動化單元測試”的專業術語,涵蓋的類型有Test Stub(測試樁)、Mock Object、Test Spy、Fake Object和Dummy Object。

您可能感興趣的文章:
  • Ruby中的Mechanize的使用教程
  • Ruby中區分運行來源的方法
  • Ruby中檢測Gem是否安裝的方法

標簽:棗莊 南昌 內江 河池 克拉瑪依 甘孜 西雙版納 大慶

巨人網絡通訊聲明:本文標題《用Ruby實現一個單元測試框架的教程》,本文關鍵詞  用,Ruby,實現,一個,單元,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《用Ruby實現一個單元測試框架的教程》相關的同類信息!
  • 本頁收集關于用Ruby實現一個單元測試框架的教程的相關信息資訊供網民參考!
  • 推薦文章
    91久久精品在线| 久久午夜精品一区二区| 亚洲成年人影院在线| 久久国产色av免费观看| 国产一区二区三区黄视频 | 在线播放欧美女士性生活| 日韩a级黄色片| 奇米一区二区三区| 国内精品小视频| 成人在线观看小视频| 色悠悠久久综合| 精品一区二区三区无码视频| 六月丁香婷婷色狠狠久久| 欧美高清第一页| 国产欧美一区二区三区在线观看视频| 亚洲免费资源在线播放| 日韩视频在线播放| 日日夜夜免费精品| 45www国产精品网站| 国产大片免费看| 91麻豆精品国产91久久久资源速度 | 精品视频在线免费观看| 黄色av免费在线播放| 91免费国产在线观看| 国产日韩在线精品av| 91视频在线视频| 日韩三级视频在线看| 亚洲精品久久久久久宅男| 成人福利视频网站| 成人自拍视频网站| 亚洲精品视频专区| 国内精品国产三级国产在线专| 免费看污片的网站| 福利视频第一区| 国产专区欧美专区| 成人午夜精品视频| 亚洲美女性视频| 国产精品美女高潮无套| 欧美性猛交xxxx黑人交| 天天干天天干天天干天天干天天干| 久久久久久久久久久久久夜| 日韩精品欧美专区| 久久草av在线| 444亚洲人体| 天堂中文网在线| 国产精品久久久久久一区二区| 五月婷婷亚洲综合| 色噜噜亚洲精品中文字幕| 日本一二三区在线观看| 亚洲成在人线av| 玖玖爱在线观看| 这里只有精品免费| 国产精品一级黄片| 欧美精品在线观看播放| 巨乳女教师的诱惑| 日韩欧美在线观看| 激情文学亚洲色图| 欧美午夜片欧美片在线观看| 五月天丁香花婷婷| 91福利社在线观看| 亚洲制服在线观看| 在线免费视频一区二区| 污视频在线观看免费网站| 日本国产一区二区| 稀缺呦国内精品呦| 欧美一区二区三级| 调教驯服丰满美艳麻麻在线视频| 精品91自产拍在线观看一区| 一本一本久久a久久| 亚洲欧美另类自拍| 国产又黄又爽又无遮挡| 精品国产网站地址| 中文字幕日韩第一页| 热99久久精品| 久久一二三四| 日本成人黄色| 国产日韩欧美精品电影三级在线| 91免费黄视频| 欧美日韩国产一区中文午夜| 香蕉在线观看视频| 日韩一区二区高清| 欧美片一区二区| 欧美激情一区二区三区在线视频观看| 一级α片免费看刺激高潮视频| 国产精品黄色av| 久色婷婷小香蕉久久| 亚洲国产日韩美| 一区二区三区中文在线观看| 潘金莲一级淫片aaaaa| 精品久久久久久久久久久院品网 | 综合久久一区二区三区| 99视频在线观看视频| 亚洲精品一区二区三区蜜桃下载| 精品无码久久久久| 日韩av免费在线| 国产一区二区精品久久| 波多野结衣av一区二区全免费观看| 亚洲va欧美va人人爽| 美女洗澡无遮挡| 久久综合伊人77777尤物| 色婷婷中文字幕| 伊人色综合影院| 精品欧美aⅴ在线网站| 99在线视频免费| 欧美激情图片区| 欧美a级一区二区| 日本高清xxxx| 欧美性生活大片免费观看网址| 五月婷婷六月香| 91av网站在线播放| 国产成人日日夜夜| 91淫黄看大片| 亚洲精品乱码久久久久久金桔影视 | 性欧美大战久久久久久久免费观看| 伊人性伊人情综合网| 69视频在线观看免费| 久久久久久尹人网香蕉| 国产真实乱对白精彩久久| 久久久久久久久久福利| 亚洲国产97在线精品一区| 亚洲性在线观看| 先锋影音欧美| 欧美日韩亚洲不卡| 日韩免费av片| 国产伦理一区二区三区| 亚洲一二三四在线| 99国产精品无码| 国产精品免费电影| 中文无字幕一区二区三区| a毛片毛片av永久免费| 青草青草久热精品视频在线网站| 99久久99久久久精品齐齐| 一区二区三区四区影院| 欧美激情va永久在线播放| 国产成人在线观看免费网站| 亚洲色图偷拍视频| 欧美高清视频在线观看| 国产精品亲子乱子伦xxxx裸| 999久久欧美人妻一区二区| 欧美亚洲综合另类| 免费观看日批视频| 色综合久久88色综合天天提莫| 欧美三级在线播放| 在线免费看av片| 亚洲精品天堂成人片av在线播放 | av无码精品一区二区三区| 最近2019中文免费高清视频观看www99| 美女一区二区久久| 日本一二三四区视频| 国产精品免费视频xxxx| 欧美亚洲高清一区二区三区不卡| 亚洲一线在线观看| 蜜臀av色欲a片无码精品一区| 欧美性猛交xxxx免费看| 91午夜交换视频| 国产一级特黄a大片99| 大伊人狠狠躁夜夜躁av一区| 日韩精品在线免费视频| 97人人做人人人难人人做| 午夜日韩在线电影| 亚洲婷婷综合网| 久久久一二三四| 精品久久99ma| 激情欧美一区二区| 亚洲调教欧美在线| 91亚洲精品一区| 在线观看一区二区视频| 亚洲午夜在线播放| 毛片在线视频观看| 在线视频一区二区| 91美女精品福利| 一级性生活免费视频| 久久99蜜桃综合影院免费观看| 884aa四虎影成人精品一区| 欧美一级特黄aaaaaa| 最新中文字幕2018| 4p变态网欧美系列| 精品欧美一区二区三区| 亚洲精品久久久久久久久久久久久久| jizz欧美性11| 国产日韩欧美日韩大片| 日韩欧美福利视频| 日本高清视频在线| 日本精品一二三区| 成人av免费在线看| 日韩精品影音先锋| 成人免费毛片嘿嘿连载视频| 精品视频第一页| 色视频一区二区三区| 一区二区三区视频在线| 亚洲日穴在线视频| 国产免费的av| 亚洲在线观看网站| 95av在线视频| 欧美一区二区三区四区五区| 理论片日本一区| 国精品人伦一区二区三区蜜桃| 亚洲欧美日韩一区二区| 欧美中文在线观看| 亚洲一区二区成人在线观看| 一区二区三区黄| xx欧美撒尿嘘撒尿xx| 国产精品综合网站| 欧美日韩国产综合视频在线观看| 人人超碰91尤物精品国产| 久操视频在线观看免费| 最新不卡av| 清纯唯美日韩制服另类| 欧美性猛交xxxx乱大交退制版| 蜜臀av性久久久久蜜臀aⅴ流畅| 黄色一级片一级片| 国产精品99久久免费黑人人妻| 热re99久久精品国产66热| 欧美久久一二三四区| 懂色av一区二区在线播放| 综合激情网五月| 亚洲天堂2018av| 国产精品久久精品国产| 一本色道久久综合狠狠躁篇怎么玩 | 日韩理论片久久| 亚洲精品视频在线观看网站| 日本成人在线不卡视频| 日韩不卡视频在线| 日本黄色免费观看| 人人妻人人澡人人爽欧美一区双 | 亚洲一区二区自拍偷拍| 国产精品久久久久91| 日韩www在线| 午夜私人影院久久久久| 国产成人三级在线观看| 自拍偷拍色综合| 干b视频在线观看| 奇米精品一区二区三区| 999在线观看免费大全电视剧| 揄拍成人国产精品视频| 欧美日韩的一区二区| 91丨porny丨国产| 丝袜美腿成人在线| caoporn国产| 亚洲码无人客一区二区三区| 国产精品无码一区二区在线| 牛人盗摄一区二区三区视频| 国产成人91久久精品| 亚洲老板91色精品久久| 久久久精品国产网站| 日本道色综合久久影院| 精品蜜桃传媒| 成人免费看片'免费看| 国产老头和老头xxxx×| 国内精品卡一卡二卡三| 97香蕉碰碰人妻国产欧美| 成年人视频观看| www.com操| 可以免费在线看黄的网站| 国产成人在线小视频| 超碰免费在线公开| 欧美日韩系列| 欧美日韩亚洲在线| 91青青草免费在线看| 97超碰人人看人人| 国产精品高潮粉嫩av| 日韩在线视频观看正片免费网站| 欧美性三三影院| 欧洲国内综合视频| 欧美日韩另类一区| 欧美亚洲日本一区| 亚洲成av人综合在线观看| 午夜a成v人精品| 国产午夜亚洲精品不卡| 成人av电影免费在线播放| 麻豆国产欧美日韩综合精品二区| 人人妻人人澡人人爽人人欧美一区| 中文在线字幕免费观| 最近国语视频在线观看免费播放| 久久青青草原亚洲av无码麻豆 | 91av在线视频观看| 色噜噜久久综合伊人一本| 亚洲精品国产综合区久久久久久久| 日韩欧美亚洲国产另类| 91精选在线观看| 在线不卡欧美精品一区二区三区| 欧美亚洲国产一卡| 欧美日韩你懂得| 欧美色中文字幕| 欧美性大战久久久久久久蜜臀| 亚洲成av人片| 精品福利樱桃av导航| 午夜免费久久看| 亚洲一二三专区| 亚洲午夜三级在线| 亚洲一区二区五区| 午夜精品免费在线| 欧美日韩免费在线观看| 亚洲电影激情视频网站| 香蕉成人啪国产精品视频综合网| 午夜精品久久久久| 色综合欧美在线视频区| 欧美特级www| 欧美性做爰猛烈叫床潮| 欧美一级国产精品| 亚洲国产古装精品网站| 亚洲香蕉伊综合在人在线视看| 日韩中文字在线| 精品视频免费看| 这里只有精品电影| 亚洲国产精品电影| 日韩精品中文字幕在线| 中文字幕欧美在线| 欧美日韩国产999| 国产精品1234| 国产精品午夜av在线| 中文字幕日韩一区二区三区| 成人一级生活片| 一级特黄性色生活片| 中文在线字幕观看| av黄色在线免费观看| 国产亚洲欧美久久久久| 国产精品自拍第一页| 亚洲精品久久久久久久久久| 久久精品久久久精品美女| 97久久超碰精品国产| 一区二区三区四区不卡视频| 欧美另类变人与禽xxxxx| 亚洲欧美精品suv| 青青久久av北条麻妃海外网| 国产视频在线观看一区| 成人一区二区av| 国产精品嫩草影视| 亚洲女同二女同志奶水| 成人av网站在线播放| 久久久亚洲人| 93久久精品日日躁夜夜躁欧美| 一区二区三区在线播| 欧美美女直播网站| 色爱av美腿丝袜综合粉嫩av| 国产精品十八以下禁看| 亚洲成人自拍视频| 中文字幕第88页| 三级黄色免费观看| 91女人18毛片水多国产| 久久99精品一区二区三区| 国产精品嫩草影院com| 欧美色图12p| 久久精品99久久香蕉国产色戒| 成人日韩av在线| 超碰10000| 欧美 日本 国产| 中国一级片黄色一级片黄| 国产一区二区成人久久免费影院| 一区二区三区四区av| 精品丝袜一区二区三区| 国产日韩换脸av一区在线观看| 超碰97免费观看| 超碰在线超碰在线| 日韩欧美中文字幕一区二区| 轻轻草成人在线| 一区二区三区国产| 日韩激情视频在线| 成人黄色av免费在线观看| www.亚洲成人网| 国产精品天天干| 国产ts人妖调教重口男| 久久精品免费在线观看| 91精品国产色综合久久ai换脸| 久久久最新网址| 日韩欧美在线观看强乱免费| 久久久久久国产精品日本| 手机看片久久久| av网站免费线看精品| 日韩欧美国产不卡| 国产精品草莓在线免费观看| av高清在线免费观看| 澳门黄色一级片| 青青草国产成人99久久| 偷拍与自拍一区| 欧美成人在线影院| 欧美一区二区三区四区在线观看地址| 中文字幕国产高清| 亚洲网站免费观看| 日本一区二区视频在线| 亚洲乱亚洲乱妇无码| 成人18视频| 女教师高潮黄又色视频| a天堂中文在线观看| 亚洲人成在线观看一区二区| 中文字幕国产亚洲2019| 伊人婷婷久久| 免费人成在线观看| 成人黄色av电影| 日韩小视频在线观看专区| 成人精品一区二区三区电影免费| 男人女人黄一级| 中文字幕日本视频| 欧美激情中文字幕| 日日狠狠久久偷偷四色综合免费| 久久精品午夜一区二区福利| 国产人妻黑人一区二区三区| 黄色一级a毛片| 色偷偷一区二区三区| 全球成人中文在线| 奇米影视四色在线| 国产草草影院ccyycom| 午夜精品一区在线观看| 国产精品h片在线播放| 日本女人性视频| 奇米综合一区二区三区精品视频| 欧美美女一区二区三区| 91精品国产一区二区三区动漫| 午夜性福利视频| 青草国产精品久久久久久|