Интеграция TestComplete с TeamCity
#1
Отправлено 03 августа 2011 - 14:46
Хочу узнать сталкивался ли кто-то с такой интеграцией, возможно есть опыт?
Поставлена задача: запуск тестов GUI на TestComplete после деплоймента, как это организовать?
Хочу повториться со вторым вопросом: Реально заставить TC выполнять тесты в фоновом режиме?
Заранее спасибо
#2
Отправлено 04 августа 2011 - 10:16
У нас именно так и работает. После билда или по нажатию Run... запускаются тесты на тестовом сервере. На серваке стоит агент TeamCity, а TestComplete запускается командной строкой.
Единственное, что - нет возможности выводить текущие результаты в TeamCity (или я не нашел как) приходится в процессе тестов создавать свой лог, а в конце подсовывать его агенту. Все работает на ура.
#3
Отправлено 04 августа 2011 - 10:21
Ну а почему нет?
У нас именно так и работает. После билда или по нажатию Run... запускаются тесты на тестовом сервере. На серваке стоит агент TeamCity, а TestComplete запускается командной строкой.
Единственное, что - нет возможности выводить текущие результаты в TeamCity (или я не нашел как) приходится в процессе тестов создавать свой лог, а в конце подсовывать его агенту. Все работает на ура.
а можешь описать как вы интегрировали? какой командой запускаешь скрипты?
#4
Отправлено 04 августа 2011 - 12:18
В проекте ТимСити в секции
Build Steps
стоит:
Command Line - Command: cmd.exe /v:on /e:on /a /c c:\runtests.cmd
примерный батник по которому работает агент - проверка разворачиваемости пакетов(runtests.cmd) просто в нем методами ТестКомплита вводится пользователь для дальнейших тестов:
rem ------------------------------------------------ rem rem запускать с опциями командной строки /v:ON /e:ON rem rem ------------------------------------------------ chcp 1251>nul set /a zero=0 set root=c:\test set RarDir=C:\Program Files\WinRAR rem Removing database @echo ##teamcity[progressMessage 'Removing database'] REM (SQL 2005) "c:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "if DB_ID('test') IS NOT NULL DROP DATABASE test" REM (SQL 2008) REM "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "if DB_ID('test') IS NOT NULL DROP DATABASE test" if NOT ERRORLEVEL 0 EXIT %ERRORLEVEL% @echo ##teamcity[progressMessage 'Clearing directory'] for /d %%d in (%root%\*.*) do call :clear_dir %%d for %%f in (%root%\*.*) do del /q %%f @echo ##teamcity[progressMessage 'Exporting source code'] rem ---- rem создание базы данных @echo ##teamcity[progressMessage 'Creating database'] REM (SQL 2005) "c:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "CREATE DATABASE test ON ( NAME = Test_dat, FILENAME = '%root%\test.mdf', SIZE = 10) LOG ON ( NAME = Test_log, FILENAME = '%root%\test.ldf', SIZE = 5MB)" REM (SQL 2008) REM "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "CREATE DATABASE test ON ( NAME = Test_dat, FILENAME = '%root%\test.mdf', SIZE = 10) LOG ON ( NAME = Test_log, FILENAME = '%root%\test.ldf', SIZE = 5MB)" if NOT ERRORLEVEL 0 EXIT %ERRORLEVEL% rem deployment set DEPLOY_STEP=0 @echo ##teamcity[testSuiteStarted name='Развертывание пакетов '] @echo ##teamcity[testStarted name='Развертывание пакетов '] :deployment set /a before=0 for %%p in (%root%\packs\*.pkg) do @set /a before=!before! + 1 set /a DEPLOY_STEP=!DEPLOY_STEP! + 1 @echo ##teamcity[progressMessage 'Deployment step !DEPLOY_STEP!'] REM тут строка с командой разворачивания пакетов set after=0 for %%p in (%root%\packs\*.pkg) do @set /a after=!after! + 1 if %after%==%zero% goto :initdata if %before% GTR %after% ( @echo ##teamcity[testStdOut name='Развертывание пакетов' out='Ошибка при развертывании'] goto :deployment ) if %after% GTR %zero% goto :deploy_error :initdata @echo ##teamcity[testFinished name='Развертывание пакетов'] @echo ##teamcity[testSuiteFinished name='Развертывание пакетов'] rem Enter System Settings with testcomplete @echo ##teamcity[testSuiteStarted name='Ввод пользователя БД средствами TestComplete'] @echo ##teamcity[testStarted name='Ввод пользователя БД средствами TestComplete'] @echo ##teamcity[progressMessage 'Enter System Settings'] "C:\Program Files\Automated QA\TestComplete 7\Bin\TestComplete.exe" "%root%\test.pjs" /r /p:_InitTests /e /SilentMode /ns @echo ##teamcity[testFinished name='Ввод пользователя БД средствами TestComplete'] @echo ##teamcity[testSuiteFinished name='Ввод пользователя БД средствами TestComplete'] rem saving DB :saving_Db @echo ##teamcity[progressMessage 'Saving database'] REM (SQL 2005) "c:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "ALTER DATABASE [test] SET SINGLE_USER; exec sp_detach_db @dbname=N'test', @skipchecks='true';" REM (SQL 2008) REM "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "ALTER DATABASE [test] SET SINGLE_USER; exec sp_detach_db @dbname=N'test', @skipchecks='true';" if NOT ERRORLEVEL 0 EXIT %ERRORLEVEL% copy %root%\test.mdf %root%\test.bak if NOT ERRORLEVEL 0 EXIT %ERRORLEVEL% REM "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "CREATE DATABASE [test] ON (FILENAME = N'%root%\test.mdf') FOR ATTACH_REBUILD_LOG;" REM if NOT ERRORLEVEL 0 EXIT %ERRORLEVEL% :ExportData @echo ##teamcity[testSuiteStarted name='Архивация артифактов'] @echo ##teamcity[testStarted name='Архивация артифактов'] @echo ##teamcity[progressMessage 'Packing deploy results...'] REM xcopy %root%\business\RunTests.cmd %root%\*.* /y "%RarDir%\winrar.exe" a -afzip -ep1 -r -s -k -rr3p -m5 -dh "%root%\Deploy" "%root%\Client" "%root%\InitData" "%root%\Server" "%root%\test.bak" @echo ##teamcity[testFinished name='Архивация артифактов'] @echo ##teamcity[testSuiteFinished name='Архивация артифактов'] @echo ##teamcity[progressMessage 'Publishing Artifacts...'] @echo ##teamcity[publishArtifacts '%root%\Deploy.zip'] goto :EOF exit 1 :deploy_error @echo deployment error after %DEPLOY_STEP% steps exit 1 :clear_dir if /i %1==%root%\initdata exit /b rd /q /s %1 exit /b
Другой батник уже для тестов например такой:
rem ------------------------------------------------ rem rem запускать с опциями командной строки /v:ON /e:ON rem rem ------------------------------------------------ chcp 1251>nul set /a zero=0 set root=c:\test @echo ##teamcity[progressMessage 'Exporting source code'] rem --- @echo ##teamcity[progressStart 'Restore DATABASE'] REM (SQL 2008) "c:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "ALTER DATABASE [test] SET SINGLE_USER; exec sp_detach_db @dbname=N'test', @skipchecks='true';" REM (SQL 2008) REM "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "ALTER DATABASE [test] SET SINGLE_USER; exec sp_detach_db @dbname=N'test', @skipchecks='true';" if NOT ERRORLEVEL 0 EXIT %ERRORLEVEL% copy %root%\test.bak %root%\test.mdf if NOT ERRORLEVEL 0 EXIT %ERRORLEVEL% REM (SQL 2005) "c:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "CREATE DATABASE [test] ON (FILENAME = N'%root%\test.mdf') FOR ATTACH_REBUILD_LOG;" REM (SQL 2008) REM "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "CREATE DATABASE [test] ON (FILENAME = N'%root%\test.mdf') FOR ATTACH_REBUILD_LOG;" if NOT ERRORLEVEL 0 EXIT %ERRORLEVEL% @echo ##teamcity[progressFinish 'Restore DATABASE'] :tests rem testcomplete run @echo ##teamcity[progressStart 'Execution TestComplete - Business tests] rem call %root%\business\RunTests.cmd for %%t in (TestMenu TESTS) do ( @echo ##teamcity[testSuiteStarted name='Тестирование документа %%t'] "C:\Program Files\Automated QA\TestComplete 7\Bin\TestComplete.exe" "%root%\business\test.pjs" /r /p:%%t /e /SilentMode /ns type %root%\business\Log_autotest\Log.txt @echo ##teamcity[testSuiteFinished name='Тестирование документа %%t'] ) @echo ##teamcity[progressFinish 'Execution TestComplete - Business tests'] REM (SQL 2005) "c:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "ALTER DATABASE [test] SET SINGLE_USER; exec sp_detach_db @dbname=N'test', @skipchecks='true';" REM (SQL 2008) REM "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\osql.exe" -b -S (local)\SQLEXPRESS -E -Q "ALTER DATABASE [test] SET SINGLE_USER; exec sp_detach_db @dbname=N'test', @skipchecks='true';" :ExportData @echo ##teamcity[testSuiteStarted name='Архивация лога'] @echo ##teamcity[testStarted name='Архивация лога'] @echo ##teamcity[progressMessage 'Packing tests results...'] REM xcopy %root%\business\RunTests.cmd %root%\*.* /y del /s /q %root%\server\Output\*.* >nul "%RarDir%\winrar.exe" a -afzip -ep1 -r -s -k -rr3p -m5 -dh "%root%\Results" "%root%\business\Log_autotest\Results.mht" @echo ##teamcity[testFinished name='Архивация лога'] @echo ##teamcity[testSuiteFinished name='Архивация лога'] @echo ##teamcity[progressMessage 'Publishing Artifacts...'] @echo ##teamcity[publishArtifacts '%root%\business\Log_autotest\Results.zip'] goto :EOF :usage exit 1 :clear_dir rd /q /s %1 exit /b
думаю это более чем понятно... до много доходили сами, так что не пинайте сильно если что))
#5
Отправлено 04 августа 2011 - 13:04
#6
Отправлено 04 августа 2011 - 13:17
Мда... надо будет понять... А тестировать GUI реально на удаленной машине не заходя на нее или это не возможно?
Ну стоит себе просто машина на которой крутятся тесты и все. главное мышку с клавой отовсех спятать подальше.
#7
Отправлено 04 августа 2011 - 13:24
Мда... надо будет понять... А тестировать GUI реально на удаленной машине не заходя на нее или это не возможно?
Ну стоит себе просто машина на которой крутятся тесты и все. главное мышку с клавой отовсех спятать подальше.
я так понял что окно на машину эту (удаленную) должно быть открыто?
#8
Отправлено 04 августа 2011 - 14:20
Мда... надо будет понять... А тестировать GUI реально на удаленной машине не заходя на нее или это не возможно?
Ну стоит себе просто машина на которой крутятся тесты и все. главное мышку с клавой отовсех спятать подальше.
я так понял что окно на машину эту (удаленную) должно быть открыто?
Кхем! Не окно, а локальная консоль, да должна быть всегда открыта. Ну или если только это не виртуальная машина, тогда у вас будет окно, которое все равно должно быть открыто. TestComplete же эмулирует действия пользователя т.е. как-будто кто-то работает за машиной.
#9
Отправлено 11 августа 2011 - 09:26
Второй вопрос, я прочитал что можно добавить кастомную вкладку в TeamCity, где будут отображаться логи ТС. Как это можно реализовать?
#10
Отправлено 12 августа 2011 - 13:25
А вы не пробовали подставлять xml логи TC в TeamCity?
Второй вопрос, я прочитал что можно добавить кастомную вкладку в TeamCity, где будут отображаться логи ТС. Как это можно реализовать?
1. Нет не пробовал, но если кто пробовал, было бы интересно послушать советы.
2. Не слышал про это. Буду благодарен за ссылки для изучения сабжа.
#11
Отправлено 12 августа 2011 - 14:07
#13
Отправлено 16 октября 2013 - 10:50
Может кому пригодится.Вот есть информация: tctutorial
Я интегрировал результаты выполнения тестов в тимсити, т.е. можно использовать стандартные тулы для статистики и быстро смотреть результаты в таком вот виде:
1.png 77,5К 21 Количество загрузок:
Для этого я, чтобы не городить лес с параллельным логированием, распарсиваю лог тесткомлита. Для этого я сначала сохраняю лог
Log.SaveResultsAs(Project.ConfigPath+"TeamCityLog//",lsHTML);в конце каждого теста (вешаю на OnStopTest).
А потом натравливаю на него xslt.
В тимсите я использую msbuild вместо CommandLine, для него это выглядит так:
<Target Name="RunTest" DependsOnTargets="Deploy"> <!-- Здесь все что связано с запуском и выполнением тестов А когда уже все выплнилось --> <XslTransformation OutputPaths="$(YOUR_PATH)\TeamCityLog\compiled_log.xml" XmlInputPaths="$(YOUR_PATH)\TeamCityLog\root.xml" XslInputPath="$(YOUR_PATH)\TeamCityLog\LogParser.xsl"/> <XslTransformation OutputPaths="$(YOUR_PATH)\TeamCityLog\teamcityresult.txt" XmlInputPaths="$(YOUR_PATH)\TeamCityLog\compiled_log.xml" XslInputPath="$(YOUR_PATH)\TeamCityLog\GetTeamCityLog.xsl"/> <Exec ContinueOnError="false" Command="type $(YOUR_PATH)\TeamCityLog\teamcityresult.txt)"/> </Target>
LogParser.xsl (и вспомогательный TestParser.xsl) собирает информацию в один xml, а GetTeamCityLog.xsl превращает его в текстовый файл с записями в формате тимсити. Потом просто выводим этот файл.
Из коммандной строки можно использовать msxsl.exe.
Работает для 9 тесткомплита, как будет с более ранними версиями не знаю.
Если будут вопросы - спрашивайте :)
Прикрепленные файлы
#14
Отправлено 16 октября 2013 - 11:37
Может кому пригодится.
Вот есть информация: tctutorial
Я интегрировал результаты выполнения тестов в тимсити, т.е. можно использовать стандартные тулы для статистики и быстро смотреть результаты в таком вот виде:
1.png 77,5К 21 Количество загрузок:
Для этого я, чтобы не городить лес с параллельным логированием, распарсиваю лог тесткомлита. Для этого я сначала сохраняю логLog.SaveResultsAs(Project.ConfigPath+"TeamCityLog//",lsHTML);в конце каждого теста (вешаю на OnStopTest).
А потом натравливаю на него xslt.
В тимсите я использую msbuild вместо CommandLine, для него это выглядит так:<Target Name="RunTest" DependsOnTargets="Deploy"> <!-- Здесь все что связано с запуском и выполнением тестов А когда уже все выплнилось --> <XslTransformation OutputPaths="$(YOUR_PATH)\TeamCityLog\compiled_log.xml" XmlInputPaths="$(YOUR_PATH)\TeamCityLog\root.xml" XslInputPath="$(YOUR_PATH)\TeamCityLog\LogParser.xsl"/> <XslTransformation OutputPaths="$(YOUR_PATH)\TeamCityLog\teamcityresult.txt" XmlInputPaths="$(YOUR_PATH)\TeamCityLog\compiled_log.xml" XslInputPath="$(YOUR_PATH)\TeamCityLog\GetTeamCityLog.xsl"/> <Exec ContinueOnError="false" Command="type $(YOUR_PATH)\TeamCityLog\teamcityresult.txt)"/> </Target>
LogParser.xsl (и вспомогательный TestParser.xsl) собирает информацию в один xml, а GetTeamCityLog.xsl превращает его в текстовый файл с записями в формате тимсити. Потом просто выводим этот файл.
Из коммандной строки можно использовать msxsl.exe.
Работает для 9 тесткомплита, как будет с более ранними версиями не знаю.
Если будут вопросы - спрашивайте :)
Я решил по другому как делать.
Помимо интеграции логов, я еще генерю батник из самого Тест Комплита который потом открывается Тим Сити, и вуаля.
#15
Отправлено 16 октября 2013 - 15:07
а можно подробностей? Что за батник, как генеришь, что он в тесткомплите делает?Я решил по другому как делать.
Помимо интеграции логов, я еще генерю батник из самого Тест Комплита который потом открывается Тим Сити, и вуаля.
#16
Отправлено 18 октября 2013 - 12:23
а можно подробностей? Что за батник, как генеришь, что он в тесткомплите делает?
Я решил по другому как делать.
Помимо интеграции логов, я еще генерю батник из самого Тест Комплита который потом открывается Тим Сити, и вуаля.
Батник нужен что-бы отображать количество пройденных и провалиных тестов сразу на главной странице Тим Сити, в строке с билдом.
сначала написал функцию:
function runTestCasesWithTeamCityReport(testName, testFunction) { logFile.WriteLine("echo ##teamcity[testStarted name='" + testName + "']"); testFunction(); logFile.WriteLine("echo ##teamcity[testFinished name='" + testName + "']"); }
где соответственно:
var logFile = FSO.CreateTextFile("C:\\logfile.bat", true);
Например есть Тест который логинится куда то:
runTestCasesWithTeamCityReport("Login using FB account", function() {_Login_via_Facebook_Test_acc(); });
После прохождения всех тестов, сгенерированый батник запускается тим сити (один из шагов билд степа)
в результате все тесты будут показаты в строке билда, таким вот образом
2013-10-18_1521.png 5,37К 14 Количество загрузок:
#17
Отправлено 20 октября 2013 - 08:14
Ага, мои трансформации делают тоже самое. :) В тимсити для каждого теста посылается типа такогоБатник нужен что-бы отображать количество пройденных и провалиных тестов сразу на главной странице Тим Сити, в строке с билдом.
##teamcity[testStarted name='Normal_Search.Search(UsersTests_SearchUserTest)'] ##teamcity[testFinished name='Normal_Search.Search(UsersTests_SearchUserTest)' duration='288000']И формируется вот такая строка для всего запуска.
##teamcity[buildStatus status='SUCCESS' text='{build.status.text} (Warnings: 0; Errors: 0)']Я только решил не заморачиваться с кастомным логированием, имхо так проще :)
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных