Visual Studio 2010中WebService的远程单元测试

本文关键字:单元测试 WebService Studio 2010 Visual | 更新日期: 2023-09-27 18:10:56

我需要将我的单元测试从本地更改为远程测试,到目前为止,我认为我所要做的就是更改UrlToTest以指向另一个服务器…但是VS坚持要创建一个开发Web服务器,而不是使用已经在运行的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,此时它可以工作,但会启动一个开发人员服务器,这不是我想要的。

Visual Studio 2010中WebService的远程单元测试

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

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

     [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说。如果您调用的代码在内部改变了状态,会发生什么?下一个测试可能会因此失败,所以你需要清理策略,否则你的测试将非常脆弱,你最终会忽略它们。

Update:在运行时传递一个地址。将第一个参数更改为配置文件中的端点配置名称。

我将在黑暗中尝试一下,因为我最近做了类似的事情。

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

要解决这个问题——尽管它可以被忽略——将合同移到一个新项目中。然后让服务和测试项目引用新项目,并删除测试项目对服务的引用。

希望这是有意义的!

一旦引用被删除,当你运行测试时,VS将不再觉得有必要启动你的服务。

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

你必须考虑你想要达到的目标的本质。

很难确切地说出你在代码中击中了什么。我的印象是,你拥有的是一个调用网络服务的网站。您是在该上下文中测试客户端代码,而不仅仅是测试服务。

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

即使以上不是场景,并且根据您在评论中回复UrbanEsc的内容,您也可以测试从同一站点进程发起的对web服务的外部调用。

你说:"找到了,但是VS仍然在本地主机上启动一些东西,然后试图访问外部服务器……似乎VS不是为真正的web服务远程测试而设计的"

阅读上面的内容。我想说,你需要更好地理解你在促成什么。您当然可以测试远程web服务,就像您可以做任何可以编写代码的事情一样。您可以从客户端代码中执行此操作,该代码与服务的任何其他外部客户端所知道的代码没有任何不同。支持还不止于此,你还可以对服务进行负载测试。

注意你正在做的不是单元测试,这些是集成测试。或者根据系统的范围,进行完整的系统测试。