Подтвердить что ты не робот

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

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

Я надеюсь, что это возможно, потому что в 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>
4b9b3361

Ответ 1

Чтобы уточнить ответ 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 - это кусок пирога.

Edit
Здесь, как вы можете "вызывать" 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>

Ответ 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) останавливается при первой ошибке, когда команда возвращает ненулевое значение. Поэтому, если какие-либо тесты модулей не работают, он не будет продолжать выполнять какие-либо тесты в последующих сборках. Это не здорово, но если все тесты пройдут, то все они будут выполняться.

Ответ 3

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

  • Сначала вы должны создать тестовый список в файле testmetadata (vsmdi)
  • командная строка должна быть mstest /testmetadata:....vsmdi /testlist:<name>
  • Затем используйте ccnet config для запуска mstest

Ответ 4

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

Ответ 5

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

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

Ответ 6

Я не знаю напрямую, но это может помочь VSMDI [fx: spits in a corner]. В своем решении добавьте все тесты в VSMDI. А затем передайте VSMDI в mstest с использованием /testmetadata.

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

Ответ 7

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

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

Ответ 8

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

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

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