2012-12-25 50 views
2

我對django和單元測試都很陌生,我試圖爲我的模型構建單元測試,但一直有一些困難。Django中的單元測試緊耦合模型

我有好幾個型號密切合作:

Resource,這將維持一個文件資源

MetadataField代表可以添加到資源元數據字段,對應於全域的表

MetadataValue匹配具有資源ID和對應值的MetadataField ID,這是資源 - MetadataField多對多關係的中間表

MetadataSchema表示由許多MetadataFields組成的模式。每個Resource被分配一個MetadataSchema它控制MetadataFields它是由

關係表示:

Resource - MetadataField  : Many-to-Many through MetadataValue 
MetadataValue - MetadataSchema : Many-to-Many 
Resource - MetadataSchema  : One-to-Many 

我不知道如何編寫測試來處理這些模型。 Test Driven Django教程中的模型測試似乎主要包括初始化對象和驗證屬性。如果我設置了這些對象,但需要使用所有其他對象,那麼測試將依賴於他們不打算測試的代碼。 例如如果我想創建一個資源,我也應該爲它分配一個元數據模式和該模式中字段的值。我已經在django中查找了單元測試模型的好例子,但一直沒有找到任何東西(django網站似乎沒有單元測試,並且these projects都有差或缺少測試或者一對夫婦的情況下,具有良好的測試,但使用的幾乎沒有車型

下面是我看到了可能的方法:

  • 做了很多的嘲諷,以確保我永遠只測試一個類,並保持對模型進行單元測試非常簡單,只測試他們的方法/屬性,但不測試關係是否正常工作,然後依靠o n更高級別的集成測試,以解決關係中的任何問題等。
  • 設計單位測試表明DO依賴於其他功能,並且接受一個功能中的中斷將打破多個測試,前提是可以很容易地看到發生故障。所以我可能會有一種方法測試我是否可以成功地將MetadataValue添加到資源,這將需要設置至少一個MetadataSchemaResource。然後,我可以使用try - except塊來確保如果測試在斷言處理我實際上要測試的內容之前失敗,它會給出一個特定的錯誤消息,提示錯誤在別處。這樣我可以快速掃描多個失敗的測試消息,找到真正的罪魁禍首。在每次測試中都不可能做到這種可靠分離

我不知道這一切是否合理,但如果有的話對於這種情況的最佳實踐,請將我指向他們!謝謝

+1

通常,如果單元測試太難寫了,可能會指出設計過於複雜。例如,我不確定我看到MetaDataField的價值?不能每個MetaDataValue表都有一個用於資源和值的列。然後,您將爲每種類型的元數據創建一個表格。這更清楚一點,不太古怪。取決於您預測當然會有多少種不同類型的元數據。 – aychedee

回答

0

使用fixtures,他們讓你加載模型數據而不寫代碼。

+0

但是在某些情況下,從一個模型保存數據需要將數據保存到另一個模型(即更新資源,元數據存儲在單獨的表中)。所以裝置不能解決這個問題(除非我以完全錯誤的方式考慮事情 - 這是一個很大的可能性!) –

1

對我來說,單元測試的目的是將代碼單元分開來測試它們,而不用擔心它們的所有依賴關係。如果我正確理解你的想法,你想創建一個更集成測試(兩個或多個模型之間的關係),這也是一個非常有益的,但仍然是一個不同的測試層:)

要測試單獨的模塊,尤其是當他們使用大量代碼時,我更喜歡模擬依賴關係。谷歌返回this作爲你的第一選擇Python嘲笑(我猜這裏有很多)。

的另一件事是,如果有太多的依賴你要嘲笑這可能意味着你必須重新考慮,因爲緊耦合:)

好運的你的架構!

+0

此外,我看到你想爲已經寫好的代碼編寫測試。這並不壞(通常更多的測試是好的)。然而,首先編寫測試(所謂的TestDrivenDevelopment)是很好的,以儘早發現問題。通常很難寫出測試過於複雜的代碼;) – op1ekun

1

您可以使用django燈具來加載數據進行測試,如果您的模型改變很多,這可能非常耗時且難以維護。

我建議您使用像Factory Boy這樣的庫,它允許您在需要時爲需要的測試創建對象。您可以根據需要設置多個工廠,您可以看到一些示例herehere您還可以看到一些使用mocker library進行模擬的示例以及有關測試django應用程序的許多提示。