2009-07-17 3 views
20

Мне нужно знать, как сообщить MSTEST о запуске всех тестовых проектов в файле решения. Это нужно сделать из командной строки. Сейчас я должен передать ему конкретный файл проекта, я пытаюсь запустить его из файла SOLUTION.Как сообщить MSTEST о запуске всех тестовых проектов в решении?

Я надеюсь, что это возможно, потому что в Visual Studio нажатие Ctrl + R, A запускает ВСЕ тесты в открывшемся в настоящее время решении.

То, как я интерпретировал файлы справки, вам необходимо передать в каждой DLL специально.

Я хочу запустить это из командной строки с моего сервера CruiseControl.NET, поэтому я могу написать другие утилиты, чтобы это произошло. Если есть странный способ заставить это произойти с помощью какого-то ДРУГОГО метода, дайте мне знать.

Как сообщить MSTEST о запуске всех тестовых проектов для решения?

<exec> 
    <!--MSTEST seems to want me to specify the projects to test --> 
    <!--I should be able to tell it a SOLUTION to test!--> 
    <executable>mstest.exe</executable> 
    <baseDirectory>C:\projects\mysolution\</baseDirectory> 
    <buildArgs>/testcontainer:testproject1\bin\release\TestProject1.dll 
    /runconfig:localtestrun.Testrunconfig 
    /resultsfile:C:\Results\testproject1.results.trx</buildArgs> 
    <buildTimeoutSeconds>600</buildTimeoutSeconds> 
</exec> 
+0

Вы когда-нибудь это разрешили? Я не могу понять, как сделать «CreateItem» в CC.NET? – D3vtr0n

ответ

-1

я бы просто написать цель, которая называет его так, как вы хотите, а затем взбивать пакетный файл, который вызывает цель, которая содержит все DLL файлы должны быть проверены.

Если вы не добавляете тестовые проекты все время, вам очень редко придется его модифицировать.

+0

Мы добавляем тестовые проекты каждые 4-5 месяцев, ставя проект в «основное» решение для «автостроения» - уже привычка. Я пытаюсь свести к минимуму добавление дополнительных шагов для запоминания людьми. страшная вещь о тестировании заключается в том, насколько легко никогда не запускать тесты, которые вы написали. – Jeremiah

+0

Имеет ли каждый проект без тестирования один соответствующий тестовый проект? –

-1

Почему не просто msbuild выводит все тестовые сборки в папку.

Попробуйте установить параметры OutputPath, OutputDir, OutDir в msbuild для этого.

затем выполнить mstest для всех сборок в этой папке.

+0

проблема с этим - это тестовые сборки, которые находятся рядом с реальными сборками, которые они тестируют. отправляет mstest команду типа «* .dll». Я пытаюсь сделать этот процесс глупым, поэтому мы всегда тестируем проекты, которые мы добавляем. если мы добавим новый тестовый проект, который, вероятно, произойдет каждые 4-5 месяцев (достаточно короткий, чтобы забыть шаги), я хочу обработать, чтобы просто прочитать решение для тестовых проектов. – Jeremiah

+0

Суффикс ваших тестовых сборок с помощью .Test? – Ryu

0

Вы можете применить какое-либо соглашение о наименовании и расположении тестовых проектов, тогда вы можете запустить MSTest, скажем, все * Test.dll ниже местоположения вашего решения.

Насколько я знаю, нет способа рассказать тестовый проект из «нормального» проекта на основе DLL на файле решения. Таким образом, альтернативой может быть анализ файлов проекта и/или .vsmdi файлов для поиска тестовых проектов, но это может быть довольно сложно.

0

Не знаю напрямую, но это может помочь VSMDI [fx: плюется в угол]. В своем решении добавьте все тесты в VSMDI. И затем передайте VSMDI для использования с помощью/testmetadata.

Однако я предлагаю вам следовать вышеприведенным соглашениям. И используйте соглашение об именах и дамп из файла SLN, используя, например, цикл for в командном скрипте.

10

Чтобы уточнить ответ VladV и сделать что-то более конкретным, в соответствии с предлагаемым соглашением об именах, выполняющим ваши тесты, может быть легко быть автоматизированным с MSBuild. Следующий фрагмент из файла msbuild моего текущего проекта делает именно то, что вы просили.

<Target Name="GetTestAssemblies"> 
    <CreateItem 
     Include="$(WorkingDir)\unittest\**\bin\$(Configuration)\**\*Test*.dll" 
     AdditionalMetadata="TestContainerPrefix=/testcontainer:"> 
     <Output 
      TaskParameter="Include" 
      ItemName="TestAssemblies"/> 
    </CreateItem> 
</Target> 
<!-- Unit Test --> 
<Target Name="Test" DependsOnTargets="GetTestAssemblies"> 
    <Message Text="Normal Test"/> 
