如何进行Web测试的模拟?

时间:2011-01-15 14:22:05

标签: asp.net testing unity-container watin cassini-dev

我想为我的asp.net Web应用程序编写一些Web测试(通过WatiN / Selenium + CassiniDev Web服务器)。

我遇到的问题是我不知道在这种情况下该怎么做: 有一个页面,用户可以单击该按钮来调用某些第三方服务。在我的网络测试中,我想创建这个服务的模拟,它将始终返回静态值(这些测试用例中的某个值和其他测试用例中的其他值)。

我该怎么做?

目前我使用的是IoC / DI容器Microsoft Unity。我的页面以http://msdn.microsoft.com/en-us/library/ff664622%28v=pandp.50%29.aspx中描述的方式获取其依赖关系。

我唯一的解决方案是:在每个测试用例的web.config中放置所有依赖项,并在测试的SetUp上复制必要的web.config。这个解决方案非常痛苦!

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我在集成测试中也使用WatiN和Cassini-dev,并且不得不处理类似的问题。在我的设置夹具中,我将我的Asp.Net Web应用程序部署到我的测试文件夹中的临时文件夹,这允许我在启动cassini-dev之前使用配置。我使用Windsor作为我的CI,它允许我在配置级别更改注入的组件。您也可以使用Unity来实现此目的。

如果您所指的服务是Web服务,您只需使用您编码的界面模拟Web服务。

以下是我在运行集成测试时采取的步骤:

  1. 创建临时网站目录
  2. 将Asp.Net Web应用程序发布到临时目录(我使用MSBuild执行此操作)
  3. 部署临时数据库(使用MSbuild和数据库项目,但可以通过多种方式完成)
  4. 部署临时成员资格数据库(请参阅我的blog post了解如何在代码中执行此操作)
  5. 更新已部署的Asp.Net Web应用程序的web.config,以指向临时数据库并更改与测试相关的任何其他设置。
  6. 使用Cassini-Dev启动网站。我还使用http请求访问该站点,以便在运行任何测试之前我可以验证该站点是否已启动。
  7. 运行测试。

    运行测试后,您应该清理。

    1. 停止cassini-dev
    2. 删除临时主机文件夹
    3. 删除临时数据库。我使用Sql server SMO对象,这些对象允许我查询Sql Server,我用它来删除任何先前失败的测试运行后遗留下来的旧数据库。

    4. 如何在代码中使用MSbuild部署网站

      var properties = new Dictionary<string, string>
      {
          {"Configuration", isDebug ? "Debug" : "Release"},
          {"WebProjectOutputDir", tempHostingDirectory.FullName},
          {"DeployToDatabase", "true"},
          {"OutDir", Path.Combine(tempHostingDirectory.FullName, "bin\\")}
      };
      
      using (var engine = new ProjectCollection(properties))
      {
          engine
              .LoadProject(<web project path>, "4.0")
                      .Build(new[] {"Build", "ResolveReferences", "_CopyWebApplication"});
      }
      

      Unity配置部分用法:http://www.pnpguidance.net/Post/UnityContainerUnityConfigurationSectionAppConfigWebConfig.aspx

      在代码中生成asp.net成员资格数据库:http://bronumski.blogspot.com/2011/06/generating-creating-aspnet-application.html

      MSDN上的Msbuild ProjectCollection:http://msdn.microsoft.com/en-us/library/microsoft.build.evaluation.projectcollection.aspx

答案 1 :(得分:0)

听起来您正在尝试模拟Web服务。 Web服务通常继承自MarshalByRefObject,这意味着您可以通过继承RealProxy来创建一个假装成为Web服务的透明代理来创建模拟:

class Mock : RealProxy
{
    public Mock()
        : base(typeof(IStuff)) { }

    public IStuff GetStuff()
    {
        return (IStuff)GetTransparentProxy();
    }

    public override IMessage Invoke(IMessage msg)
    {
        IMethodCallMessage message = (IMethodCallMessage)msg;

        // the message object provides the MethodInfo that was called
        // as well as the arguments.

        // <Insert logic here>

        return new ReturnMessage(new NotImplementedException("comming soon to a test near you ..."), message);
    }
}

我相信NMock2使用RealProxy进行模拟,因此您应该可以使用它来模拟Web服务。