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

Проблема MSTest и app.config

Я застреваю, пытаясь автоматизировать тесты единичных тестов с MSTest и развертывание app.config. Я прочитал несколько сообщений и блогов, попробовал несколько вещей, и все же app.config, похоже, не подбирается во время выполнения MSTest. Имея DLL, которая содержит все мои модульные тесты, созданные с помощью msbuild, вот что я пробовал...

Попытка 1

  • Скопированный app.config в том же месте с MyTests.dll как MyTests.dll.config(на одном из форумов msdn было сказано, что оно будет автоматически загружено)
  • Добавлен атрибут [DeploymentItem("MyTests.dll.config")] для каждого теста
  • Ran MSTest.exe /noisolation /testcontainer:d:\MyTestTests.dll /test:MyTest

Попытка 2

  • Создан файл local.testrunconfig со следующим содержимым (ниже)
  • Ran mstest с /runconfig и без изоляции, но ничего не было выполнено: MSTest.exe /runconfig:d:\local.testrunconfig /testcontainer:d:\MyTestTests.dll /test:MyTest

Результат: Загрузка d:\local.testrunconfig...
d:\local.testrunconfig
d:\local.testrunconfig

... и ничего не происходит: ошибок нет, никаких тестов не выполняется!


EDIT/RESOLUTION: По умолчанию MSTest выполняет тесты в отдельных процессах. В этом случае файл конфигурации автоматически подбирается, если он называется "dllname.dll.config". Тем не менее, трудно отлаживать тесты, выполняемые в отдельных процессах, если они работают за пределами VS./noisolation используется для того, чтобы MSTest выполнял все тесты в одном процессе. Однако в этом случае тестовый файл конфигурации NOT выбран. Вместо этого используется файл MSTest.exe.config, который находится в том же каталоге, что и MSTest. Чтобы устранить эту проблему, файл конфигурации можно загрузить прагматически следующим образом:


ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = @"path to config file";
Configuration config = 
   ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
4b9b3361

Ответ 1

Kateroh,

Моя настройка выглядит так (я использую msbuild из TFSbuild.proj):

  • Сборка sln

  • Скопировать все из вывода в% TEMP% (черная магия: D) Не знаю, почему, но mstest ищет ссылки в% TEMP%.

  • Запустите mstest с помощью parms:

"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe" /nologo /testcontainer:$(TestDir)\mylib.dll /resultsfile:$(TestResultFile) /runconfig:$(SlnDir)\AutomaticBuildTest.testrunconfig /searchpathroot:$(TestDir) /publish:mytfsserver /publishbuild:$(BuildDefinition) /flavor:Debug /platform:AnyCPU /teamproject:mytfsproject

где ниже приведен параметр AutomaticBuildTest.testrunconfig


<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="AutomaticBuildTest" id="eda99352-93e1-402e-9517-d04fffa66b35" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
    <!--<Deployment enabled="false" />-->
    <Deployment enabled="true">
        <DeploymentItem filename="D:\sa12\78\bin\Debug" />
    </Deployment>
    <NamingScheme baseName="BC2ALibraryTest" appendTimeStamp="false" useDefault="false" />
    <!-- http://blogs.msdn.com/b/vstsqualitytools/archive/2009/12/01/executing-unit-tests-in-parallel-on-a-multi-cpu-core-machine.aspx -->
    <Execution location="Local" hostProcessPlatform="MSIL">
        <!--http://msdn.microsoft.com/en-us/library/ms404663.aspx-->
        <ExecutionThread apartmentState="MTA" />
        <Hosts skipUnhostableTests="false" />
        <TestTypeSpecific>
            <UnitTestRunConfig testTypeId="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b">
                <AssemblyResolution applicationBaseDirectory="D:\sa12\78\bin\Debug">
                    <TestDirectory useLoadContext="false" />
                </AssemblyResolution>
            </UnitTestRunConfig>
        </TestTypeSpecific>
        <AgentRule name="LocalMachineDefaultRole">
        </AgentRule>
    </Execution>
</TestSettings>


Ответ 2

В вашем приложении не используется app.config. Он использует application.exe.config. Это то, что вам нужно развернуть.


Извините, не видел, что вы тестировали DLL.

Это не так, как работает конфигурация .NET. Каждая DLL не использует собственный файл конфигурации. Он может использовать только файл конфигурации .exe, в котором он запущен (фактически, из AppDomain, в котором он запущен).

Вам нужно как-то заставить MSTEST добавить ваш .dll.config в свою собственную конфигурацию, предполагая, что это фактически хост-процесс. Я не вижу, как это сделать из командной строки.

Обычно я использую проект Unit Test в Visual Studio, поэтому я просто развертываю конфигурационный файл из этого проекта. Прекрасно работает.

Ответ 3

Проблема заключается, как выясняется, в нашей сложной строительной среде и в том, что мы используем и x-копирующую версию MSTest (производимую локально). Следующая команда преуспела, когда я побежал против VS2008 "правильный" MSTest:

"%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE\MSTest.exe" /testcontainer:d:\MyTests.dll /test:MyTests /resultsfile:results.trx

Спасибо всем за ответы! Проверка идет к вам, Мариус, вы заставляли меня изучать новые вещи с помощью tesrunconfig.