Rails中授权的功能测试

时间:2009-12-15 00:01:54

标签: ruby-on-rails ruby testing authorization functional-testing

我知道如何在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

但这显然会导致很多测试(网站上的每个控制器操作都需要测试五次)。相反的方法是单独测试授权机制,然后在测试每个操作(在安装时)之前进行身份验证,并且只测试每个页面的一个版本。

我尝试了几种具有不同程度特异性的方法,但对任何事情都没有完全满意。当我测试更多案例时,我感觉更舒服,但是测试代码的数量和抽象的难度一直是关闭的。有没有人能够解决这个问题,他们对此感到满意?

3 个答案:

答案 0 :(得分:4)

这实际上取决于您如何设置代码以检查授权以及如何在操作中对其进行测试。我可以告诉你我们做了什么作为一个例子。我们有像你这样的角色,一些需要登录的页面,一些需要角色的页面,以及一些根据角色具有不同输出的页面。我们对每种类型的测试方式略有不同。

首先,我们分别测试授权和登录。

此外,我们为需要用户登录的操作创建了过滤器,然后为需要某个角色的其他人创建了过滤器。例如check_admincheck_account_owner等。然后我们可以测试这些过滤器是否可以自行运行。

然后我们在控制器测试中添加检查,以便调用正确的过滤器。我们使用了shoulda并编写了一些简单的扩展,因此我们可以添加以下检查:

should_filter_before_with :check_admin, :new

这样我们就可以测试需要测试的内容而不再需要测试。

现在,对于根据角色执行不同逻辑的更复杂操作,我们会为包含特殊逻辑的每个角色测试这些操作。我们不会为将要过滤的操作上的角色编写测试,或者是其他角色的超集。例如,如果您是管理员,如果操作向表单添加更多字段,我们会测试非管理员和管理员。我们不测试admin和super admin,因为我们的角色检查代码了解超级管理员是管理员。

此外,对于包含仅显示某些角色的某些项目的逻辑的模板,我们尝试将该代码移动到帮助程序中,或者如果像管理工具栏一样常见,则移动到部分中。然后我们可以自己测试那些,而不是每个包含它们的动作。

总而言之,只测试您对给定操作所需的内容。就像你不在单元测试中测试Rails内部一样,如果你为角色检查编写公共代码并测试它,你就不需要在每次操作时再次测试它。

答案 1 :(得分:2)

在某些情况下,您可能需要针对不同的操作测试所有可能的角色和授权级别 - 例如,在为银行工作时,例如:)在这种情况下,采用更动态的测试方法是有意义的。您可以生成所有组合,而不是定义每个测试用例。

几年前,Ryan Davis做了一个关于“功能测试矩阵”的演讲,这是ZenTest的一部分。 Dr. Nic did a writeup,在帖子的最后,您会在评论中找到更新的链接。此解决方案专为您描述的问题而设计。您也可以通过在嵌套循环中运行测试来推出自己的解决方案 - 例如,这个想法基本相同。

答案 2 :(得分:0)

考虑一个具有2个角色admin和只读的应用程序 执行以下测试:

  1. 以只读模式登录执行某些操作并注销。现在从同一系统和相同的浏览器登录管理员角色,并查看系统的行为。反之亦然。
  2. 使用admin角色登录并复制cookie值并注销。现在使用普通角色登录并使用cookimanager +或editthiscookie工具编辑cookie值。如果应用程序按预期工作,那么这是一个问题。 从同一台机器同一浏览器,同一台机器不同的浏览器,从不同的机器重复上面的测试案例2
  3. 如果是胖客户端应用程序,则执行逆向工程并分析代码。尝试改变授权管理的逻辑(有人需要有编码经验)重新编译代码并重复测试2-3。
  4. 使用像burp suite这样的代理中断工具来分析两个角色的获取/发布请求。
  5. 现在根据您的应用程序可用的角色类型决定测试用例。