SpecFlow + WatiN + NUnit + TeamCity в Windows Server 2008 R2 - PullRequest
7 голосов
/ 24 мая 2011

Недавно я столкнулся с некоторыми проблемами при настройке полностью автоматизированной среды ночной сборки / тестирования / развертывания. Чтобы объяснить настройку вкратце. Мы используем Mercurial в качестве системы контроля версий и TeamCity в качестве сервера сборки. В настоящее время у него есть только один агент сборки на отдельной машине, чтобы все было просто.

Идея такова: каждую ночь запускается сборка TeamCity. Извлекает последние данные из репозитория Mercurial, запускает сборку, запускает модульные тесты, развертывает на тестовом сервере, запускает приемочные тесты (на агенте сборки) для только что развернутого тестового сервера и, если все это проходит, развертывает лот на промежуточный сервер. У меня все работает, кроме приемочных испытаний. Это делается с помощью SpecFlow и WatiN. Everyhting прекрасно работает на машинах разработки (Windows 7 32 бит). Однако, когда я пытаюсь запустить приемочные тесты (NUnit в TeamCity), отчеты о выполнении не выполняются из-за шага [Browser] .ContainsText (browserText). Все шаги до этого выполнялись правильно, и если я повторяю шаги в том же браузере на агенте сборки (получил полный доступ администратора), я могу видеть присутствующий текст. Итак, насколько мне известно, тест должен пройти.

Я нашел этот поток стекового потока , который заставил меня задуматься о том, что я могу что-то не так делать с тем, как я храню экземпляр браузера. Для объяснения: у меня есть набор общих шагов, таких как «когда я нажимаю кнопку X» или «когда я ввожу текст X в поле Y» и тот, у которого есть проблема «тогда я показываю X». Поскольку я делаю как можно больше тестов для повторного использования, я также обобщил требование сценария @requires_browser, которое затем определяется следующим образом:

[BeforeScenario("requires_browser")]
public void RequiresBrowserBeforeFeature()
{
    Settings.MakeNewIeInstanceVisible = false;
    ScenarioContext.Current.Set<Browser>(new IE(true));
}

[AfterScenario("requires_browser")]
public void RequiresBrowserAfterFeature()
{
    ScenarioContext.Current.Get<Browser>().Close();
    ScenarioContext.Current.Get<Browser>().Dispose();
}

и затем общий шаг:

[Then("I am shown \"(.*)\"")]
public void ThenIAmShown(string text)
{
    Assert.IsTrue(ScenarioContext.Current.Get<Browser>().ContainsText(text));
}

Из этого я могу определить другие общие шаги, которые вводят текст в текстовые поля, нажимают кнопки и так далее. Все это прекрасно работает в среде разработки, работающей в Visual Studio 2010 [от имени администратора].

Я ошибаюсь, полагая, что ScenarioContext должен быть сохранен до завершения теста?

Что я пробовал до сих пор:

  1. Настройка службы агента сборки для запуска в качестве локальной системы (SYSTEM). Это вызывает проблему, как описано - метод ThenIAmShown (текст строки) всегда будет терпеть неудачу. Включено взаимодействие с локальным рабочим столом.

  2. Сконфигурированная служба агента сборки для запуска от имени администратора сети (полные права администратора). Эта настройка даже не запускает тесты. Исключение, которое я получаю:

    Сбой метода TearDown. WatiN.Core.Exceptions.BrowserNotFoundException: Не удалось найти ограничение соответствия окна IE: время ожидания ожидания подключения к вновь созданному экземпляру IE. Время поиска истекло через 30 секунд. TearDown: System.Collections.Generic.KeyNotFoundException: указанный ключ отсутствует в словаре. в WatiN.Core.IE.CreateIEPartiallyInitializedInNewProcess () в WatiN.Core.IE.CreateNewIEAndGoToUri (Uri uri, IDialogHandler logonDialogHandler, логическое значение createInNewProcess) ...

  3. Уже добавлены сборки Interop.SHDocVw.dll и Microsoft.mshtml.dll в каталог bin (Копировать в вывод в ссылках проекта).

  4. Запуск пользовательского интерфейса NUnit из агента сборки. Это запускает юнит-тесты, как и ожидалось. Приводит меня к мысли, что может быть проблема с безопасностью. Runnint NUnit 2.0.5 в Windows Server 2008 R2 Enterprise.

У кого-нибудь была эта проблема?

...