单点登录页面的集成测试

时间:2011-07-12 16:25:07

标签: cucumber integration-testing single-sign-on capybara opensso

如何在integration tests期间使用单点登录(SSO)登录测试页面(例如使用caybara或cucumber)?对于正常登录,您将编写一个方法来访问登录页面,填写表单并提交。如果登录表单来自Shibboleth或OpenAM / OpenSSO等外部SSO服务器,则这有点困难。如何为受SSO保护的页面编写集成测试?

类似的问题是使用单独的搜索服务器(Solr或Sphinx)进行集成测试。您可能会通过使用某种形式的模拟或存根来解决它。有人能给出一个很好的例子,如何模拟或存根黄瓜或水豚的SSO?如果这太难了,那么搜索服务器的类似示例也会有所帮助。

1 个答案:

答案 0 :(得分:7)

SSO应用程序的集成测试是一个 特殊情况下更普遍的问题:测试 分布式应用。这很难 问题似乎并没有什么魔力 它的子弹。有多种方法可以结合起来 一组不同的服务器或服务并测试它们 作为一个整体。两个极端是

a)测试整个系统的实例。你没有 然后需要任何模拟或存根,但你需要 整个堆栈的完整,完整的设置。这包括 涉及的每个服务器的运行实例。 对于每个测试,设置整个应用程序堆栈, 并测试整个堆栈,即测试 整个分布式系统作为一个整体 涉及的组件,这很难 一般来说。整个事情只有在每一个都有效 组件和所有连接都运行良好。

b)为每个组件编写集成测试, 把它当作一个黑盒子,然后盖上 模拟和存根缺少连接。 在实践中,这种方法更为常见 单元测试,一个为每个测试编写测试 MVC层:模型,视图和控制器 (视图和控制器经常在一起)。

在这两种情况下,你都没有考虑过 断了的连接。原则上一个 必须检查每个外部服务器/服务 以下可能性

  • 已关闭
  • 起来并且表现良好
  • 已启动且回复错误
  • 已启动,但您发错了数据

基本上,测试分布式应用程序很困难。 这是distributed applications are hard to develop的原因之一。 分布式应用程序拥有的部件和服务器越多,设置许多成熟环境(如生产,升级,测试和开发)就越困难。 系统越大,越难 集成测试成为。在实践中, 一个使用第一种方法并创建一个小 但整个应用程序的完整版本。 典型的简单设置是App Server + DB Server + Search Server。 在你的开发机器上,你会有 完整系统的两个不同版本:

  • 具有多个数据库的一个数据库服务器(开发和测试)
  • 具有多个索引的一个Search Server(开发和测试)

搜索服务器的常见Ruby插件(Thinking Sphinx for Sphinx 或Solr的太阳黑子)支持黄瓜和整合 试验。他们为搜索服务器“打开”某些部分 你的考试。对于不使用搜索服务器的代码, 他们“存根”服务器或模拟连接以避免不必要的 索引。

对于RSpec测试,它是可能的 删除身份验证方法, 例如,通过

进行控制器测试
  before :each do
    @current_user = Factory(:user)
    controller.stub!(:current_user).and_return(@current_user)
    controller.stub!(:logged_in?).and_return(:true)
  end

它也适用于辅助和视图测试,但是 不适用于RSpec请求或集成测试。

对于黄瓜测试,可以存根 通过替换连接来搜索服务器 带有存根的搜索服务器(用于太阳黑子和 Solr可以通过replacing the Sunspot.session完成, 它封装了与Solr的连接。)

这一切听起来不错,不幸的是它有点难 为SSO服务器传输此解决方案。一个典型的最小 安装程序将是App Server + DB Server + SSO Server。 完整的集成测试意味着我们必须设置一个SSO服务器 多个用户数据存储(开发和测试)。 设置SSO服务器已经足够困难, 使用多个用户数据设置SSO服务器 商店可能不是一个好主意。

问题的一个可能的解决方案可能是在某个地方 方向Fakeweb。 FakeWeb是一个由Ruby编写的库 布莱恩库克伪造网络请求。它可以让你解耦 来自实时服务的测试环境。伪造回应 不幸的是,SSO服务器有点难。

我最终使用的另一种可能的解决方案是使用fake login,即 添加可在集成中调用的伪登录方法 测试。这个假登录是一种动态方法,仅在此期间添加 测试(通过猴子修补的形式)。这有点乱,但是 它似乎有效。