Путь к непрерывной интеграции. Selenium + TeamCity

Вступ


Рассмотрим интегрирование тестов Selenium IDE в процесс непрерывной интеграции с помощью TeamCity. В многих местах встречал когда QA создает тесты ( в лучшем случае, зачастую бывает когда кликери просто по документу «прокликивают» проект и делает отчеты ) и регулярно запускают их, и как правило все это происходит локально на его же компьютере. Как на меня абсолютно не системный подход, который (сейчас то, в 2014 году ) решается миллионом решений для полной автоматизации процесса.
Ну раз Continuous Integration такая популярная практика, почему же не внедрить функциональное тестирование в процесс непрерывной интеграции, облегчить жизнь тестировщикам и поднять уровень качества продукта в целом.

Что надо и чего хотим


Что есть?
  • CI сервер (TeamCity) для сборки и деплоймента проектов
  • QA с пачкой тестов созданных в Selenium IDE
  • Энтузиазм

Что надо?
  • Добавить в процесс непрерывной интеграции исполнение Selenium IDE тестов


Как установить, настроить и сделать первые билд конфигурации на просторах больше чем надо, потому описывать не буду, да и речь не об этом.
Прошу под кат.

Подготовка и конфигурация билд агента


В качестве билд агента била установлена Windows машина, на которой установлен TeamCity Agent и подцеплен в TeamCity серверу.
Делаем следующие шаги, для настройки среди для исполнения:

Все манипуляции будут происходить в «C:\Selenium» потому создаем там одноименный каталог.
На данной машине должен бить поднят selenium server standalone, который для удобства хорошо б установить в винде как службу, так как ручной вызов не совсем комильфо. Сделать можно з помощью утилиты nssm (“Non-Sucking Service Manager”).
Качаем, распаковываем и кладем в «C:\Selenium».
Качаем selenium-server-standalone и ложем туда же (последнюю на момент написания можно скачать отсюда).
Устанавливаем Selenium Server как службу

C:\Selenium\nssm-2.16\win64\nssm.exe install Selenium-Server "C:\Program Files (x86)\Java\jre7\bin\java.exe" "-jar C:\Selenium\selenium-server-standalone-2.42.2.jar"


В качестве «исполнителя» build step используем NUnit ( тесты из Selenium IDE будем экспортировать в .cs с последующей компиляцией в dll библиотеки), потому так же на машине устанавливаем .NET Framework 4 (если нет, взять можно отсюда).
После установки ищем путь к csc.exe, который лежит в
"C:\Windows\Microsoft.NET\Framework\v4.0.<еще пара циферок с версией>"
и прописываем его в переменные среди для возможности глобального вызова.
Устанавливаем Mozilla Firefox так как будет использоваться настройках конекшна.
Для того чтоб csc смог скомпилировать экспортирование тесты, нужно скачать и положить некое количество дополнительных библиотек и положить в «C:\Selenium» (процесс компиляции будет происходить автоматически с этого каталога). Вот тут можно их взять.
Качаем и распаковываем в «C:\Selenium».

На этом подготовка билд агента закончена, можно приступать к конфигурации билда для запуска тестов.

Конфигурирование TeamCity


Идем в админку ТимСити, и жмакаэм создать проект, вводим имя, id, дескрипшн и «Create»

image

Попадаем на страницу настройки нового проекта, и жмем «Create Build Configuration», заполняем знакомые уже три поля и опять же синяя кнопка

image

После создания билд конфигурации попадаем на экран выбора существующего репозитория, или как в нашем случае, так как нету подключенных репозиториев, создания нового. Хорошей практикой будет «подцепить» репозиторий с живим проектом (с него же забирать написание тесты и в последствии компилировать и запускать), дабы следить за изменениями в репозитории и триггерить на изменения кода (непрерывная интеграция же), но так как тут показываю «демо», то мы подключим «левый» репозиторий, и не будем его чекаутить. Наша цель — запустить тесты и получить репорт.

Подцепляем любой репозиторий (как вариант открытий репозиторий з github/bitbucket), тестируем подключение, и опять же «Create»:

image

Попадаем в окно с конфигурированием репозиториев билда (я установил VCS checkout mode: как Do not checkout files automatically, чтоб не следить за ненужным репозиторием):

image

Приступаем к самому интересному. Тут я сделаю два шага, первый запустит компилирование тестов из исходников (.cs) в библиотеки для NUnit, и второй уже запуск тестов NUnit'ом.

