我知道如何在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
但这显然会导致很多测试(网站上的每个控制器操作都需要测试五次)。相反的方法是单独测试授权机制,然后在测试每个操作(在安装时)之前进行身份验证,并且只测试每个页面的一个版本。
我尝试了几种具有不同程度特异性的方法,但对任何事情都没有完全满意。当我测试更多案例时,我感觉更舒服,但是测试代码的数量和抽象的难度一直是关闭的。有没有人能够解决这个问题,他们对此感到满意?
答案 0 :(得分:4)
这实际上取决于您如何设置代码以检查授权以及如何在操作中对其进行测试。我可以告诉你我们做了什么作为一个例子。我们有像你这样的角色,一些需要登录的页面,一些需要角色的页面,以及一些根据角色具有不同输出的页面。我们对每种类型的测试方式略有不同。
首先,我们分别测试授权和登录。
此外,我们为需要用户登录的操作创建了过滤器,然后为需要某个角色的其他人创建了过滤器。例如check_admin
,check_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和只读的应用程序 执行以下测试:
现在根据您的应用程序可用的角色类型决定测试用例。