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

首頁 > 學院 > 開發設計 > 正文

單元測試和測試驅動開發的一些常見問題總結

2019-11-17 03:10:55
字體:
來源:轉載
供稿:網友

單元測試和測試驅動開發的一些常見問題總結

此文收集一些平時使用單元測試碰到的問題和解決辦法,供大家參考。

如何檢查返回的集合類是否符合期望?

Microsoft UnitTestFramework 如果需要元素的順序一致,可以使用CollectionAssert.AreEqual;如果不需要考慮順序,可以使用CollectionAssert.AreEquivalent。(有的地方說MSTest的Assert.AreEqual支持集合類型比較,我測試過,忽悠人的
nUnit 同上
xUnit xUnit的Assert.Equal(c1, c2)可以支持集合類型比較,c1和c2的元素順序必須一致

Microsoft UnitTestFramework / nUnit / xUnit 比較,使用哪個框架更合適?

Microsoft UnitTestFramework和nUnit的用法非常類似,而xUnit由于吸取了nUnit的設計上的經驗,用法更加簡潔。下面是周公寫的兩篇文章,nUnit和xUnit介紹的非常詳細,大家可以閱讀一下:

  • 在.NET開發中的單元測試工具之(1)——NUnit
  • 在.NET開發中的單元測試工具之(2)——xUnit.Net

什么是Mock?

單元測試的目標是一次只驗證一個方法,小步的前進,細粒度的測試,但是假如某個方法依賴于其他一些難以操控的東東,比如說網絡連接、數據庫連接、系統時間、或者是Servlet容器,那么我們該怎么辦呢?要是你的測試依賴于系統的其他部分,甚至是系統的多個其他部分呢?在這種情況下,倘若不小心,你最終可能會發現自己幾乎初始化了系統的每個組件,而這只是為了給一個測試創造足夠的運行環境讓它們可以運行起來。忙乎了大半天,看上去我們好像有點違背了測試的初衷了。這樣不僅僅消耗時間,還給測試過程引入了大量的耦合因素,比如說,可能有人興致沖沖地改變了一個接口或者數據庫的一張表,突然,你那卑微的單元測試的神秘的掛掉了。在這種情況發生幾次之后,即使是最有耐心的開發者也會泄氣,甚至最終放棄所有的測試,那樣的話后果就不能想像了。

再讓我們看一個更加具體的情況:在實際的面向對象軟件設計中,我們經常會碰到這樣的情況,我們在對現實對象進行構建之后,對象之間是通過一系列的接口來實現。這在面向對象設計里是最自然不過的事情了,但是隨著軟件測試需求的發展,這會產生一些小問題。舉個例子,用戶A現在拿到一個用戶B提供的接口,他根據這個接口實現了自己的需求,但是用戶A編譯自己的代碼后,想簡單模擬測試一下,怎么辦呢?這點也是很現實的一個問題。我們是否可以針對這個接口來簡單實現一個代理類,來測試模擬,期望代碼生成自己的結果呢?幸運的是,有一種測試模式可以幫助我們:mock對象。Mock對象也就是真實對象在調試期的替代品。

什么時候需要使用Mock?

關于什么時候需要Mock對象,Tim Mackinnon給我們了一些建議:

  • 真實對象具有不可確定的行為(產生不可預測的結果,如股票的行情)
  • 真實對象很難被創建(比如具體的web容器)
  • 真實對象的某些行為很難觸發(比如網絡錯誤)
  • 真實情況令程序的運行速度很慢
  • 真實對象有用戶界面
  • 測試需要詢問真實對象它是如何被調用的(比如測試可能需要驗證某個回調函數是否被調用了)
  • 真實對象實際上并不存在(當需要和其他開發小組,或者新的硬件系統打交道的時候,這是一個普遍的問題)

如何使用Mock?

.NET Mock Framework有哪些,可以看看下面幾個網頁:

  • .NET Mocking Framework對比
  • What C# mocking framework to use?
  • The Fakes Framework in Visual Studio 2012

關于Mock框架的實現方式,大概有兩種:基于動態代理實現;基于編譯時靜態織入實現。各個框架的用法看一下介紹很快就可以掌握了,關鍵是如何使用各種mock技術,存在的爭論主要有下面幾個:

  • 爭論一:像Typemock、Moles、Visual Studio 2012 Fakes Framework這類靜態織入技術的框架,可以支持對Sealed Class、Non-Abstract Method、Non-Virtual Method、Static Method的Mock。有些人覺得這很強大,有些人覺得這反倒不好,他們認為像Moq、Rhino Mocks這類的框架,正因為不支持前面說的四類情況的mock,強迫項目必須實現依賴倒置,從而降低了項目的耦合性,以達到較高的可測試性以及可維護性。
  • 爭論二:在使用動態代理方式的Mock框架時候,為了“可測試性”,PRotected方法必須是virtual的,因為我們需要在子類中進行override。同理,Mock框架能夠輔助的方法也必須是virtual的,即使是一個public方法。那么,您覺得這是為了可測試性而做出的讓步嗎?或者換句話說,您覺得,一個不可以override的protected方法,但是會影響到其他公開接口的功能,這是不是一個合理的設計呢?如果這是一個合理的設計,又不想作出這樣的讓步……我們又該怎么做呢?(這段話摘自老趙的“與protected成員有關的單元測試方式”)
  • 爭論三:在使用動態代理方式的Mock框架時候,為了測試一些Non-Abstract Method、Non-Virtual Method、Static Method,提供一個被測方法/類的Wrapper,封裝對無法直接訪問方法的調用,是否合適?做法參考:http://blog.zhaojie.me/2009/08/unit-test-protected-method.html#comment_iX2whQ8q04I003i2http://blog.zhaojie.me/2009/08/unit-test-protected-method.html#comment_iX2whQ8q04I003hi

關于爭論一,我的考慮的結果如下:

實際情況中,我會根據項目實際情況來選型。考慮的因素主要有:

  • 是否需要支持私有方法、Non-virtual方法的單元測試:實際情況中,項目的代碼結構不一定是想象中的理想情況,這個時候就需要考慮Typemock、Visual Studio 2012 Fakes這類框架。
  • 開發效率:能夠花最小的成本完成單元測試工作,獲得最大的收益。使用復雜,開發效率低的框架的優先級自然要排在后面。
  • 集成難易程度:一般單元測試用例會在提交代碼的時候跑一遍,作為保證提交代碼質量的一道關卡。單元測試框架是否能和現有持續集成工具很好的集成在一塊,也是要考慮的因素。
  • 運行效率:跑的越快的框架,能夠減少每次驗證的時間成本。

什么是“測試驅動數據庫開發”?

測試驅動數據庫開發,也稱為TDDD(Test-Driven Database Development),是把TDD的理念運用到數據庫開發的過程中,通過數據庫測試來定義數據庫的行為,如同通過測試定義應用程序代碼邏輯一樣,來保證數據庫重構過程中的質量。

使用 TDDD 的優點包括:

  • 首先,所有TDD的優點都適用與TDDD ,你可以小步而安全的前進;
  • 通過重構使系統在整個生命周期中保持高質量的設計;
  • 回歸測試讓你能盡早發現缺陷;
  • TDDD促使你能時刻獲得一個最新的可執行的系統(而不像傳統的設計文檔)。

推薦感興趣的朋友看看伍斌老師翻譯《測試驅動數據庫開發——Test-Driven Database Development: Unlocking Agility》這本書:

目錄結構:http://my.safaribooksonline.com/book/databases/database-design/9780132776486

伍斌老師的譯者序:讓數據庫應用開發不再裸奔——Test-Driven Database Development譯者序

樣章試讀:http://ptgmedia.pearsoncmg.com/images/9780321784124/samplepages/032178412X.pdf

原作者Max Guernsey的PPT:http://www.maxthe3rd.com/test-driven-database-development/TDD-Database.pdf

如何做測試驅動數據庫開發?

由于這塊研究不深,暫時列舉一些數據庫單元測試框架,未來如果研究更加深入了,再專門寫文章介紹。

數據庫單元測試的框架:

  • DbFit
  • tSQLt(Test Driven Database Development with tSQLt)
  • DbUnit

參考:

  • 簡?述?M?o?c?k
  • 使用Mono.Cecil解決無法Mock非虛方法和密閉類的問題
  • protected成員有關的單元測試方式
  • 如何 Mock 非虛方法和密封類?
  • 了解何時使用 Override 和 New 關鍵字(C# 編程指南)
  • C# 類教程-多態性
  • Visual studio 2012 Fakes
  • Apply Test-Driven Development to your Database Projects(中文版)
  • 關系數據庫測試驅動開發

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久中文字幕在线视频| 国产精品情侣自拍| 中文字幕日韩av| 亚洲欧美日韩精品| 中文字幕国内精品| 国产丝袜精品视频| 亚洲天堂av在线播放| 精品一区电影国产| 91九色国产视频| 亚洲最新中文字幕| 久久精品免费电影| 国产精品网站视频| 成人久久一区二区| 国产97人人超碰caoprom| 亚洲一区免费网站| 亚洲精品永久免费精品| 国产精品爽爽爽| 性欧美亚洲xxxx乳在线观看| 成人动漫网站在线观看| 日韩在线观看免费网站| 国产拍精品一二三| 亚洲一区二区三区乱码aⅴ| 亚洲伊人一本大道中文字幕| 久久青草精品视频免费观看| 久久久久久久999| 国产精品午夜国产小视频| 久久精品人人做人人爽| 久久综合免费视频影院| 日韩欧美亚洲国产一区| 国产精品三级网站| 亚洲国产精彩中文乱码av在线播放| 日韩激情视频在线| 日韩美女免费视频| 久久国产精品偷| 亚洲综合日韩在线| 亚洲视频专区在线| 久久最新资源网| 亚洲国产精品99| 日本一区二区三区在线播放| 国产精品十八以下禁看| 国产欧美韩国高清| 九九热精品在线| 国产精品丝袜高跟| 日韩在线视频观看正片免费网站| 一区二区在线视频播放| 亚洲欧美国产高清va在线播| 欧美日韩一区二区在线| 欧美另类第一页| 日韩av一区二区在线观看| 欧美性高跟鞋xxxxhd| 国产自摸综合网| 九九精品视频在线| 久久天天躁夜夜躁狠狠躁2022| 97欧美精品一区二区三区| 国内精品国产三级国产在线专| 国产中文字幕91| 日本免费在线精品| 欧美大片免费观看在线观看网站推荐| 欧美日韩国产丝袜另类| 午夜欧美大片免费观看| 欧美性猛交xxxx富婆弯腰| 欧美性猛交xxx| 正在播放欧美一区| 国产www精品| 精品国内产的精品视频在线观看| 26uuu另类亚洲欧美日本老年| 国产欧美日韩精品在线观看| 亚洲一区二区久久久久久| 久久亚洲精品中文字幕冲田杏梨| 国产精品美女视频网站| 成人做爰www免费看视频网站| 亚洲精品97久久| 久久久久久伊人| 精品久久久久久久久久久久久| 国产精品美女999| 国产精品无码专区在线观看| 91久久嫩草影院一区二区| 欧美精品中文字幕一区| 永久免费看mv网站入口亚洲| 日本国产精品视频| 91av在线播放视频| 欧美综合激情网| 97色在线播放视频| 欧美一级视频一区二区| 亚洲第一福利视频| 777午夜精品福利在线观看| 亚洲国产精品久久久久久| 国产精品一区二区久久国产| 91精品国产沙发| 97视频人免费观看| 国产精品视频99| 国产精品自拍视频| 亚洲精品综合久久中文字幕| 国产精品九九九| 日韩av在线导航| 亚洲无线码在线一区观看| 欧美精品福利视频| 亚洲欧美国产精品久久久久久久| 欧美麻豆久久久久久中文| 欧美日韩精品在线播放| 国内精品久久久久影院 日本资源| 国产欧美精品在线播放| 久久久午夜视频| 欧美成人精品影院| 亚洲免费电影一区| 亚洲欧美在线播放| 午夜精品美女自拍福到在线| 1769国产精品| 国模视频一区二区三区| 国产精品扒开腿做| 91久久在线观看| 亚洲图片在线综合| 欧美精品一区二区免费| 亚洲性69xxxbbb| 色婷婷av一区二区三区久久| 久久精品电影网| 亚洲日本欧美中文幕| 国产91在线高潮白浆在线观看| 色妞一区二区三区| 亚洲2020天天堂在线观看| 欧美大片在线看| 亚洲影视九九影院在线观看| 91国偷自产一区二区三区的观看方式| 中文字幕亚洲一区在线观看| 久久精品亚洲94久久精品| 久久九九免费视频| 高跟丝袜一区二区三区| 成人a免费视频| 黄网站色欧美视频| 国产亚洲一区二区精品| 国产美女精品视频免费观看| 欧美日韩国产成人| 26uuu亚洲国产精品| 热久久这里只有| 91精品中国老女人| 亚洲小视频在线| 92看片淫黄大片看国产片| 久久精品视频亚洲| 亚洲欧美激情四射在线日| 美女撒尿一区二区三区| 视频在线观看一区二区| 亚洲国产免费av| 亚洲精品黄网在线观看| 国产精品激情av在线播放| 一本大道香蕉久在线播放29| 日韩美女在线观看| 欧美多人爱爱视频网站| 亚洲午夜小视频| 亚洲跨种族黑人xxx| 国产91在线播放九色快色| 中文字幕自拍vr一区二区三区| 亚洲第一福利视频| 久久免费精品日本久久中文字幕| 日韩精品高清在线观看| 欧美日韩在线第一页| 欧美三级免费观看| 国产精品视频免费观看www| 欧美最近摘花xxxx摘花| 日韩精品高清在线观看| 国产精品日日做人人爱| 欧美日韩精品在线播放| 亚洲欧美在线磁力| 日本精品免费观看| 午夜精品久久久久久久99热|