76

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

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

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

4

7 回答 7

225

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

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

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

转到TEST -> EDIT TEST SETTINGS -> Current Active settings .. 例如 :: Local (local.testsettings)

替代文字

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

替代文字

第 2 步 - 检查文件的属性

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

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

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

替代文字

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

替代文字

专业提示:始终复制也可以,但始终将源文件复制到目标文件上……即使它们相同。这就是为什么我更喜欢 Copy if Newer ...但无论你的船如何漂浮

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

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

于 2011-01-05T12:48:11.943 回答
15

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

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

测试结果窗口

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

测试视图窗口

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

于 2012-04-03T21:44:44.837 回答
7

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

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

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

更新

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

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

  • 在 Visual Studio 中右键单击测试并选择运行/调试,或者
  • 您使用 vstest.console.exe 从命令行运行。
于 2013-08-08T00:33:00.063 回答
1

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

于 2010-09-19T05:42:58.187 回答
0

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

于 2012-10-30T09:16:44.907 回答
-1

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

于 2013-09-10T20:26:11.223 回答
-1

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

于 2016-09-15T14:28:37.800 回答