MSTest скопируйте файл в папку тестового запуска

108

У меня есть тест, который требует, чтобы XML-файл был прочитан, а затем проанализирован. Как мне каждый раз копировать этот файл в папку тестового запуска?

Для XML-файла установлено значение «Копировать, если новее», а режим компиляции - «нет» (так как на самом деле это не компилируемая вещь)

Аарон Пауэлл
источник

Ответы:

131

использовать DeploymentItemатрибут

using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using CarMaker;

namespace DeploymentTest
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod()]
        [DeploymentItem("testFile1.xml")]
        public void ConstructorTest()
        {
            string file = "testFile1.xml";
            Assert.IsTrue(File.Exists(file), "deployment failed: " + file +
                " did not get deployed");
        }
    }
}
Preet Sangha
источник
17
Атрибут DeploymentItem также можно указать на уровне класса, чтобы повлиять на каждый тест в классе.
Ханнес Нел
24
Не забывайте, что если у вас есть элементы в подпапке, вы также должны включить их в подкаталог развертывания [DeploymentItem ("SubFolder \ testFile1.xml", "SubFolder")]
omgtitb 02
31
В дополнение к комментарию Томаса, значением по умолчанию для RelativePathRoot является папка решения, поэтому, если ваше решение выглядит так (.. \ SolutionFolder \ TestProject \ TestData \ aFile.txt), ваш DeploymentItem будет выглядеть так .. ([DeploymentItem (@ "TestProject \ TestData \ aFile.txt", "TestData")]) .. и вы могли бы ссылаться на файл в тесте, используя это .. (string file = @ "TestData \ aFile.txt";)
Майкл Даусманн,
6
Документация DeploymentItemAttribute для VS2010 : этот атрибут можно указать в тестовом методе или в тестовом классе.
Alex Che
12
В большинстве сообщений, которые я видел, не упоминается, что если вы не можете заставить это работать, вам, вероятно, нужно установить флажок «Включить развертывание», который вы можете найти, перейдя в Test -> Edit Test Settings -> local (local.testsettings) -> вкладка Развертывание. Я просто сделал это, и тогда DeploymentItem заработало нормально.
Дэйв
26

Похоже, что если вы предоставите файл TestSettings для решения, вы можете снять флажок с опции «Включить развертывание» и остановить mstest от попытки запуска из ...TestResults\...\outпапки, в которую он не копирует ваши дополнительные файлы (если вы не сделаете их вариантом развертывания) .

Это также полезно, если вы полагаетесь на то, что дополнительные файлы находятся в сохраненной структуре папок, потому что все элементы развертывания кажутся скопированными напрямую (плоскими) во временную папку запуска (вне), если вы используете параметр Развертывание, добавить папку в TestSettings ( ответы выше предполагают, что вы можете сохранить структуру, если добавите каждый элемент в качестве собственного DeploymentItem).

Для меня он отлично работал, выполняя тесты непосредственно в Visual Studio (т.е. мои лишние файлы в их структуре были найдены и использованы тестами), потому что я уже давно создал файл TestSettings по другой причине (в которой параметр Включить развертывание не отмечен), но не тогда, когда TeamCity запустил mstest для запуска тестов, потому что я не указал, что следует использовать файл TestSettings.

Чтобы создать файл TestSettings в Visual Studio, щелкните правой кнопкой мыши решение, выберите «Новый элемент» и выберите шаблон TestSettings. Чтобы использовать файл TestSettings в командной строке mstest.exe, добавьте параметр /testsettings:C:\Src\mySolution\myProject\local.testsettings (или добавьте в качестве дополнительного параметра командной строки в TeamCity с соответствующим путем)

TamW
источник
3

Лучшее решение для меня - использовать настройки тестирования, особенно если нескольким тестам нужны одни и те же файлы данных.

Сначала создайте файл testsettings и добавьте необходимые элементы развертывания (имя файла или папки):

<TestSettings name="Local" id="00ebe0c6-7b64-49c0-80a5-09796270f111" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <Description>These are default test settings for a local test run.</Description>
  <Deployment>
    <DeploymentItem filename="Folder1\TestScripts\test.xml" outputDirectory="TestScripts"/>
    <DeploymentItem filename="Folder2\TestData\" outputDirectory="TestData"/>
  </Deployment>
<...../>
  • При запуске в Visual Studio используйте «Выбрать файл настроек теста» в меню «Тест \ Настройки теста», чтобы выбрать новые настройки теста.

  • Запустив mstest, используйте параметр / testsettings, чтобы mstest использовал ваши testsettings.

ФрэнкиГолливуд
источник
2

Вы можете определить DeploymentItem в классе, который содержит метод с атрибутом AssemblyInitialize. Тогда вы уверены, что файлы копируются независимо от того, какой тест вы запускаете.

К сожалению, атрибут DeploymentItem выполняется только в классах, которые содержат тесты, которые вы выполняете. Итак, если у вас есть 10 тестовых классов, которые используют один и тот же набор файлов, вам нужно добавить атрибут ко всем из них.

Также выяснилось, что изменения в файлах * .testsettings не обновляются автоматически в Visual Studio. Поэтому после добавления файлов / папок в развертывание в настройках теста вам необходимо повторно открыть файл решения, а затем запустить тесты.

Сиелу
источник
2

В Visual Studio 2012 vstest.console.exe (встроенный инструмент запуска тестов) запускается с выходным каталогом в качестве текущего пути. Это означает, что вам нужно только включить элементы в свое решение с помощью свойства «Копировать всегда» или «Копировать, если новее», чтобы они использовались в вашем тесте. В общем случае атрибут DeploymentItem не нужен. То же самое применимо при запуске vstest.console.exe из командной строки в каталоге output / test.

В некоторых случаях используется отдельная папка, в том числе при использовании атрибута DeploymentItem. См. Здесь для получения дополнительной информации.

акарлон
источник