ChatGPT解决这个技术问题 Extra ChatGPT

如何让“复制到输出目录”与单元测试一起使用?

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

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


M
Mark Cidade

执行此操作的标准方法是在 .testrunconfig 文件中指定 deployment items,该文件可通过 Visual Studio 中的 Edit Test Run Configurations 项访问 < strong>Test 菜单或 Solution Items 文件夹中。


在 VS2010 中,这是:测试/编辑测试设置/本地,然后在列表中选择“部署”,选中“启用...”框并添加文件。
在此更改正确生效之前,您可能必须关闭解决方案(甚至 Visual Studio)并重新打开
RobV,你让我很开心。谢谢!
如果您在代码中使用 [DeploymentItem] 属性,则无需在对话框中指定文件 - 请参阅下面的 @tomfanning 代码。
这并不能解决我从 bin 或 release 文件夹复制配置输出的问题,因为在设计时我没有关于文件是否在调试或发布文件夹中的信息,对我来说,这是没有被复制到的文件测试结果中的 Out 文件夹
S
Sanjay10

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

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



}

您仍然需要启用此功能。正如默塞尔在他的评论中所写,在 VS2010 中,这是:测试/编辑测试设置/本地,然后在列表中,选择“部署”,选中“启用...”框。
我在 Visual Studio 2012 Express 中遇到了这个问题,因为它是限量版,所以很难找到清晰的文档。非常感谢您的回答。
效果很好。我实际上认为这是更好的方法和答案,因为它在测试方法的正上方记录了所需的文件。
我发现在测试类级别(而不是方法级别)指定时,DeploymentItem 属性也有效。
t
tomfanning

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


这是真的......我刚刚启用它,现在该属性有效。谢谢!
正如我在对另一个答案的评论中提到的,我在 Visual Studio 2012 Express 中遇到了同样的问题,两个答案一起最终给了我解决方案。
G
GraehamF

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

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

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

希望这可以帮助。


我的问题是这里提到的相对路径,我认为 Xml 应该在测试所在的目录中,但它需要在项目根目录中,或者以它所在的目录开头。
S
Simon

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


m
matthias_h

以下适用于 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"),它们都将位于工作目录中。


J
JamesDill

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

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

K
Kasper

从 Visual Studio 中试用 Post-Build 事件命令行(如果您使用的是该 IDE)。


我是,但这似乎有点像黑客。这必须是一个相当普遍的场景,我希望只有一些选项或属性我没有正确设置。
C
Community

在 Visual Studio 2012 中,对于简单案例,您不需要 DeploymentItem 属性。查看我的回答here


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

S
Sau001

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

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

希望这可以帮助。