SpecFlow + WatiN + NUnit + TeamCity в Windows Server 2008 R2

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

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

Я нашел этот трек stackoverflow, который заставил меня подумать, что я может быть, что-то не так с тем, как я храню экземпляр браузера. Чтобы объяснить: у меня есть набор общих шагов, таких как «когда я нажимаю кнопку 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(string text) всегда будет завершаться ошибкой. В нем включено взаимодействие с локальным рабочим столом.

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

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

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

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

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


person Ales Potocnik Hahonina    schedule 24.05.2011    source источник
comment
Хорошо, нашел решение и могу подтвердить, что оно работает. Оказывается, это связано со способом запуска службы агента сборки, как описано на devnet.jetbrains.net/ message/5232020 При запуске службы агента сборки через agent.bat [start|stop] проблем с тестами нет. Надеюсь, кто-то найдет это полезным.   -  person Ales Potocnik Hahonina    schedule 24.05.2011
comment
Пробовал настроить это как запланированную задачу, которая запускается при запуске Windows - независимо от фактического входа пользователя в систему. Это не работает так просто. Пользователь с правами администратора должен войти в систему и запустить пакетный файл. Теперь мы изучаем возможность автоматического входа пользователя в систему при запуске Windows и запуска пакета оттуда. Я сообщу о прогрессе.   -  person Ales Potocnik Hahonina    schedule 25.05.2011
comment
метод AfterWebScenario моего ответа на stackoverflow.com/questions/6694442/ регистрирует текущую страницу в случае ошибки. это может быть большим подспорьем для обнаружения таких проблем. этот код предназначен для селена, но, надеюсь, его можно портировать.   -  person Gaspar Nagy    schedule 18.07.2011