<Exec 
    WorkingDirectory="$(WorkingDir)\unittest" 
    Command="MsTest.exe @(TestAssemblies->'%(TestContainerPrefix)%(FullPath)',' ') /noisolation /resultsfile:$(MSTestResultsFile)"/> 
    <Message Text="Normal Test Done"/> 
</Target> 

Кроме того, интеграция MsBuild с CruiseControl - это кусок пирога.

Редактировать
Вот как можно «назвать» MSBuild из вашего ccnet.config.

Во-первых, если вы еще не используете MSBuild для автоматизации сборки добавьте следующий XML вокруг фрагмента кода, представленного ранее:

<Project DefaultTargets="Build" 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    ..... <insert snippet here> ..... 
</Project> 

Сохранить в, например, RunTests.proj рядом с вашим решением в исходном дереве. Теперь вы можете изменить немного ccnet.config выше следующее:

<msbuild> 
    <executable>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable> 
    <workingDirectory>C:\projects\mysolution\</workingDirectory> 
    <baseDirectory>C:\projects\mysolution\</baseDirectory> 
    <projectFile>RunTests.proj</projectFile> 
    <targets>Test</targets> 
    <timeout>600</timeout> 
    <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger> 
</msbuild> 
+0

Как и где вы включаете это в конфигурацию CruiseControl? Предоставляется ли этот код для выполнения сценария .build задачи NANT? Или этот XML переходит непосредственно в конфигурацию CC.NET? – D3vtr0n

+0

Хотелось бы, чтобы это был «кусок пирога». Я думаю, что это P.O.S. лично! Как вы это делаете в CruiseControl.NET?Оригинальный вопрос не спросил, как это сделать в MSBuild! – D3vtr0n

+0

@ Devtron расширил ответ, помогает ли это? –

1

я знаю, эта нить довольно старый, но все еще высоко на Google, так что я думал, что я мог бы помочь один или два. В любом случае, поскольку для этого нет удовлетворительного решения. Я написал для этого задачу msbuild. подробную информацию можно найти здесь: http://imistaken.blogspot.com/2010/08/running-all-tests-in-solution.html

+0

Это круто, и все, но как вы делаете эту работу в CruiseControl.NET? С задачей EXEC скомпилировать тесты? – D3vtr0n

2

Это старая нить, но я боролся с той же проблемой, и я понял, что вы действительно можете просто запустить MSTest на каждой DLL в целом решение и оно не действительно вызывают проблемы. MSTest ищет методы в сборках, отмеченных атрибутом [TestMethod], а сборки, которые не являются «тестовыми» сборками, просто не будут иметь методов, украшенных этим атрибутом. Таким образом, вы получаете «Нет тестов для выполнения». сообщение назад и никакого вреда.

Так, например, в NAnt вы можете сделать это:

<target name="default"> 
    <foreach item="File" property="filename"> 
     <in> 
      <items> 
       <include name="**\bin\Release\*.dll" /> 
      </items> 
     </in> 
     <do> 
      <echo message="${filename}" /> 
      <exec program="C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe"> 
       <arg value="/testcontainer: ${filename}" /> 
       <arg value="/nologo" /> 
      </exec> 
     </do> 
    </foreach> 
</target> 

и он будет работать все методы испытаний в каждой DLL в каждой папке Bin \ Release в растворе. Те, которые не являются тестовыми DLL, возвратят «Нет тестов для выполнения». и те, у которых есть тесты, проведут тесты. Единственная часть, которую я еще не выяснил, заключается в том, что выполнение (в NAnt) останавливается при первой ошибке, когда команда возвращает ненулевое значение. Поэтому, если какие-либо тесты модулей не работают, он не будет продолжать выполнять какие-либо тесты в последующих сборках. Это не здорово, но если все тесты пройдут, то все они будут работать.

+1

btw - способ заставить NAnt продолжать работать, даже если некоторые модульные тесты терпят неудачу, это поставить атрибут failonerror = "false" в задачу exec. Таким образом, все ваши тесты будут выполняться, даже если некоторые из них будут работать в одном проекте. Вы можете сохранить возвращаемые значения каждого тестового прогона в свойстве, а затем после всех тестов вы можете проверить это свойство, и если оно больше 0, вы можете выполнить его вручную следующим образом:

2

Я только что решил эту проблему недавно. Вот мое предложение: Используйте testmetadata + testlist вариант MSTest

  1. Сначала вы должны создать testlist в testmetadata файле (VSMDI)
  2. командная строка должна быть mstest /testmetadata:....vsmdi /testlist:<name>
  3. Затем используйте CCNET конфиг для запуска MSTest
+4

, но это означает, что вы должны поддерживать файл .vsmdi каждый раз, когда вы добавляете новый тест. – gbjbaanb

+0

Для чего его ценность, списки тестов устарели от VS2012. –

Смежные вопросы