Удаленное модульное тестирование веб-сервиса в Visual Studio 2010

#c# #web-services #visual-studio-2010 #unit-testing

#c# #веб-сервисы #visual-studio-2010 #модульное тестирование

Вопрос:

Мне нужно изменить модульный тест с локального на удаленный, и пока я думал, что все, что мне нужно сделать, это изменить UrlToTest, чтобы указать на другой сервер… Но VS продолжает настаивать на создании веб-сервера разработки вместо использования того, который уже запущен.

Итак, после прочтения некоторых документов мой вопрос на самом деле заключается в том, должен ли я установить контроллер тестирования и агент тестирования как на удаленном, так и на локальном компьютере или что? Что делать, если веб-сервис находится в Linux…

Обратите внимание, что я не хочу отлаживать приложение, которое я тестирую. Я просто хочу, чтобы тесты выполнялись для веб-сервиса, который уже запущен, то есть развернут.

Я, вероятно, должен упомянуть, что все мои тесты состоят из вызовов веб-сервиса и некоторых проверок, подобных этому:

     [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);
    }
  

Но у меня есть и более сложные тесты, в которых я изменяю некоторые данные и отправляю их на другой веб-сервис и так далее.

Обратите внимание, что UrlToTest ранее указывал на localhost, после чего он работает, но запускает сервер разработчика, который мне не нужен.

Комментарии:

1. Если ваш тестовый проект имеет зависимость / ссылку на проект службы, то я почти уверен, что он запустит локальную службу для вас при запуске тестов. Однако вызывает ли он локальную службу во время тестов или переходит к правильной службе?

Ответ №1:

То, что вы пытаетесь сделать, невозможно. Все, что пытается сделать сгенерированный модульный тест, — это запустить тест локально на компьютере либо с помощью сервера разработки, указав AspNetDevelopmentServerHost, либо с помощью локального IIS, когда AspNetDevelopmentServerHost отсутствует.

Если вы хотите протестировать удаленные службы, щелкните правой кнопкой мыши свой проект модульного тестирования и добавьте ссылку на службу. Укажите на свой сервис, укажите ему пространство имен, скажем, 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. что произойдет, если вызываемый вами код изменит состояние внутри? Из-за этого может произойти сбой следующего теста, поэтому вам нужны стратегии очистки, иначе ваши тесты будут очень хрупкими, и вы в конечном итоге проигнорируете их.

Обновление: передача адреса во время выполнения. Измените первый параметр на любое имя конфигурации enpoint, которое у вас есть в вашем конфигурационном файле.

Комментарии:

1. Я думаю, что я уже пробовал это, и я не могу попробовать до понедельника, и щедрость закончится… Возможно, я пропустил ссылку на веб-сервис. Так что это кажется достаточно близким.

2. ОК. Итак, я проверил, и это было ближе всего к ответу. Еще одна загвоздка — у меня была как ссылка на проект, так и добавление ссылки на службу к ЛОКАЛЬНОЙ службе. Затем вы вручную (автоматически не сработает!) Измените адреса в app.config> client> endpoint.

Ответ №2:

Я попробую это сделать в темноте, потому что недавно я делал нечто подобное.

В моем случае мой тестовый проект ссылался на проект службы, чтобы обеспечить видимость контрактов на обслуживание и данные, которые реализует и использует веб-служба.

Чтобы решить эту проблему, хотя ее можно игнорировать, переместите контракты в новый проект. Затем попросите сервис и тестовые проекты ссылаться на новый проект и удалите ссылку тестовых проектов на сервис.

Надеюсь, это имеет смысл!

Как только ссылка будет удалена, VS больше не будет испытывать необходимости запускать вашу службу при выполнении тестов.

Ответ №3:

Вы можете отключить запуск узла службы в настройках проекта вашего проекта службы WCF. Щелкните правой кнопкой мыши — Параметры WCF — Снимите флажок «Запускать хост службы WCF при отладке другого проекта в том же решении».

Комментарии:

1. К сожалению, у меня нет такой опции, и я не могу обновить VS2010 до SP1 (что должно позволить мне изменить параметры WCF).

2. @Nux Его просто называли по-другому в предыдущих версиях, но он все еще там! В 2008 году он находился в окне свойств (не в окне «щелчок правой кнопкой мыши -> свойства -> просмотр с вкладками, а в окне «одиночный щелчок левой кнопкой мыши в обозревателе решений») и назывался «Всегда запускаться при отладке», а его значение по умолчанию равно «True». Посмотрите здесь imageshack.us/photo/my-images/27/wcfsettings.png

3. Нашел его, но VS все еще запускает что-то на локальном хосте, а затем пытается связаться с внешним сервером… Похоже, VS просто не предназначен для реального удаленного тестирования веб-сервисов.

Ответ №4:

Вам действительно нужно учитывать природу того, чего вы пытаетесь достичь здесь.

Трудно точно сказать, что вы используете в коде. У меня сложилось впечатление, что у вас есть веб-сайт, который вызывает веб-службу. Вы тестируете клиентский код в этом контексте, а не просто тестируете сервис.

Если это так, удалите атрибуты и укажите URL-адрес правильной службы, как подсказал вам UrbaEsc. Если вы не удалите атрибуты, вы запускаете вызывающий код в контексте сайта.

Даже если вышеприведенный сценарий не соответствует сценарию и основан на том, что вы ответили UrbanEsc в комментариях, тогда вы будете тестировать внешний вызов веб-сервиса, инициированный из того же процесса сайта.

Вы сказали: «Нашел это, но VS все еще запускает что-то на локальном хосте, а затем пытается связаться с внешним сервером… Похоже, VS просто не предназначен для реального удаленного тестирования веб-сервисов «

Прочитайте выше. Я бы сказал, что вам нужно лучше понять, что вы включаете. Вы, конечно, можете тестировать удаленные веб-службы, как вы можете делать практически все, что вы можете закодировать. Вы делаете это из клиентского кода, который не знает ничего отличного от того, что знал бы любой другой внешний клиент службы. Поддержка на этом не заканчивается, так как вы можете выполнять нагрузочное тестирование сервиса.

Обратите внимание, что то, что вы делаете, не является модульными тестами, это интеграционные тесты. Или, в зависимости от области применения вашей системы, полное тестирование системы.

Комментарии:

1. Я тестирую то, что генерируется автоматически при использовании VS 2010 для создания «модульных тестов» для веб-сервиса WCF. Я знаю, что это не совсем, формально модульные тесты, но веб-сервисы — единственные, которые я тестирую по времени… В любом случае, если вы можете предоставить более подробную информацию о том, как настроить автоматически сгенерированные тесты, чтобы они по-прежнему запускались как модульные тесты и тестировали удаленный веб-сервис, тогда вознаграждение за вас.

2. удалите все атрибуты хоста / url в методе тестирования, снимите флажок с начала другого проекта, на который указал UrbanEsc, и вызовите свою службу, как вы бы делали с любого стороннего клиента. msdn.microsoft.com/en-us/library/ms735103.aspx .