【问题标题】:Remote unit testin of a WebService in Visual Studio 2010在 Visual Studio 2010 中对 WebService 进行远程单元测试
【发布时间】:2011-10-10 16:20:38
【问题描述】:

我需要将我的单元测试从本地测试更改为远程测试,到目前为止,我认为我所要做的就是将 UrlToTest 更改为指向另一台服务器......但是 VS 一直坚持创建一个开发 Web 服务器而不是使用已经运行的那个。

所以在阅读了一些文档之后,我的问题实际上是我是否在远程和本地计算机上都安装了测试控制器和测试代理,还是什么?如果 WebService 在 Linux 上怎么办...

请注意,我不想调试正在测试的应用程序。我只想为已经在运行的已部署的 WebService 执行测试。

我可能应该提一下,我所有的测试都包含 WebService 调用和一些类似这样的检查:

    [TestMethod()]
    [HostType("ASP.NET")]
    [AspNetDevelopmentServerHost("MainProjectName", "/")]
    [UrlToTest("http://servername:port/websitename/TestingOnlyWebForm.aspx")]
    public void LoginEmptyDataTest()
    {
        IUserService userService = CreateIUserService();
        string email = "";
        string password = "";
        ReturnMessage<User> actual;
        actual = userService.Login(email, password);
        Assert.AreNotEqual(true, actual.Status);
        Assert.AreNotEqual("db_error", actual.Info);
    }

但我也有更复杂的测试,其中我更改了一些数据并将其发送到另一个 WebService 等等。

请注意,UrlToTest 以前指向 localhost,此时它可以工作,但会启动一个开发人员服务器,这不是我想要的。

【问题讨论】:

  • 如果您的测试项目对服务项目有依赖/引用,那么我很确定它会在您运行测试时为您启动本地服务。但是,它是在测试期间调用本地服务还是转到正确的服务?

标签: c# web-services visual-studio-2010 unit-testing


【解决方案1】:

您尝试做的事情是不可能的。所有生成的单元测试试图做的是在机器上本地运行测试,或者通过指定 AspNetDevelopmentServerHost 使用开发服务器,或者在 AspNetDevelopmentServerHost 不存在时使用 local IIS。

如果您想测试远程服务,请右键单击您的单元测试项目并添加服务引用。指向你的服务给它一个命名空间,比如服务,然后生成代理。生成代理后,只需实例化它们并调用方法。还要从测试中删除所有不需要的属性。您的测试应该大致如下所示:

     [TestMethod]
        public void LoginEmptyDataTest()
        {
            using (var userServiceClient = new Services.UserServiceClient(
                                        "BasicHttpBinding_IUserService", 
                                        "http://someremotehost/userservice.svc"))
            {
                var result = userServiceClient.Login("user", "password");

                // asserts go here
            }
        }

这可能会解决您当前的问题,但是您应该像@eglasius 所说的那样重新考虑您在做什么。如果您调用的代码在内部更改状态会发生什么?下一次测试可能会因此失败,因此您需要清理策略,否则您的测试将非常脆弱,您最终会忽略它们。

更新:在运行时传递地址。将第一个参数更改为配置文件中的任何 enpoint 配置名称。

【讨论】:

  • 我想我已经尝试过了,直到星期一我才能尝试,赏金将结束......也许我错过了引用 Web 服务。所以这似乎足够接近了。
  • 好的。所以我检查了一下,这是最接近答案的。还有一个问题 - 我既有对项目的引用,也有对 LOCAL 服务的服务引用。然后你手动(自动不起作用!)在 app.config > 客户端 > 端点更改地址。
【解决方案2】:

我会在这个黑暗中试一试,因为我最近做了类似的事情。

在我的例子中,我的测试项目引用了服务项目,以提供 Web 服务实现和使用的服务和数据合同的可见性。

要解决此问题(尽管可以忽略),请将合同移至新项目。然后让服务和测试项目引用新项目,并删除测试项目对服务的引用。

希望这是有道理的!

删除引用后,VS 将不再需要在您运行测试时启动您的服务。

【讨论】:

    【解决方案3】:

    您可以在 WCF 服务项目的项目设置中禁用服务主机的启动。右键-WCF选项-取消勾选“在同一解决方案中调试另一个项目时启动WCF服务主机”。

    【讨论】:

    • 遗憾的是我没有该选项,我无法将 VS2010 升级到 SP1(这应该允许我更改 WCF 选项)。
    • @Nux 它只是在以前的版本中命名不同,但它仍然存在!在 2008 中,它在属性窗口下(不是“右键单击 -> 属性 -> 选项卡式视图之一,而是“在解决方案资源管理器中单击左键”之一),其名称为“调试时始终启动”,默认值为“True” ”。看这里imageshack.us/photo/my-images/27/wcfsettings.png
    • 找到了,但是 VS 仍然在 localhost 上启动一些东西,然后尝试访问外部服务器......似乎 VS 并不是为真正的远程 Web 服务测试而设计的。
    【解决方案4】:

    你真的必须考虑你在这里想要达到的目标的性质。

    很难准确地说出您对代码的影响。我的印象是,你有一个网站,它调用了一个网络服务。您正在该上下文中测试客户端代码,而不仅仅是测试服务。

    如果是这种情况,请删除属性并将 url 指向正确的服务,如 UrbaEsc 引导您。如果您不删除属性,那么您将在站点的上下文中运行调用代码。

    即使上述情况并非如此,并且根据您在 cmets 中回复 UrbanEsc 的内容,您也将测试从同一站点进程启动的对 Web 服务的外部调用。

    你说: “找到了,但 VS 仍然在 localhost 上启动一些东西,然后尝试访问外部服务器……似乎 VS 并不是为真正的远程 Web 服务测试而设计的”

    阅读以上内容。我想说你需要更好地理解你正在启用什么。您当然可以测试远程 Web 服务,就像您几乎可以编写任何代码一样。您可以通过与服务的任何其他外部客户端所知道的完全不同的客户端代码来执行此操作。支持并不止于此,您还可以对服务进行负载测试。

    请注意,您所做的不是单元测试,而是集成测试。或者根据您的系统范围,进行完整的系统测试。

    【讨论】:

    • 我正在测试使用 VS 2010 为 WCF WebService 生成“单元测试”时自动生成的内容。我知道这些并不完全是正式的单元测试,但 Web 服务是我唯一有时间测试的......无论如何,如果你能提供更多关于如何调整自动生成的测试以仍然作为单元测试运行和远程测试的详细信息网络服务,那么赏金就是你的了。
    • 删除测试方法中的所有主机/url属性,取消选中UrbanEsc等其他项目的开始,并像从任何第三方客户端一样调用您的服务。 msdn.microsoft.com/en-us/library/ms735103.aspx.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    相关资源
    最近更新 更多