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

本文关键字:单元测试 输出 复制 | 更新日期: 2023-09-27 17:47:22

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

如何获取复制到 Debug/bin 目录的文件,以便也复制到 TestResults 文件夹?

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

执行此操作的标准

方法是在.testrunconfig文件中指定部署项,可以通过 Visual Studio 测试菜单或"解决方案项"文件夹中的"编辑测试运行配置"项进行访问。

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

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

}

我必须在Test -> Edit Test Settings -> Local -> Deployment下打开"启用部署"才能使[DeploymentItem]属性正常工作。

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

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

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

希望这有帮助。

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

以下内容在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)] 属性添加到使用部署文件的每个测试方法(最佳实践)或测试类(懒惰或匆忙的人更容易练习,以及更新项目以前使用的相对路径或testsettings文件的最简单方法)。

在测试方法上,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") .

只想通过提及一种使其专门为 dll 部署的方法来增强公认的答案,而不是将其用于数据或配置等的正常方法,适用于 CopyLocal 不起作用的情况:

[DeploymentItem("bin''release''iRock.dll")]
[DeploymentItem("bin''debug''iRock.dll")]
[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";
}

从Visual Studio中试用后期生成事件命令行(如果您使用的是该IDE)。

在 Visual Studio 2012 中,对于简单情况,您不需要 DeploymentItem 属性。在这里查看我的答案

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

我在这里的另一个答案中有完整的细节。https://stackoverflow.com/a/53004985/2989655

希望这有帮助。