Почему MSTest DeploymentItem дает сбой при запуске всех тестов в решении? - PullRequest
11 голосов
/ 09 мая 2011

У меня есть решение Visual Studio 2010 с несколькими проектами MSTest. Для запуска одного из тестовых проектов необходим файл в определенном каталоге.

[TestClass]
[DeploymentItem("ReportEngine.config")]
[DeploymentItem("Report Files", "Report Files")]
public class MyReportTests { }

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

Почему есть разница, и как сделать так, чтобы на двух прогонах были развернуты одни и те же элементы?

Ответы [ 4 ]

4 голосов
/ 26 мая 2011

Я изначально дал вам инструкции, чтобы убедиться, что Развертывание было включено в ваших настройках теста. Вы сказали, что это было.

Убедитесь, что у вас включено развертывание для тестового запуска.

  1. Отредактируйте .testsettings в папке «Элементы решения»
  2. Выберите категорию развертывания
  3. Установите флажок «Включить развертывание»
  4. Нажмите «Применить» и «Закрыть»

Однако с тех пор, как я отвечал в прошлый раз, я узнал, что атрибут DeploymentItem предназначен только для методов (и, похоже, он работает только на TestMethod s). Это никогда не могло бы работать так, как вы украшаете class. Я также заметил ваш комментарий к вашему вопросу (отредактировано для грамматики)

Да, элементы установлены на Copy Always, иначе DeploymentItem в тестовом прогоне проекта не сработает.

Существует много дискуссий , нужно ли это или нет, чтобы DeploymentItem работало. Я подозреваю, что что-то, что мы еще не определили, заставляет тесты проходить при запуске их из проекта. Удалите DeploymentItem s полностью и попробуйте выполнить два теста (из проекта и из решения) и посмотрите, какие результаты вы получите.


В случае, если элементы развертывания работают, несмотря на документацию

Убедитесь, что ReportEngine.config и ReportFiles\ находятся там, где вы и MSTest ожидаете их. Относительные пути к файлам разрешаются, начиная с «RelativeRootPath». По умолчанию это $(SolutionDir). Если вы не переопределите это в testsettings. Пожалуйста, проверьте это.

Но по умолчанию

[DeploymentItem("ReportEngine.config")]

расширен до чего-то вроде

[DeploymentItem("$(SolutionDir)\ReportEngine.config")]

затем, например, до

[DeploymentItem("D:\code\my-project\ReportEngine.config")]
1 голос
/ 27 мая 2011

Элементы развертывания, как известно, ненадежны ... Рассматривали ли вы вопрос об использовании MSBuild и редактировании файла .csproj вашего тестового проекта напрямую?

<Target Name="AfterBuild">
  <CallTarget Targets="DeployReportFiles" />
</Target>

<Target Name="DeployReportFiles">
  <CreateItem Include="$(SolutionDir)\Report Files\**\*">
    <Output TaskParameter="Include" ItemName="OutputFiles" />
  </CreateItem>
  <Copy SourceFiles="@(OutputFiles)"
        DestinationFiles="@(OutputFiles->'$(???)\Report Files\%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>

Я не знаю, содержит ли MSBuild переменную для текущего тестового каталога ... поскольку она, похоже, не участвует в процессе.

0 голосов
/ 13 мая 2018

Может быть, тестовый пример перемещает / удаляет файл? Согласно статье MSDN "Как: развернуть файлы для тестов" файлы развертываются только один раз:

Когда вы выбираете набор тестов для запуска, все элементы, указанные в их атрибутах DeploymentItem, копируются до запуска теста.

0 голосов
/ 09 октября 2012

Кажется, Microsoft не решит проблему.

...