【问题标题】:Do MSTest deployment items only work when present in the project test settings file?MSTest 部署项是否仅在项目测试设置文件中存在时才有效?
【发布时间】:2010-09-17 20:32:49
【问题描述】:

我似乎无法理解应该如何配置 MSTest 部署项。我已经能够通过修改项目的测试设置文件使它们正常工作,但这并不理想——部署项配置与单个测试分开,并且文件路径似乎存储为绝对路径,除非文件是在解决方案文件夹下。

我不应该能够在 [TestClass][TestMethod] 上使用 [DeploymentItem] 属性添加部署项,而无需创建/修改项目测试设置文件吗?我该如何做到这一点?

(坦率地说,我不明白需要单独的部署项配置——为什么不直接对应该是部署项的项目文件使用现有的“复制到输出目录”设置?)

【问题讨论】:

    标签: unit-testing visual-studio-2010 mstest deploymentitem


    【解决方案1】:

    This post here 帮助我弄清楚我需要做什么,而无需手动将项目添加到 .testsettings 文件中。

    第 1 步 - 启用 MS 测试 DeploymentItem 属性。

    首先,我们需要打开/启用DeploymentItem 属性。

    转到 测试 -> 编辑测试设置 -> 当前活动设置 .. 例如 :: Local (local.testsettings)

    现在转到部署并确保启用部署被勾选。 (默认情况下,它是关闭的)。

    第 2 步 - 检查文件的属性

    现在我们需要确保您希望在单元测试中使用的文件已设置为在编译时复制到 BIN 目录。只有 BIN 目录中的文件才能在 MS Test 单元测试中使用。为什么?因为每次运行 MS 测试时,它都必须复制源代码……这意味着它会复制当前 BIN 目录文件(用于当前配置)。

    例如... 当前配置是 Debug(与 Release 相对)。

    然后我添加我的文件...(记下项目中的文件夹结构)...

    然后确保在编译项目时始终将此文件复制到 bin 目录。

    专业提示:始终复制也可以,但始终将源文件复制到目标文件上……即使它们相同。这就是为什么我更喜欢 Copy if Newer ...但whatever floats your boat

    好的女士们先生们 - 还和我在一起吗?维基。

    当我们编译时,该文件现在应该存在于 Bin 目录中......

    第 3 步 - 现在使用 DeploymentItem 属性

    好的,现在我们终于可以在代码中使用DeploymentItem 属性了。当我们这样做时,这会告诉 MSTest 将文件(从相对于 bin 目录的位置)复制到新的 MS Test 目录...

    [TestMethod]
    [DeploymentItem(@"Test Data\100LogEntries.txt", "Test Data")]
    public void Parsing100LogFileEntriesReturnsANewParsedLogEntriesWith100Items()
    {
        // Arrange.
        const string fileName = @"Test Data\100LogEntries.txt";
        ILogEntryService logEntryService = new PunkBusterLogEntryService();
    
        // Act.
        var parsedLogEntries = logEntryService.ParseLogFile(fileName, 0);
    
        // Assert.
        Assert.IsNotNull(parsedLogEntries);
        Assert.AreEqual(100, parsedLogEntries.LogEntries.Count);
        // Snipped the remaining asserts to cut back on wasting your time.
    }
    

    所以让我们分解一下..

    [TestMethod]
    

    我们都知道那是什么。

    [DeploymentItem(@"Test Data\100LogEntries.txt", "Test Data")]
    

    从 bin 目录开始,进入 Test Data 文件夹并将 100LogEntries.txt 文件复制到目标文件夹 Test Data,在 MS Test 运行每个测试时创建的根 MS Test 输出目录中。

    这就是我的输出文件夹结构的样子(请原谅所有的混乱)。

    瞧!我们有部署文件,以编程方式。

    专业提示 #2 - 如果您不在 DeploymentItem 属性中使用第二个字符串参数,那么文件将被复制到当前 MS 测试的根 OUT 文件夹中。

    const string fileName = @"Test Data\100LogEntries.txt";
    

    现在文件的路径相对于当前 MS 测试的 OUT 文件夹。因此,我明确表示要将文件部署到一个名为Test Data 的目录中......所以当我想读入文件时,我需要确保在我的代码中正确引用它。

    只是为了确认 -> 对于当前的 MS 测试,该文件名的完整路径被转换为 C:\lots of blah blah blah\My Solution\TestResults\PureKrome_PUREKROME-PC 2011-01-05 23_41_23\Out\Test Data 之类的东西。

    【讨论】:

    • 虽然它是飞马。 ;-)
    • 天啊!我怎么没注意到喇叭不见了。这也太搞笑了!干杯达米安:)(我被彩虹蒙蔽了....)
    • 这是一个救命稻草,真的帮我解决了这个问题,因为 VS 2010 表现不佳,但 ReSharper 在部署文件方面表现出色
    • DeploymentItem 的文档说相对路径是在 testrunco​​nfig 或 testsettings 中相对于“RelativeRootPath”开始的。默认情况下,这是解决方案文件夹。您的文件不在“$(SolutionDir)\Test Data”中。它们位于“$(SolutionDir)\Tests\Test Data”中。您是否更改了 RelativeRootPath?还是文档错了?或者你的答案是否有其他魔法?
    • @Random - 它在 2012 年不起作用,因为测试列表已被删除并替换为 TestCategory 属性。
    【解决方案2】:

    我想我会分享一个我遇到 MSTest 和部署项目问题的方法。如果您从“测试结果”窗口第二次或更多次地调试/运行测试,它会使用上一次运行的设置。但是,如果您从“测试视图”窗口调试/运行相同的测试,它会使用最新设置。当我不断从“测试结果”窗口对同一测试启动调试时,我花了一个小时试图弄清楚为什么没有使用对 Local.testsettings 的更改。

    这是测试结果窗口(对 Local.testsettings 进行更改后,请勿从此处[重新]开始测试):

    这是测试视图窗口(在更改 Local.testsettings 后从这里开始测试):

    我希望这可以避免将来有人头疼。

    【讨论】:

    • 谢谢你。在阅读本文之前,我花了很多时间重新启动 Visual Studio!
    【解决方案3】:

    在 Visual Studio 2012 中,输出目录是工作目录,这意味着在一般情况下不需要 DeploymentItem 属性(您没有特定的每个测试或每个类的部署项)。这意味着如果您不需要使用 DeploymentItem 属性,如果您希望所有测试都使用一组文件,或者您对每个 TestClass/TestMethod 具有单独的部署依赖项不太挑剔。

    您只需单击项目 |显示所有文件并在 Visual Studio 中使用“始终复制”或“如果较新则复制”属性将子文件夹和文件包含到您的项目中,并且文件将被复制到您的输出目录中,并且层次结构完好无损。

    从命令行运行 vstest.console.exe 时也是如此。有关详细信息,请参阅here

    更新

    在某些情况下,默认目录不是输出目录。特别是当您选择Run All Tests 时,默认路径将在TestResults\Deploy_... 下使用runsettings 文件或测试使用DeploymentItems 时同样适用

    当您不使用 DeploymentItems 时,输出目录将是默认目录,并且:-

    • 在 Visual Studio 中右键单击测试并选择运行/调试,或者
    • 您使用 vstest.console.exe 从命令行运行。

    【讨论】:

    • 不正确,在某些情况下,代理设置工作目录的方式与 VS2010 相同。你知道如何控制这种行为吗?
    • @Random。该链接是否有助于回答您的问题?它展示了如何以各种方式从不同的文件夹运行测试。我不确定您的具体情况,因此无法回答您的环境。在我的自动构建中,测试总是从输出目录运行,所以它在我的环境中看起来相当确定。
    • 我浏览了链接,我注意到我可以在不选择 testsettings 文件的情况下运行测试,并且测试在调试文件夹中执行,因此我可以使用 xcopy 进行部署,或者我使用 testsettings 并执行每次运行在自己的带有时间戳的文件夹中,xcopy 和 DeploymentItem 都不起作用。我尝试了 DeploymentItem 的固定和相对路径,但它仍然失败。在测试设置中选中“启用部署”不会影响任何事情。我的设置非常简单,但有一个区别 - 我构建到 x86 和 .NET 3.5(在所有项目设置中都已修复)
    【解决方案4】:

    如果您需要在单个测试用例中单独部署项目,请继续在每个测试用例中使用[DeploymentItem("string file path")] 属性。

    【讨论】:

    • 不过,我的问题是 DeploymentItem 属性不起作用。
    • 这里一样 :( 我只是通过修改设置文件才让它工作。
    【解决方案5】:

    对于我的情况,我添加了 DeploymentItem 属性,它不能立即生效。我必须关闭并重新打开解决方案,然后配置的 DeploymentItem 属性才会生效。

    【讨论】:

    • 实际上投反对票是不公平的。我阅读了整个教程并尝试了不同的方法,但解决方案是:清理项目,重建它,然后运行测试。突然一切都奏效了:)
    【解决方案6】:

    看起来这在 VS.NET 2012 中默认有效

    【讨论】:

      【解决方案7】:

      在 VS 2012 中,您只需将 log4net.properties(或 log4net 的任何配置文件)文件复制(如果更新)。 (右键 log4net.properties 文件调出属性并进行配置)

      【讨论】:

      • 该问题已有一个已接受的答案,而您的答案未提供任何其他信息。这个问题甚至没有询问 log4net.properties。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 2010-09-14
      • 1970-01-01
      • 2021-01-03
      相关资源
      最近更新 更多