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


123

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

如何获得复制到Debug / bin目录中的文件,也复制到TestResults文件夹中?

Answers:


121

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


15
在VS2010中,它是:测试/编辑测试设置/本地,然后在列表中选择“部署”,选中“启用...”框并添加文件。
马塞尔(Marcel)2010年

18
您可能必须关闭解决方案(甚至是Visual Studio),然后重新打开,此更改才能正确生效
RobV 2010年

RobV,你决定了我的一天。谢谢!
Ignacio Soler Garcia'2

2
如果在代码中使用[DeploymentItem]属性,则无需在对话框中指定文件-请参阅下面的@tomfanning代码。
Patrick Szalapski

这不能解决我从bin或release文件夹复制配置输出的问题,因为在设计时我没有有关该文件是在debug还是release文件夹中的信息,对我而言,该文件未复制到测试结果中的Out文件夹
Gurpreet

61

您可以指定部署属性,如下例所示;另外,您需要设置“内容”和“如果更新则复制”属性(在以后的设置中没有文档,但是已经进行了设置以使其起作用。

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



}

3
您仍然需要启用它。正如Mercel在评论中所写,在VS2010中,它是:测试/编辑测试设置/本地,然后在列表中选择“部署”,选中“启用...”框。
Patrick Szalapski 2012年

我正在Visual Studio 2012 Express中解决此问题,并且由于它是限量版,因此很难找到清晰的文档。非常感谢您的回答。
DavidHyogo 2012年

2
效果很好。我实际上认为这是更好的方法和答案,因为它在测试方法上方记录了所需的文件。
bu5hm4nn 2014年

1
我发现在测试级别(而不是方法级别)指定DeploymentItem属性时,它也可以工作。
乔恩·施耐德

10

我必须打开“启用部署”下Test -> Edit Test Settings -> Local -> Deployment[DeploymentItem]属性才能工作。


是的,我刚刚启用了它,现在该属性起作用了。谢谢!
Miguel Angelo

正如我在对另一个答案的评论中提到的那样,我在Visual Studio 2012 Express中遇到了相同的问题,两个答案一起终于为我提供了解决方案。
DavidHyogo 2012年

5

这三个答案都是正确的,具体取决于您的需求。

添加要部署到.testrunco​​nfig中的文件(VS2010 中为.testsettings),会将所有这些文件复制到每个测试输出文件夹中,即使不相关的测试是单独运行的。如果运行一项测试,则.testssettings的“部署”部分中列出的所有测试数据文件将被复制到测试输出文件夹中。

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

希望这可以帮助。


2
我的问题是相对路径讲到这里,我想到了的Xml应在目录中的测试是在,但它需要在项目的根,或目录中开头,这是英寸
韦斯格兰特

2

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


2

想要通过提及一种使它专门针对dll进行部署的方法来增强公认的答案,而不是在CopyLocal无法正常工作的情况下,将其用于数据或配置等的常规方法:

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

1

在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")


0

在Visual Studio中尝试构建后事件命令行(如果使用的是IDE)。


3
我是,但是这似乎有点hack。这必须是一个相当普遍的情况,我希望只有一些我未正确设置的选项或属性。
Eric Sc​​hoonover,

0

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


0
[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";
}

0

接受的答案是正确的,其他大多数答案也是正确的。但是,多年来,我发现如果您有大量数据文件,则使用DeploymentAttribtue和“ 复制到输出”的Visual Studio单元测试的部署系统会很麻烦。我发现将文件保留在原始位置会更好。

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

希望这可以帮助。

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.