2009-12-15 128 views
5

我知道如何在Rails中運行功能/集成測試,這個問題是關於最佳實踐的。比方說,授權使用四個不同的用戶角色來執行:Rails授權功能測試

  • 基本
  • 編輯
  • 管理
  • 超級

這意味着,對於每個動作有五種不同的行爲可能(4個角色+未經認證/匿名)。一種方法我已經採取是測試上的每一個動作每一個角色,例如:

  • test_edit_by_anonymous_user
  • test_edit_by_basic_user
  • test_edit_by_editor_user
  • test_edit_by_admin_user
  • test_edit_by_super_user

但這顯然導致lot測試(網站上的每個控制器動作確實需要測試五次)。相反的做法是單獨測試授權機制,然後在測試每個操作(設置)之前驗證爲超級,並且僅測試每個頁面的一個版本。

我已經嘗試了不同程度的特異性的幾種方法,但還沒有完全滿足任何事情。當我測試更多案例時,我感覺更舒適,但測試代碼的數量和抽象難度一直是關閉的。有沒有人有辦法解決他們滿意的問題?

回答

4

這實際上取決於您如何設置代碼以檢查授權以及如何在操作中對其進行測試。我可以告訴你我們做什麼作爲一個例子。我們擁有和你一樣的角色,一些需要登錄的頁面,一些需要角色,一些根據角色有不同的輸出。我們測試每種類型有點不同。

首先,我們測試授權和登錄分開。

另外,我們爲需要用戶登錄的操作創建過濾器,然後爲需要特定角色的操作創建過濾器。例如check_admin,check_account_owner等。然後,我們可以測試這些過濾器是否可以自行工作。

然後,我們在控制器測試中添加了正在調用正確過濾器的檢查。我們使用早該並寫了一些簡單的擴展,所以我們可以添加檢查,如:

should_filter_before_with :check_admin, :new 

這樣,我們正在測試需要測試什麼,並沒有更多的。

現在,對於根據角色執行不同邏輯的更復雜的操作,我們會爲包含特殊邏輯的每個角色測試這些操作。我們不會爲將要過濾的行爲或其他角色的超集編寫角色的測試。例如,如果您是管理員,則該操作會向表單添加更多字段,我們會測試非管理員和管理員。我們不測試管理員和超級管理員,因爲我們的角色檢查代碼理解超級管理員是管理員。

此外,對於包含邏輯,只顯示某些角色的某些項目模板,我們試圖和代碼轉移到助手,或者共同如管理工具,爲諧音。然後我們可以自己測試這些,而不是包含它們的每個動作。

總結一下,只測試一下給定動作需要的東西。就像你不會在你的單元測試中測試Rails內部部分一樣,如果你爲你的角色檢查編寫通用代碼並測試它,你不需要在每個動作上再次測試它。

2

在某些情況下,你可能需要測試所有可能的角色和權限級別針對不同的行動 - 像,工作時的銀行,例如:)在這種情況下是有意義的採取一個更加動態的測試方法。您不需要定義每個測試用例,而是可以生成所有組合。

幾年前,瑞恩·戴維斯做了一個關於「功能測試矩陣」,這是ZenTest的一部分呈現。 Dr. Nic did a writeup,,並且在帖子結尾處您可以在評論中找到更新鏈接。此解決方案專爲您所描述的問題而設計。例如,您也可以通過在嵌套循環中運行測試來推出自己的解決方案 - 這個想法基本相同。

+0

謝謝!視頻和Ryan的文章*真的很有用。我很高興知道有人在討論這個問題。 – 2009-12-23 01:44:16

+0

如果任何人有困難訪問視頻: [視頻是YouTube上的點擊這裏](http://www.youtube.com/watch?v=KUjnAztX9yk) – 2012-06-26 23:24:21

0

考慮其具有2個角色admin和只讀 執行以下測試的應用程序:

  1. 登錄與只讀模式執行某些操作和註銷。現在從相同的系統和具有管理員角色的相同瀏覽器登錄,並查看系統的行爲。反之亦然。
  2. 以admin角色登錄並複製cookie值並註銷。現在以普通角色登錄並使用cookimanager +或editthiscookie工具編輯cookie值。如果應用程序按預期工作,那麼這是一個問題。 重複上述測試箱2從相同的機器相同的瀏覽器,相同的機器不同的瀏覽器,從不同的機器
  3. 如果是胖客戶機應用程序,然後執行逆向工程和分析的代碼。嘗試改變授權管理的邏輯(需要有編碼經驗的人)重新編譯代碼並重複測試2-3。
  4. 使用像burp套件這樣的代理中斷工具分析兩個角色的獲取/發佈請求。

現在基於類型可爲您的應用決定測試用例的作用。