MSTest部署项目仅在项目测试设置文件中存在时才起作用吗?


75

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

我是否可以使用上的[DeploymentItem]属性添加部署项目,[TestClass]或者[TestMethod]不必创建/修改项目测试设置文件?我该如何完成?

(坦率地说,我不了解需要单独的部署项目配置-为什么不只对应作为部署项目的项目文件使用现有的“复制到输出目录”设置?)

Answers:


223

好的-这篇文章可以帮助我弄清楚无需手动向.testsettings文件添加项目就可以做什么。

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

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

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

替代文字

现在转到DEPLOYMENT,并确保Enable Enable被选中为ON。(默认情况下,它是关闭的)。

替代文字

第2步-检查文件的属性

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

例如,...当前配置是“调试”(与“发布”相对)。 替代文字

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

替代文字

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

替代文字

专业提示:“始终复制”也可以使用,但是始终将源文件复制到目标文件上,即使它们相同。这就是为什么我更喜欢“如果较新则复制...”但无论如何浮动

好的,女士们和男士们-还和我在一起吗?Wikid。

当我们编译时,该文件现在应该存在于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";

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

只是为了确认->将该文件名的完整路径翻译C:\lots of blah blah blah\My Solution\TestResults\PureKrome_PUREKROME-PC 2011-01-05 23_41_23\Out\Test Data为当前MS测试的..之类的内容。

HTH。

现在有一张独角兽的照片,供阅读:)

替代文字


81
虽然是飞马座。;-)
Damien Ryan

19
我的天啊!我怎么没注意到喇叭不见了。太可笑了!干杯达米恩():(我被彩虹蒙蔽了..)
Pure.Krome

这是一个救命稻草,确实帮助了我,因为VS 2010的运行效果不佳,但是ReSharper涉及的是部署文件
Urda

1
文档DeploymentItem指出,相对路径是在testrunco​​nfig或testsettings中相对于“ RelativeRootPath”开始的。默认情况下,这是解决方案文件夹。您的文件不在“ $(SolutionDir)\测试数据”中。它们位于“ $(SolutionDir)\ Tests \ Test数据”中。您是否更改了RelativeRootPath?还是文档错了?还是您的答案是通过其他某种魔法起作用的?
安东尼·马斯特里恩

3
@Random-它在2012年无法使用,因为测试列表已删除并替换为TestCategory属性。
2014年

15

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

这是“测试结果”窗口(对Local.testsettings进行更改后,请勿从此处重新启动测试):

测试结果窗口

这是“测试视图”窗口(在对Local.testsettings进行更改之后,请从此处开始测试):

测试视图窗口

我希望这可以减轻将来的麻烦。


这次真是万分感谢。在阅读本文之前,我花了很多时间重新启动Visual Studio!
mattythomas2000 2012年

7

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

您可以简单地单击Project | 显示所有文件,并将子文件夹和文件包含在Visual Studio中,并将其“始终复制”或“如果更新则复制”属性包括到您的项目中,并且文件将被完整地复制到输出目录中。

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

更新资料

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

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

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

并非如此,在某些情况下,Agent设置工作目录的方式与VS2010相同。你知道如何控制这种行为吗?
2013年

@随机。该链接是否有助于回答您的问题?它显示了如何以不同的方式从不同的文件夹运行测试。我不确定您的具体情况,因此无法回答您的环境。在我的自动构建中,测试始终从输出目录运行,因此在我的环境中似乎是确定性的。
acarlon

我浏览了该链接,我发现要么可以在未选择testsettings文件的情况下运行测试,然后在debug文件夹中执行测试,所以可以使用xcopy进行部署,也可以使用testsettings,并且每次运行都在带有时间戳的自己的文件夹中执行, xcopy或DeploymentItem都可以工作。我尝试了DeploymentItem的固定路径和相对路径,但仍然失败。在测试设置中选中“启用部署”不会产生任何影响。我的设置非常原始,只有一个区别-我构建到x86和.NET 3.5(在所有项目设置中均固定)
2013年


0

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


实际上,反对票是不公平的。我阅读了整个教程,并尝试了不同的方法,但解决方案是:清理项目,重建项目,然后运行测试。突然,所有这些都起作用了:)
ecth

-1

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


-1

在VS 2012中,您需要做的是将log4net.properties(或log4net的任何配置文件)文件复制(如果较新)。(右键单击log4net.properties文件以显示属性并对其进行配置)


1
该问题已经有一个可以接受的答案,您的答案没有提供任何其他信息。问题甚至没有问到log4net.properties。
Guenther
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.