Переходим на следующую табу настроек билда «Build Steps», и додаем первый шаг кнопкой «Add build step», в списке «Runner type » ищем «Command Line» и выбираем его. Вводим название шага, в вставляем в поле скрипта следующее:

csc /t:library /r:WebDriver.Support.dll /r:WebDriver.dll /r:ThoughtWorks.Selenium.Core.dll /r:Selenium.WebDriverBackedSelenium.dll /r:nunit.framework.dll /r:System.Data.dll /r:System.Data.Services.Client.dll /out:"C:\Selenium\compiled_test.dll" "C:\Selenium\reg.cs"

И жмем «Save»

Скрипт запустит компилятор, запустит компиляцию экспортированного теста с Selenium IDE, который лежит по пути «C:\Selenium\reg.cs» и положит скомпилированную библиотеку в файл «C:\Selenium\compiled_test.dll», который мы в следующем шаге передадим NUnit'у.

image

Добавляем еще один build step, только как runner выбираем уже NUnit.
Заполняем как на скриншоте и в Run tests from: прописываем путь, по которому первый шаг положит скомпилированный тест, в нашем случае «C:\Selenium\compiled_test.dll» — и сохраняемся.

В итоге получим следующее:

image

Поздравляю, минимальная конфигурация завершена, остается только написать первый тест и запускать его исполнение.

Создание первого теста


Просим QA накликать простенький тест в Selenium IDE и экспортируем его в «С# / NUnit / Remote Control».



Единственное, что надо было поправить — это настройки подключения к веб браузеру.

Привожу пример теста.

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using Selenium;

namespace SeleniumTests
{
	[TestFixture]
	public class open_page
	{
		private IWebDriver driver;
		private ISelenium selenium;
		private StringBuilder verificationErrors;
		
		[SetUp]
		public void SetupTest()
		{
			verificationErrors = new StringBuilder();
			//driver = new FirefoxDriver(); - что подсунул сгенерированный тест
			driver = new FirefoxDriver(new FirefoxBinary(@"C:\Program Files (x86)\Mozilla Firefox\firefox.exe"), new FirefoxProfile(), TimeSpan.FromMinutes(10)); // прохардкожений путь к существующему firefox
			selenium = new WebDriverBackedSelenium(driver,  "http://habrahabr.ru/");
			selenium.Start();
		}
		
		[TearDown]
		public void TeardownTest()
		{
			try
			{
				driver.Close();
			}
			catch (Exception)
			{
				// Ignore errors if unable to close the browser
			}
			Assert.AreEqual(string.Empty, verificationErrors.ToString());
		}
		
		[Test]
		public void TheOpen_pageTest()
		{
			selenium.Open("/");
			selenium.Click("link=О сайте");
			selenium.WaitForPageToLoad("30000");
		}
	}
}


Смотрим результат


Заходим в ТимСити в жмем Run напротив нашего билда, ждем выполнение теста и радуемся результату. Билд зеленый, 1 тест пройден.

image

P.S. Как выше упоминал, пишем тесты, кладем в репозиторий проекта, триггерим сборку проекта по каждому комиту, после сборки забираем тесты, компилим и запускаем и в случае успеха делаем post comit хук на push в репозиторий и возможно даже деплоймент на staging окружение. И все это полностью автоматически.
Поделиться публикацией

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

    0
    облегчить жизнь тестировщикам и поднять уровень качества продукта в целом

    пачкой тестов созданных в Selenium IDE

    Ситуация когда тесты через selenium IDE облегчают жизнь скорее утопична чем реальна.
      0
      Из-за «тести» сложно было на смысле текста сконцентрироваться.

      Если по сути — думаю не лучшая практика гонять автотесты на каждый чекин, там хватит и обычных юнит-тестов.
        0
        спасибо, повыправлял.
        ну как би, уже дело ситуации, если и нету необходимости, можно гонять не на каждый чекин, а на тег/релиз, или цеплять как тригер после деплоймента.
        0
        Извините, имхо конечно, но настройка teamcity (по крайней мере та часть, которую вы описали) и так интуитивно понятна и не требует пояснений.

        Да и совет «кликать тесты» в selenium ide и экспортить их в c# — скорее навредит, чем поможет. Что будете делать когда накликаете 1000 тестов и у вас внезапно изменится верстка на одной из страниц?

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

        Самое читаемое