繁体   English   中英

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

[英]Do MSTest deployment items only work when present in the project test settings file?

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

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

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

好的 - 这篇文章帮助我弄清楚我需要做什么而不必手动将项目添加到.testsettings文件中。

步骤1 - 启用MS Test DeploymentItem属性。

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

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

替代文字

现在转到DEPLOYMENT并确保选中Enable Deployment (默认情况下,它已关闭)。

替代文字

第2步 - 检查文件的属性

现在我们需要确保您希望在单元测试中使用的文件在编译时被设置为复制到BIN目录。 只有BIN目录中的文件才能用于MS测试单元测试。 为什么? 因为每次运行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在运行每个测试时创建。

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

替代文字

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

PRO TIP#2 - 如果你不在DeploymentItem属性中使用第二个字符串参数,那么该文件将被复制到当前MS Test的根OUT文件夹中。

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

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

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

HTH。

现在有一张独角兽的照片,因为阅读这么多:)

替代文字

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

这是“测试结果”窗口(在对Local.testsettings进行更改后,不要从此处重新开始测试):

测试结果窗口

这是Test View窗口(在对Local.testsettings进行更改后,从这里开始测试):

测试视图窗口

我希望这将在未来让人头疼。

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

您只需单击Project | 显示所有文件并在Visual Studio中包含子文件夹和文件,并将“始终复制”或“如果更新时复制”属性包含在项目中,文件将复制到输出目录,且层次结构完整。

从命令行运行vstest.console.exe时也是如此。 请参阅此处了解详情。

更新

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

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

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

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

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

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

在VS 2012中,您只需要将log4net.properties(或log4net的任何配置文件)文件复制为更新版本。 (右键单击log4net.properties文件以显示属性并进行配置)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM