亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Nodejs學習筆記之測試驅動

2019-11-20 12:39:01
字體:
來源:轉載
供稿:網友

分享第二章,關于測試驅動。這里的測試主要針對Web后端的測試 ―― 你為什么要寫測試用例(即測試用例的完善是否是浪費時間),如何完善你的測試用例,代碼設計如何簡化測試用例的書寫,以及一些后期的構想。

1. 你為什么要寫測試用例

這個習慣通常會被認為是一種耽誤開發進度的行為,你需要花費幾乎和開發代碼相同的時間來逐步完善你的測試用例。但是在開發過程中,在開發完成一段代碼后如果負責任而不是說完全把問題交給測試人員去發現的話,這個時候通常都會去做一些手動的測試。例如:

在代碼中執行某些方法,查看輸出的值是否符合預期。
修改數據庫/緩存,然后執行某些方法,看數據庫的變化是否符合預期。
使用工具模擬請求某些接口,查看接口的返回值/數據庫的變化值是否會符合預期。
如果有前端頁面的話,還會涉及到前后端聯調,即要在前端頁面上通過前端交互,查看前端的反饋是否符合預期,來間接驗證后端代碼的正確性。
現代化的測試工具都在盡可能的將這些人工的手動測試行為抽象成代碼塊,當你有意識去進行手動測試的時候,其實已經開始在嘗試測試用例的行為了。既然可以通過手動的方式進行測試,那為什么還需要用代碼來實現測試?

代碼是可以復用或者在簡單重構后可以實現更多的功能的,但是當你選擇手動的時候,每次你都需要重頭開始。
成熟的工作流中應當包括代碼審核流程,代碼審核的方式有很多,逐句閱讀你的代碼,或者檢查你測試代碼的完善性以及正確性,然后運行你的測試用例。后者更加簡單。
當代碼改動,例如修復 Bug 時候,很難保證你的改動是否會影響其他依賴你代碼的部分。在人工測試的時代有一個叫做回歸測試,即在你修復 Bug 將你的系統重新測試一遍。但是如果你已經有了完善的測試用例了呢,直接執行命令搞定。
當你重構代碼的時候,同上。

2. 如何完善你的測試用例

在進入完善階段前,先說說你將如何實現測試用例。

describe Meme do before do  @meme = Meme.new end describe "when asked about cheeseburgers" do  it "must respond positively" do   @meme.i_can_has_cheezburger?.must_equal "OHAI!"  end end describe "when asked about blending possibilities" do  it "won't say no" do   @meme.will_it_blend?.wont_match /^no/i  end endend

上面的代碼來自于 Ruby 的 minitest。before 包含的代碼塊是在執行下面的測試用例前要做的事情,通常還會支持一個相對應的方法,在測試用例執行完執行。每個用例里面都進行一些很小的判斷。

第一段中提到了一些手動測試里面經常會涉及到的測試內容,這里拿其中的 2 和 3 進行說明。在進行數據庫相關的測試時,需要在 before 中插入一條測試數據,并且在 after 中刪除測試數據。中間的測試用例中,通過執行相應的方法,執行完畢后:檢查數據變化情況/檢查是否有預期的異常/是否返回預期結果 來確認代碼的正確性。如果是接口的話,就是通過代碼發起對應的請求,然后檢查返回的內容是否返回預期,有需要的話再去查看數據庫里面的數據是否符合預期變化。

現在已經有了測試用例,但是任然需要考慮一種特殊情況。我現在為一個函數寫了相對完善的測試用例了,跑完都 PASS 了,結果發現線上的日志里面還是有那個函數的報錯。檢查下發現函數的某個分支之前在測試的時候沒有測試到,剛好線上的某種情況運行到了這個分支,結果有一個很不明顯的語法錯誤報錯了,有沒有辦法能確保所有的代碼都測試過了?這里需要引入的是一個叫做 測試用例覆蓋率 的概念,基本上每個語言都會有響應的實現。通過測試用例覆蓋率,量化的告訴你你的測試用例有沒有跑完某某文件里的所有代碼,而你需要做的,就是盡可能保證你的覆蓋率保持在 100%。

某種意義上來說,測試用例和測試覆蓋率是用來提高開發者對自己代碼自信心的工具。但是,他們也不是萬能的。測試用例里面總可能會漏掉一些參數的可能性,當然你的代碼里面也沒有為這種可能性進行代碼的編寫,最終測試用例覆蓋率只能告訴你你寫的代碼我們都幫你檢測過了測試過了,對于你沒有考慮到的可能性,表示無能為力。所以盡可能編寫嚴格的代碼,例如 javascript 里面盡可能都用 === 而不是 ==,使用強類型的編程規范等等,這些來降低這種因為接受的參數范圍過大帶來的潛在風險。

3. 代碼設計如何簡化測試用例的書寫

整個 Web (也不局限于 web)通常包括三個層面的代碼 ―― 單純數據處理與運算、涉及到數據庫、涉及到具體的網絡協議。其中單純的數據運算于處理主要為普通的運算的函數或者是其他代碼,涉及到數據庫就是傳統意義上 MVC 里面的 M,涉及到具體的網絡協議就是對應的 C。這三塊的測試分別對應著第一節中常規的測試內容的前三條。

因為 C層面通常還可能涉及到頁面的渲染以及相應協議的模擬,所以通常把測試的重心放在函數以及數據庫相關的代碼里面可以減少測試用例代碼的復雜度,這個就要求 Controller 的代碼要盡可能少。對于復雜度較高的應用的一些目前的一些建議:

將數據的基礎校驗都放在 M層,如果使用 Ruby 開發的話,ActiveRecord以及Mongoid都提供了很方便使用的 validation 功能。
嘗試在代碼中使用 Pub/Sub 模式配合一些 ORM中提供的鉤子(hook) 來實現 Model 之間的通信。 例如在 A 創建的時候發布某個消息,B監聽到消息之后修改他自己的某個屬性值。
使用 Command 模式將一些業務無關的功能從系統中抽離出來,例如郵件發送。
以上建議參考:Laravel wisper resque

4. 構想

以上的內容都避開了前后端需要聯調的測試用例,下面的內容主要是針對這塊。Ruby 在這個方向已經有一些比較優雅的實現,感興趣的可以直接先去欣賞一下 Capybara。

隨著包括 Selenium Phantomjs 以及基于前者的 Watir 等一系列瀏覽器驅動的普及,使用代碼控制瀏覽器已經不再是一件很復雜的事情。在這個能力的基礎上,可以嘗試把基于前端的測試分為四步:

等待某標志性元素出現(例如等待頁面載入玩,或者某個內容異步加載出現)
模擬用戶操作,這里的操作包括且不局限于用戶點擊、用戶輸入
等待反饋中標志性元素出現(例如某某輸入框出現)
判斷內容,是否符合預期
基于這個流程,可以解決絕大多數的前端測試。但是單純依靠這個流程任然不夠,因為頁面中可能出現例如驗證碼這樣的阻礙元素,在不修改代碼的前提下,可以嘗試通過數據庫/緩存來取到這些內容。同樣,和測試接口相同,這里也涉及到在測試前數據庫中插入測試數據,測試用例執行后嚴重數據庫里面數據變化,以及全部測試完畢后刪除測試數據的內容。最終導致這塊測試用例代碼的實現需要同時對前端后端有一定的了解。目前還在考慮在借鑒 Capybara 的基礎上,設計出更加通用的方案。

最后貼一段 Capybara 的代碼結束這段內容:

feature "Signing in" do background do  User.make(:email => 'user@example.com', :password => 'caplin') end scenario "Signing in with correct credentials" do  visit '/sessions/new'  within("#session") do   fill_in 'Email', :with => 'user@example.com'   fill_in 'Password', :with => 'caplin'  end  click_button 'Sign in'  expect(page).to have_content 'Success' end given(:other_user) { User.make(:email => 'other@example.com', :password => 'rous') } scenario "Signing in as another user" do  visit '/sessions/new'  within("#session") do   fill_in 'Email', :with => other_user.email   fill_in 'Password', :with => other_user.password  end  click_button 'Sign in'  expect(page).to have_content 'Invalid email or password' endend

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产美女久久精品| 欧美性猛交xxxx| 欧美日韩成人在线视频| 亚洲精品视频免费在线观看| 精品毛片三在线观看| 精品美女国产在线| 久久久久久久激情视频| 亚洲第一区第二区| 国产欧美日韩精品丝袜高跟鞋| 国产热re99久久6国产精品| 欧美成人免费播放| 欧美高清在线视频观看不卡| 精品中文字幕乱| 成人淫片在线看| 亚洲在线免费视频| 精品久久久久久电影| 亚洲欧洲xxxx| 亚洲情综合五月天| 日韩毛片中文字幕| 日韩欧美a级成人黄色| 丰满岳妇乱一区二区三区| 亚洲欧美另类中文字幕| 亚洲久久久久久久久久| 亚洲国产小视频| 欧美日韩色婷婷| 国产精品视频网站| 成人深夜直播免费观看| 欧亚精品中文字幕| 欧美成人免费视频| 欧美猛男性生活免费| 久久久久九九九九| 欧美大片免费观看在线观看网站推荐| 欧美大奶子在线| 136fldh精品导航福利| 欧美精品日韩三级| 精品成人69xx.xyz| 亚洲一区www| 国产97在线亚洲| 亚洲第一精品夜夜躁人人躁| 日本欧美爱爱爱| 亚洲精品xxx| 久久视频中文字幕| 欧美中文在线字幕| 欧美壮男野外gaytube| 色婷婷亚洲mv天堂mv在影片| 亚洲欧洲美洲在线综合| 精品av在线播放| 亚洲欧美国产精品久久久久久久| 国产精品久久激情| 色婷婷综合久久久久| 亚洲天堂成人在线| 国产日韩在线亚洲字幕中文| 麻豆乱码国产一区二区三区| 日韩av色综合| 在线成人激情黄色| 97在线免费视频| 在线观看视频99| 国产精品久久久久久久久久久久久久| 影音先锋欧美精品| 欧美日韩亚洲一区二区| 狠狠久久五月精品中文字幕| 亚洲男人天堂2019| 亚洲激情自拍图| 日韩一区二区三区xxxx| 欧洲日本亚洲国产区| 精品美女久久久久久免费| 性欧美办公室18xxxxhd| 国产精品电影在线观看| 国产成人久久久精品一区| 国产一区二区激情| 国产精品成人va在线观看| 国产一区二区三区18| 亚洲人成在线观看网站高清| 欧美日韩国产999| 国产日韩欧美中文在线播放| 日本91av在线播放| 精品激情国产视频| 日本国产精品视频| 国产午夜一区二区| 国产精品自拍偷拍视频| 亚洲国产天堂久久国产91| 久久精品99国产精品酒店日本| 国产亚洲欧洲高清一区| 国产成人自拍视频在线观看| 亚洲第一视频在线观看| 亚洲www视频| 国产精品久久久久久久app| 国产精品视频xxxx| 亚洲图中文字幕| 久久综合亚洲社区| 一本大道久久加勒比香蕉| 久久人人爽人人爽人人片亚洲| 久久免费视频在线| 久久久www成人免费精品张筱雨| 色悠悠久久久久| 亚洲天堂日韩电影| 国产香蕉精品视频一区二区三区| 中文字幕av一区| 国模视频一区二区三区| 日韩欧美aaa| 国产精品亚洲一区二区三区| 97色在线观看| 日韩精品视频在线观看免费| 国产一区二区丝袜高跟鞋图片| 欧美成人网在线| 国产精国产精品| 日韩中文字幕在线视频| 日韩中文娱乐网| 亚洲乱码国产乱码精品精天堂| 国内精品视频一区| 欧美性xxxx极品高清hd直播| 国产欧美日韩精品在线观看| 欧美疯狂性受xxxxx另类| 亚洲精品日韩丝袜精品| 亚洲va久久久噜噜噜久久天堂| 在线播放日韩av| 欧美在线视频观看免费网站| 成人午夜在线影院| 日韩欧美国产高清91| 欧美亚洲视频在线观看| 韩国19禁主播vip福利视频| 久久偷看各类女兵18女厕嘘嘘| 成人免费网站在线看| 97国产精品视频人人做人人爱| 国产一区二区三区在线免费观看| 欧美精品一区三区| 国产女精品视频网站免费| 91精品免费看| 亚洲2020天天堂在线观看| 日韩av快播网址| 国产精品久久久精品| 91国产视频在线播放| 欧美精品情趣视频| 综合国产在线观看| 久久精品成人欧美大片古装| 欧美性在线观看| 亚洲欧美国产制服动漫| 国产suv精品一区二区| 国产欧美欧洲在线观看| 国产亚洲视频中文字幕视频| 成人欧美一区二区三区黑人| 国产精品678| 欧美黑人一级爽快片淫片高清| 国产精品69av| 欧美乱大交xxxxx| 日韩电视剧在线观看免费网站| 久久久亚洲影院| 91精品国产综合久久久久久久久| 亚洲色图校园春色| 国产香蕉97碰碰久久人人| 国产97在线|日韩| 久久久999精品视频| 国内精久久久久久久久久人| 久久久天堂国产精品女人| 国产一区二区三区丝袜| 精品国产鲁一鲁一区二区张丽| 国外色69视频在线观看| 日韩av电影在线播放| 亚洲丝袜av一区| 视频在线观看一区二区| 欧美在线视频a| 国产精品久久不能| 国产精品嫩草影院久久久| 日韩精品在线免费观看|