【问题标题】:MSTest copy file to test run folderMSTest 复制文件到测试运行文件夹
【发布时间】:2010-10-13 13:00:48
【问题描述】:

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

XML 文件设置为“如果较新则复制”和“无”编译模式(因为它不是真正可编译的东西)

【问题讨论】:

    标签: visual-studio mstest


    【解决方案1】:

    使用DeploymentItem attribute

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

    【讨论】:

    • 还可以在类级别指定 DeploymentItem 属性,以影响类中的每个测试。
    • 不要忘记,如果您将项目放在子文件夹中,也要将其包含在部署子目录中 [DeploymentItem("SubFolder\testFile1.xml", "SubFolder")]
    • Thomas 的进一步评论,RelativePathRoot 的默认值是解决方案文件夹,所以如果您的解决方案看起来像这样 (..\SolutionFolder\TestProject\TestData\aFile.txt) 您的 DeploymentItem 看起来像this.. ([DeploymentItem(@"TestProject\TestData\aFile.txt", "TestData")]).. 你会在测试中使用 this..(string file = @"TestData\aFile.txt ";)
    • DeploymentItemAttribute documentation for VS2010: 可以在测试方法或测试类上指定该属性。
    • 我见过的大多数帖子没有提到的是,如果你不能让它工作,你可能需要选中“启用部署”复选框,如果你去,你可以找到测试 -> 编辑测试设置 -> 本地 (local.testsettings) -> 部署选项卡。我只是这样做了,然后 DeploymentItem 工作正常。
    【解决方案2】:

    看来,如果您为解决方案提供 TestSettings 文件,那么您可以取消选中“启用部署”选项并阻止 mstest 尝试从不会复制您的额外文件的 ...TestResults\...\out 文件夹运行(除非您使它们成为部署选项)。

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

    对我来说,直接在 Visual Studio 中运行测试效果很好(即我的结构中的额外文件被测试找到并使用),因为我很久以前出于另一个原因创建了一个 TestSettings 文件(未选中启用部署),但是不是在 TeamCity 运行 mstest 运行测试时,因为我没有指定应该使用 TestSettings 文件。

    要在 Visual Studio 中创建 TestSettings 文件,请右键单击 Solution 并选择 New Item,然后选择 TestSettings 模板。要在 mstest.exe 的命令提示符下使用 TestSettings 文件,请添加选项 /testsettings:C:\Src\mySolution\myProject\local.testsettings(或在 TeamCity 中添加为具有适当路径的额外命令行选项)

    【讨论】:

      【解决方案3】:

      Preet 答案用于为单个测试部署项目。如果您想在解决方案级别执行此操作,请使用.testrunconfig settings

      【解决方案4】:

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

      首先创建一个testsettings文件,并添加你需要的部署项(文件或文件夹名称):

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

          在 Visual Studio 2012 中,vstest.console.exe(内置测试运行程序)以输出目录作为当前路径运行。这意味着您只需在解决方案中包含“始终复制”或“如果较新则复制”属性的项目,以便您的测试使用它们。对于一般情况,您不需要 DeploymentItem 属性。从输出/测试目录中的命令行运行 vstest.console.exe 时也是如此。

          在某些情况下会使用单独的文件夹,其中一种情况是您使用 DeploymentItem 属性时。请参阅here 了解更多信息。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-22
            • 1970-01-01
            • 2016-10-17
            相关资源
            最近更新 更多