MSTest复制文件以测试运行文件夹


108

我有一个测试,要求读取XML文件然后进行解析。每次如何将这个文件复制到测试运行文件夹中?

XML文件设置为“如果更新则复制”,并将编译模式设置为“无”(因为它实际上不是可编译的东西)

Answers:


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");
        }
    }
}

17
还可以在类级别上指定DeploymentItem属性,以影响该类中的每个测试。
Hannes Nel

24
不要忘记,如果您的项目位于子文件夹中,并且也要将该项目包含在部署子目录[DeploymentItem(“ SubFolder \ testFile1.xml”,“ SubFolder”)]
omgtitb 2011年

31
除了Thomas的评论,RelativePathRoot的默认值是解决方案文件夹,因此,如果您的解决方案如下所示(.. \ SolutionFolder \ TestProject \ TestData \ aFile.txt),您的DeploymentItem将会如下所示。.([[DeploymentItem(@ “” TestProject \ TestData \ aFile.txt“,” TestData“)])..,则您将使用this ..(字符串文件= @” TestData \ aFile.txt“;)引用测试中的文件
Michael Dausmann

6
VS2010的DeploymentItemAttribute文档可以在测试方法或测试类上指定此属性。
Alex Che

12
我看到的大多数帖子都没有提到,就是如果您无法使它正常工作,则可能需要选中“启用部署”复选框,如果您转到“测试”->“编辑测试设置”->“本地(local.testsettings)->部署选项卡。我只是这样做,然后DeploymentItem工作正常。
戴夫

26

看来,如果您为解决方案提供了TestSettings文件,则可以取消选中“启用部署”选项,并阻止mstest ...TestResults\...\out从不复制多余文件的文件夹中运行(除非您将它们设为部署选项) 。

如果您依赖于保留在文件夹结构中的额外文件,这也很有用,因为如果您使用TestSettings中的Deployment,Add Folder选项,部署项目似乎都直接复制(平放)到临时运行文件夹中(向外)。如果您将每个项目添加为自己的DeploymentItem,则以上答案建议您可以保留结构。

对我来说,它可以直接在Visual Studio中正常运行测试(即,我的结构中的多余文件已找到并由测试使用),因为我很早以前出于另一个原因(未选中启用部署)创建了TestSettings文件,但在TeamCity时却没有运行mstest来运行测试,因为我没有指定应使用TestSettings文件。

要在Visual Studio中创建TestSettings文件,请在解决方案上单击鼠标右键,然后选择“新建项目”,然后选择TestSettings模板。要在mstest.exe的命令提示符下使用TestSettings文件,请添加选项,/testsettings:C:\Src\mySolution\myProject\local.testsettings (或在TeamCity中添加具有适当路径的附加命令行选项)



3

对我来说最好的解决方案是使用测试设置,特别是如果多个测试需要相同的数据文件时。

首先创建一个测试设置文件,然后添加所需的部署项(文件或文件夹名称):

<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使用您的测试设置。


2

您可以在一个类中定义DeploymentItem,该类包含具有AssemblyInitialize属性的方法。然后,无论运行哪种测试,都可以确保文件已复制。

不幸的是,DeploymentItem属性仅在包含您正在运行的测试的类上执行。因此,如果您有10个使用相同文件集的测试类,则必须将属性添加到所有文件中。

还发现* .testsettings文件中的更改不会在Visual Studio中自动刷新。因此,在将文件/文件夹添加到测试设置中的部署中之后,您必须重新打开解决方案文件,然后运行测试。


2

在Visual Studio 2012中,vstest.console.exe(内置测试运行器)以输出目录作为当前路径运行。这意味着您只需将解决方案中的项目包括“始终复制”或“如果更新则复制”属性,即可将其用于测试。一般情况下,您不需要DeploymentItem属性。从output / test目录中的命令行运行vstest.console.exe时,也是如此。

在某些情况下,使用单独的文件夹,其中一种是在使用DeploymentItem属性时。有关更多信息,请参见此处

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.