依賴於資料的工程如何進行單元測試?

來源:互聯網
上載者:User
做一個項目勢必要進行單元測試以保證程式的健壯性,以便保證版本迭代時功能正常。但是如果一個程式(如CMS等)本身就是依賴於資料庫的,應該如何在保證不會破壞資料庫的情況下進行單元測試呢?

舉例:
訪問?id=1的頁面,先查詢

sqlSELECT * FROM `data` WHERE `ID` = 1

,然後將其賦值給$data->ID$data->Title這些屬性;要保證這些屬性的值正常
然後,根據一些資訊算出$data->Hash,如$data->Hash = md5($data->ID)這些計算的值也要正常
接著,刪除id=1的文章,要

sqlDELETE FROM `data` WHERE `ID` = 1

必須保證ID所在行被刪除
再其次,後台發布一篇文章,必須使得資料庫內多出ID=2,內容為設定值的文章。但是HTML代碼內容不一定要相同,可以允許諸如多餘的空格、換行。
還需要類比XML-RPC協議發表一篇文章。

像以上的內容,應該如何進行單元測試呢?

知乎同名問題:http://www.zhihu.com/question/28278690

回複內容:

做一個項目勢必要進行單元測試以保證程式的健壯性,以便保證版本迭代時功能正常。但是如果一個程式(如CMS等)本身就是依賴於資料庫的,應該如何在保證不會破壞資料庫的情況下進行單元測試呢?

舉例:
訪問?id=1的頁面,先查詢

sqlSELECT * FROM `data` WHERE `ID` = 1

,然後將其賦值給$data->ID$data->Title這些屬性;要保證這些屬性的值正常
然後,根據一些資訊算出$data->Hash,如$data->Hash = md5($data->ID)這些計算的值也要正常
接著,刪除id=1的文章,要

sqlDELETE FROM `data` WHERE `ID` = 1

必須保證ID所在行被刪除
再其次,後台發布一篇文章,必須使得資料庫內多出ID=2,內容為設定值的文章。但是HTML代碼內容不一定要相同,可以允許諸如多餘的空格、換行。
還需要類比XML-RPC協議發表一篇文章。

像以上的內容,應該如何進行單元測試呢?

知乎同名問題:http://www.zhihu.com/question/28278690

首先,請先想清楚你要作的是單元測試還是功能測試。
如果你的目的是驗證這兩個頁面是否正常工作,你想做的是功能測試。這種情況下,可以先配置好測試資料,用selenium之類工具進行測試。
如果要作單元測試,那麼你要測的是哪個單元
也許從代碼來看一個顯示ID和title的頁面已經非常簡單了,但它並非一個單元。
事實上它處理了http請求,綁定了URL參數,用參數查詢了資料庫,從資料庫返回結果中讀取了需要的資料,做了商務邏輯需要的處理,根據處理結果綁定了一些資料到頁面模版中,把模版渲染成為html頁面,發送頁面給用戶端,如果頁面上有js之類的指令碼的話,還需要在用戶端瀏覽器中執行這些指令碼。之後使用者才真正看到了頁面。
上面任何一步出錯,都會導致這個頁面工作不正常。
很少有程式單元能不依賴於環境獨立完成功能,它能做的是根據環境提供的輸入,給出正確的輸出。相應的,單元測試無法保證整個功能正常工作,只能驗證這個單元接受特定的輸入後,給出的是預期的輸出。
所幸的是,大部分的依賴都是成熟的第三方代碼。一般來說,只要給出了正確的輸入資料,它們就會產生正確的輸出(行為)。因而可以假設我們測試的關注點,在於確保我們自己寫的代碼,在從依賴環境中獲得了正確輸入後,向其它依賴正確的輸出。
比如說,當你測試時,一般不會懷疑輸入了?id=1後你的代碼卻從參數中讀出id=0,因為那是你的代碼信賴的第三方,你只要確認給它的輸入是正確的。同樣的,如果你確認了delete的SQL語句是正確的,一般來說也沒有必要去懷疑資料庫是否正確的執行這條語句。
從你的問題來看,你大部分的問題關注的是功能測試而非單元,所以可能單元測試並不是你真正需要的。如果要作的話,可能主要要測md5相關的那一部分。
另一個關於單元測試但是超出測試的問題,從你的描述來看似乎你的程式裡並沒有單元,這可能也會對單元測試造成一些困難。

用單獨的資料庫運行測試,每次測試開始前都清空資料庫,並重建測試資料。

另一種做法是每次產生測試資料的時候記錄下來產生的資料的 ID, 然後在完成測試後刪除本次產生的資料,而不是每次都清空資料庫。這種方案比較適合既需要自動化的測試,又需要手動測試的情況,自動化的測試不會導致手動測試時添加的資料被刪除。

測試最好別依賴於具體的值(比如你的例子的 ID=1),最好用單獨的函數來建立每一條測試資料(比如 generateAccountgenerateArticle),這些函數返回建立出來的資料的 ID, 否則如果寫入程式碼 ID 的話,在添加或移除測試的時候會很麻煩。

使用三種資料庫配置:
dev: 開發時使用的資料庫配置
test: 測試用的資料庫配置, 每次自動清空和load fixtures
production: 部署時生產環節的資料庫配置

你用isolating test、mock、fakes關鍵字搜尋一下,就知道怎麼做對外部資料/邏輯有依賴的單元測試了。

外掛程式得在你的git初始化了這個目錄才行。他這樣的原因就是沒有找到當前路徑裡的git檔案夾,這個檔案夾裡有遠端地址。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.