Еще один способ задуматься над вопросом. Чтобы объединить два или более массивов, нужно составить список всех элементов каждого массива, а затем построить новый массив. Это звучит как создать List<T>
, а затем вызывает toArray
для него. Некоторые другие ответы используют ArrayList
, и это нормально. Но как насчет реализации нашего? Это не сложно:
private static <T> T[] addAll(final T[] f, final T...o){
return new AbstractList<T>(){
@Override
public T get(int i) {
return i>=f.length ? o[i - f.length] : f[i];
}
@Override
public int size() {
return f.length + o.length;
}
}.toArray(f);
}
Я полагаю, что вышеупомянутое эквивалентно решениям, которые используют System.arraycopy
. Однако я думаю, что у этого есть своя собственная красота.
Я бы просто написал цель, которая вызывает ее так, как вы хотите, а затем создаю пакетный файл, который вызывает цель, содержащую все тестируемые DLL.
Если вы не добавляете тестовые проекты все время, вам очень редко придется его изменять.
Почему бы просто не заставить msbuild вывести все тестовые сборки в папку.
Попробуйте установить свойства OutputPath, OutputDir, OutDir в msbuild для этого.
затем запустите mstest для всех сборки в этой папке.
Чтобы уточнить ответ ВладВ и сделать его немного более конкретным, следуя предложенному соглашению об именах, выполнение ваших тестов можно легко автоматизировать с помощью 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>
You could enforce some convention on the naming and location of test projects, then you could run MSTest on, say, all *Test.dll below the location of your solution.
As far as I know, there is no way to tell a test project from a 'normal' DLL project based soleley on a solution file. So, an alternative could be to analyze the project files and/or .vsmdi files to find the test projects, but that could be rather tricky.
Я не знаю напрямую, но здесь VSMDI [fx: плюется в угол] может помочь. В своем решении добавьте все тесты в VSMDI. А затем передайте VSMDI в mstest, используя /testmetadata.[1283 impression, однако я бы посоветовал вам следовать приведенным выше соглашениям. И используйте соглашение об именах и выгрузите его из файла SLN, используя, скажем, цикл for в командном сценарии
Я знаю, что эта тема довольно старая, но она все еще высоко в Google, поэтому я подумал, что смогу помочь одному или двум. В любом случае, поскольку нет удовлетворительного решения для этого. Я написал задачу msbuild для этого. Подробности можно найти здесь: http://imistaken.blogspot.com/2010/08/running-all-tests-in-solution.html