如何获得“复制到输出目录”以使用单元测试?

当我在执行测试之前构建单元测试项目时,测试输出被复制到TestResults文件夹,然后执行测试 . 我遇到的问题是并非Debug / bin目录中的所有文件都被复制到TestResults项目中 .

如何将复制到Debug / bin目录的文件也复制到TestResults文件夹?

回答(11)

2 years ago

执行此操作的标准方法是在 .testrunconfig 文件中指定deployment items,可以通过Visual Studio Test 菜单或“解决方案项目”文件夹中的“编辑测试运行配置”项来访问该文件 .

2 years ago

您可以指定部署属性,如下所示的示例;此外,您还需要设置“内容”和“复制如果更新”属性(没有关于以后设置的文档,但您已设置这些以使其工作 .

[TestMethod]
[DeploymentItem("mytestdata.xml")]
public void UploadTest()
{



}

2 years ago

我必须在 Test -> Edit Test Settings -> Local -> Deployment 下打开"Enable Deployment"才能使用 [DeploymentItem] 属性 .

2 years ago

根据您的需要,所有三个答案都是正确的 .

添加要在.testrunconfig中部署的文件(VS2010中的.testsettings)会将所有这些文件复制到每个测试输出文件夹,即使是隔离运行的不相关测试也是如此 . 如果运行一个测试,则会将.testssettings部署部分中列出的所有测试数据文件复制到测试输出文件夹中 .

在我的测试中,我需要将预期的XML文件复制到测试输出文件夹,以与实际的测试输出XML进行比较 . 我使用DeploymentItem属性仅复制与正在运行的测试相关的XML文件 . 在VS2010中,我必须在.testsettings文件中启用部署(但不添加任何路径),然后引用相对于DeploymentItem中的TestProject的XML文件路径 .

希望这可以帮助 .

2 years ago

我有一个类似的问题,但我的指向TraceAndTestImpact.testsettings文件而不是Local.testsettings文件 . 您可以在“测试/选择活动测试设置”菜单下从一个更改为另一个 .

2 years ago

以下在VS2012中适用于多个解决方案中包含的测试项目,而不使用testsettings文件:

1)将要部署的文件和文件夹排列到测试项目目录中的文件夹中 .

2)在项目属性中,创建一个后期构建步骤

xcopy /Y /S /i "$(ProjectDir)<Project_Folder_Name>\*" "$(TargetDir)<Deployment_Folder_Name>"

$(ProjectDir)$(TargetDir) 是将由VS解释的宏,应该包含在内 .

<Project_Folder_Name> 是在步骤1中创建的文件夹的名称 .

<Deployment_Folder_Name> 是将在其中部署测试文件的文件夹的名称,并且应该进行命名,以便在将多个测试项目部署到同一目录时它是唯一的,例如, <Project_Name>_TestInputs .

还应将共享位置中的测试文件复制到目标目录部署文件夹以限制测试交互 . 提供相对于 $(ProjectDir) 宏的源路径 . 例如 "$(ProjectDir)..\..\Common Files\C1219TDL-2008.xml" .

3)将 [DeploymentItem(source, destination)] 属性添加到使用部署文件(最佳实践)的每个测试方法或测试类(更容易练习懒惰或匆忙,以及更新项目以前使用的相对路径或测试设置的最简单方法)文件) .

在测试方法上, source 是测试方法中使用的文件或目录相对于目标目录的路径,由 xcopy 创建, destination 是相对于部署目录创建目录的路径的路径 . 因此,测试在目标目录或部署目录中运行一致 . 目标路径应与没有文件引用的源路径相同 . 示例: [DeploymentItem("Example_TestInputs\C1219TDL-2008.xml","Example_TestInputs")] . DeploymentItem 应该包含在使用该文件或目录的每个方法中 .

在类上, sourcedestination 都是 xcopy 在目标目录中创建的文件夹的名称;这将在运行类中的任何测试时将整个文件夹复制到部署目录 . 示例: [DeploymentItem("Example_TestInputs","Example_TestInputs")]

4)在测试方法中,您现在可以放心地访问文件和目录,无论Visual Studio当天决定将它放在哪里,它们都将位于工作目录中,例如, File.Exists(".\Example_TestInputs\C1219TDL-2008.xml") .

2 years ago

想要通过提及一种方法来增强接受的答案,让它专门为dll部署,而不是将其用于数据或配置等的常规方法,因为CopyLocal不起作用的情况:

[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]

2 years ago

从Visual Studio中试用Post-Build事件命令行(如果你正在使用该IDE) .

2 years ago

在Visual Studio 2012中,简单大小写不需要DeploymentItem属性 . 看我的回答here

2 years ago

[TestMethod]
[DeploymentItem("ProjectName/Folder/SubFolder/file.xml", "Folder/Subfolder")]
public void YourTestMethod()
{
   // in the method you are testing you should have this:
   var filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) + "/Folder/Subfolder/file.xml";
}

2 years ago

接受的答案是正确的,大多数其他答案也是如此 . 但是,多年来我发现如果你有大量的数据文件,那么使用DeploymentAttribtue和Copy to Output的Visual Studio单元测试的Deploment系统会很麻烦 . 我发现将文件保存在原始位置的效果更好 .

我在这里的其他答案的全部细节 . https://stackoverflow.com/a/53004985/2989655

希望这可以帮助 .