如何在integration tests期间使用单点登录(例如,使用caybara或cucumber)测试页面?对于普通登录,您需要编写一个访问登录页面、填写表单并提交表单的方法。如果登录表单来自外部SSO服务器,比如Shibboleth或OpenAM/OpenSSO,这就有点困难了。如何为受SSO保护的页面编写集成测试?
一个类似的问题是使用单独的搜索服务器(Solr或Sphinx)进行集成测试。您可能会通过使用某种形式的模拟或存根来解决它。谁能给出一个很好的例子,如何模拟或存根黄瓜或水豚的SSO?如果这太难了,那么搜索服务器的一个类似示例也会很有帮助。
发布于 2011-07-26 17:24:09
SSO应用程序的集成测试是一个更一般问题的特例:测试分布式应用程序。这是一个困难的问题,似乎没有灵丹妙药。有多种方法可以组合一组不同的服务器或服务,并将它们作为一个整体进行测试。两个极端是
a)测试整个系统的一个实例。然后,您不需要任何模拟或存根,但您需要一个完整的、成熟的整个堆栈设置。这包括所涉及的每个服务器的运行实例。对于每一次测试,设置整个应用程序堆栈,并测试整个堆栈,即将所有涉及的组件作为一个整体测试整个分布式系统,这通常是困难的。只有当每个组件和所有连接都正常工作时,整个事情才能正常工作。
b)为每个组件编写集成测试,将其视为黑盒,并通过mock和stub来覆盖缺失的连接。在实践中,这种方法更常见于单元测试,人们为每个MVC层编写测试:模型、视图和控制器(视图和控制器通常一起)。
在这两种情况下,您都没有考虑到断开的连接。原则上,必须检查每个外部服务器/服务的以下可能性
<代码>F29
基本上,分布式应用程序的测试是困难的。这就是为什么distributed applications are hard to develop。分布式应用程序的部件和服务器越多,就越难设置许多成熟的环境,如生产、升级、测试和开发。系统越大,集成测试就变得越困难。在实践中,人们使用第一种方法,并创建整个应用程序的一个小但完整的版本。典型的简单设置是App Server + DB Server + Search Server。在您的开发计算机上,您将拥有一个完整系统的两个不同版本:
具有多个数据库的
用于搜索服务器的常见Ruby插件(考虑Sphinx for Sphinx或Sunspot for Solr)支持cucumber和集成测试。他们为你测试的某些部分“打开”搜索服务器。对于不使用搜索服务器的代码,它们会“存根”服务器或模拟连接,以避免不需要的索引。
对于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请求或集成测试。
对于cucumber测试,可以通过将到搜索服务器的连接替换为存根来清除搜索服务器(对于Sunspot和Solr,这可以通过封装到Solr的连接的replacing the Sunspot.session来完成)。
这一切听起来都很好,但不幸的是,将此解决方案移植到SSO服务器上有点困难。典型的最小设置是App Server + DB Server + SSO Server。完整的集成测试意味着我们必须设置一个具有多个用户数据存储(开发和测试)的SSO服务器。设置SSO服务器已经够难的了,设置一个具有多个用户数据存储的SSO服务器可能不是一个很好的主意。
这个问题的一个可能的解决方案可能是在Fakeweb的方向上。FakeWeb是布莱恩·库克为伪造web请求而编写的Ruby库。它允许您将测试环境与活动服务解耦。不幸的是,伪造SSO服务器的响应有点困难。
我最终使用的另一个可能的解决方案是使用fake login,即添加一个可以在集成测试中调用的假登录方法。这个假登录是仅在测试期间添加的动态方法(通过猴子补丁的形式)。这有点乱七八糟,但似乎很管用。
https://stackoverflow.com/questions/6667625
复制相似问题