Какие коды успешного выхода из tSQLt

Я пытаюсь интегрировать tSQLt / SQLTest с CruiseControl.NET. Мои тесты выполняются, и я написал файлы xsl для отображения результатов, но мне нужно знать, как пометить сборку как неудачную, если какие-либо тесты не пройдут.

Мой исполнитель CCNet:

<exec executable="$(sqlCmdPath)">
    <description>Run Unit Tests</description>
    <buildArgs>-E -d MyDatabase 
       -i "\CruiseControlProjects\Configuration\CI_SQL\RunTests.sql"
    </buildArgs>
    <baseDirectory>\Artifacts\MyDatabase</baseDirectory>
    <successExitCodes>0,63</successExitCodes>
</exec>

RunTests.sql:

IF EXISTS (SELECT * FROM sys.objects WHERE OBJECT_ID = OBJECT_ID(N'[tSQLt].[RunAll]')
AND TYPE IN (N'P',N'PC'))
BEGIN
EXECUTE [tSQLt].[RunAll]
END

Тесты запущены, и у меня есть следующая задача, которая выдает результаты в xml, которые затем объединяются в журнал сборки:

<exec executable="$(sqlCmdPath)">
    <description>Get Unit Tests</description>
    <buildArgs>-E -b -d MyDatabase -h-1 -y0 -I 
       -i "\CruiseControlProjects\Configuration\CI_SQL\GetTestResults.sql" 
       -o "\CruiseControlProjects\Configuration\CI_SQL\Results\TestResults.xml"
    </buildArgs>
    <baseDirectory>\Artifacts\MDatabase</baseDirectory>
    <successExitCodes>0,63</successExitCodes>
</exec>

Итак, как мне добиться отказа всей сборки?


person Simon Martin    schedule 06.12.2012    source источник


Ответы (1)


Если вы используете параметр -b для sqlcmd, вы должны обнаружить, что выдаст ошибку с ненулевым кодом при сбое пакета (что произойдет, если tSQLt не пройдет хотя бы один тест).

Однако у меня есть одно потенциальное предложение для изучения. Если вы можете загрузить XML-файл в круиз-контроль, тогда тесты можно будет загрузить, поскольку XML-файл имеет тот же формат, что и выходной файл теста nUnit. (Примечание. Я использовал этот метод на TeamCity и Jenkins, но не с круиз-контролем). Это будет рассматривать тесты как тесты, а не как подход «все или ничего», и позволит вам отслеживать, какие тесты терпят неудачу повторно.

Надеюсь, это поможет,

Дэйв.

person DaveGreen    schedule 07.12.2012
comment
В частности, w.r.t. код ошибки со страницы MSDN, указанной выше - значение, возвращаемое переменной DOS ERRORLEVEL, равно 1, когда сообщение об ошибке SQL Server имеет уровень серьезности выше 10; в противном случае возвращается значение 0. .... Пакетные файлы командной строки могут проверять значение ERRORLEVEL и соответствующим образом обрабатывать ошибку. sqlcmd не сообщает об ошибках с уровнем серьезности 10 (информационные сообщения). Если сценарий sqlcmd содержит неправильный комментарий, синтаксическую ошибку или отсутствует переменная сценария, возвращается значение ERRORLEVEL, равное 1. - person DaveGreen; 07.12.2012
comment
С параметром -b на шаге Run Unit test, если какой-либо тест завершился неудачно, вся сборка прерывается, что означает, что XML не создается и слияние не происходит. Итак, я снова вытащил параметр, и xml создается и объединяется, но сборка говорит, что она успешна, когда есть 2 неудачных теста - person Simon Martin; 07.12.2012
comment
Я объединяю сгенерированный XML (когда нет параметра -b), мне нужно было настроить XSL-файл NUnit, так как структура немного отличается, но я могу видеть результаты в журнале сборки и в настраиваемом BuildReportPlugin, который мне пришлось создать. Когда вы сказали, что тесты можно загрузить в круиз-контроль, вы это имели в виду? - person Simon Martin; 07.12.2012
comment
По сути, да, я имел в виду именно это. Я не знаком с круиз-контролем в деталях (как я уже отмечал выше, я больше привык к другим системам CI). Тем не менее, если вы хотите, чтобы сборка запускала все тесты, но только затем помечала их как неудачные, вы можете попробовать что-то похожее на процесс, описанный [здесь] (confluence.public.gotitworks.org/display/CCNET/). Я думаю, что выполнение тестов аналогично запуску nUnit, поскольку указанная выше ссылка работает. Затем вы можете загрузить результаты по мере их загрузки. Обратите внимание, что тест сбоя затем перемещается за пределы раздела exec. - person DaveGreen; 08.12.2012
comment
К сожалению, собственный синтаксис сборки CCNet (т.е. Not NAnt), насколько я могу судить, не предоставляет вариант отказа, который я мог бы использовать cruisecontrolnet.org/projects/ccnet/wiki/. Поскольку задача exec просто запускает команду sql, а не специальную задачу tsqlt (поскольку есть блоки задач nunit / ncover), возможно, нет кода успеха / ошибки? - person Simon Martin; 11.12.2012
comment
Я понимаю вашу точку зрения. Вот альтернативная идея, основанная на этом сообщении автора tSQLt Денниса - Почему бы не сделать третий шаг, который проверяет содержимое результатов теста, запускает что-то вроде sqlcmd -b -d MyDatabase -Q "IF EXISTS (select * from tSQLt.TestResult where Result != 'Success') RAISERROR ('Errors encountered',16,1)" - тогда это приведет к ошибке (errorlevel = 1), если тесты завершились неудачно или с ошибками, но я считаю, что это не препятствует созданию вывода и объединению в вывод сборки. Если отказов не обнаружено, errorlevel = 0. - person DaveGreen; 12.12.2012