MSTest и проблема app.config - PullRequest
       21

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

34 голосов
/ 27 января 2011

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

Попытка 1

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

Попытка 2

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

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

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


РЕДАКТИРОВАНИЕ / РАЗРЕШЕНИЕ: По умолчанию 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);

Ответы [ 3 ]

6 голосов
/ 27 января 2011

Kateroh,

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

  1. Build sln

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

  3. Запустить mstest с параметрами:

"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>


5 голосов
/ 27 января 2011

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


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

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

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

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

2 голосов
/ 28 января 2011

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

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

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

...