97

我目前正在维护一个用 C#.net 编写的“旧”系统,删除了一些过时的功能并进行了一些重构。感谢上帝,前面的人写了一些单元测试(MSTests)。我对 JUnit 测试很满意,但对 MSTests 还没有做太多。

测试方法有一个DeploymentItem属性,指定一个文本文件,该文件由正在测试的业务逻辑方法解析,第二个属性DeploymentItem只指定了一个路径,其中包含必须部署的一堆 TIF 文件。

[TestMethod()]
[DeploymentItem(@"files\valid\valid_entries.txt")]
[DeploymentItem(@"files\tif\")]
public void ExistsTifTest()
{
   ...
}

测试之前工作,但现在我必须更改包含在 \files\tif 目录中的 TIF 文件的名称。根据规则,TIF 文件名必须与该ExistsTifTest()方法也检查的特定模式匹配。现在我不得不更改文件名以使它们适应新的要求,并且突然之间不再像以前那样部署 TIF 文件。

有人可以告诉我为什么会发生这种情况或可能是什么原因吗?如果我在 \files\valid\ 目录中的“valid_entries.txt”旁边添加一个新的文本文件“my2ndTest.txt”,并在测试方法上使用相应的 DeploymentItem 属性,也会发生同样的事情。文件没有被部署?

我现在通过直接在 testrunco​​nfig 中定义部署路径来部署图像,但我想了解为什么会发生这些事情,或者为什么我的新文件“my2ndTest.txt”没有部署而其他文件部署。

4

20 回答 20

115

DeploymentItem有点乱。

解决方案中的每个文件都将在 VS.NET 中具有“复制到输出文件夹”设置。您需要将其设为“始终复制”(或类似的),以便将文件放入输出文件夹。

检查您是否已为新文件设置了此设置。如果您没有此设置,则文件不会被复制到输出文件夹,然后它们无法从输出文件夹部署到 MSTest 执行它的文件夹。

就个人而言,如果我有单元测试所需的文件,我发现将这些文件作为资源嵌入到程序集中,并在测试期间让该程序集“解包”自己是一种更可预测的做事方式。YMMV。

注意:这些评论是基于我对 VS2010 的经验。对我的回答的评论表明这不是 VS2012 的问题。我仍然坚持认为使用嵌入式资源涉及更少的“魔法”,并且对我来说,使我的单元测试的“安排”阶段更加明确。

于 2009-05-19T14:58:01.433 回答
77

在 VS2010 中,我的 Local.testsettings 未选中“启用部署”,并且 DeploymentItem 属性不起作用。我检查了它,一切正常。我希望这有帮助!

于 2010-07-27T16:59:17.500 回答
20

我也遇到过类似的问题,但我找到了简单的 3 步解决方案:

假设您的文件夹结构如下所示: SolutionFolder\ TestProjectFolder\ SubFolder\

  1. 转到“解决方案项目/Local.testsettings”>“部署”>选中“启用部署”
  2. 如果您使用的是 VS2010,请确保您要部署的所有文件的“复制到输出文件夹”属性设置为“始终复制”或“如果更新则复制”
  3. 将您的 TestMethod 归因于以下任一项:
    • [DeploymentItem(@"TestProjectFolder\SubFolder")]将所有内容部署<SubFolder>到测试运行目录
    • [DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")] 将 to 的所有内容部署<SubFolder><TargetFolder>Test Run 目录中

关于 MSTest 的最后一点说明(至少对于 VS2010):

如果您希望 与<TargetFolder>具有相同的名称,则<SubFolder>使用[DeploymentItem(@"SubFolder", @"SubFolder")]将在 MSTest 运行器遇到愚蠢的边缘情况时静默失败。这就是为什么你应该<SubFolder><TestProjectFolder>as 作为前缀:[DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]

于 2013-08-29T06:40:21.947 回答
15

希望能帮助别人:我在这里尝试了所有建议,我的部署项目仍然没有被复制。

我必须做的(如此处所建议的)是向 DeploymentItem 属性添加第二个参数:

[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")]
于 2012-01-24T19:11:58.720 回答
10

如果您进入 .testrunco​​nfig 文件并在部署下取消选中“启用部署”,则测试将在其正常位置运行,并且一切都会像在单元测试之外运行应用程序时一样工作。

于 2010-03-19T17:19:05.470 回答
10

这可能与您的确切问题无关,但这里有一些我在 [DeploymentItem] 属性中发现的提示。

  1. 复制到输出目录应设置为始终复制。

与 [ TestInitialize ] 属性一起使用时不起作用

[TestInitialize]
[DeploymentItem("test.xlsx")]
public void Setup()
{

它应该在您的 [TestMethod] 上,例如

    [TestInitialize]
    public void Setup()
    {
        string spreadsheet = Path.GetFullPath("test.xlsx");
        Assert.IsTrue(File.Exists(spreadsheet));
        ...
    }

    [TestMethod]
    [DeploymentItem("test.xlsx")]
    public void ExcelQuestionParser_Reads_XmlElements()
    {
        ...
    }
于 2011-07-19T15:27:16.597 回答
7

不要使用DeploymentItem.

正确设置非常困难,它不适用于我的 ReSharper 测试运行器,也不适用于 Visual Studio 2017 中 MSTEST 的本机运行器。

相反,右键单击您的数据文件,然后选择properties。选择复制到输出目录:始终

现在在你的测试中,这样做。该目录只是文件相对于测试项目的目录。简单的。

    [TestMethod()]
    public void ParseProductsTest()
    {
        // Arrange
        var file = @"Features\ParseProducts\Files\ParseProducts_Workbook_2017.xlsx";
        var fileStream = File.Open(file, FileMode.Open);
        // etc.
    }

这似乎确实适用于自动化构建和测试系统。

这是解决方案中文件所在位置的图片:

在此处输入图像描述

于 2017-08-16T14:31:53.340 回答
5

在尝试了此处列出的所有其他建议后,我仍然无法弄清楚发生了什么。最后我发现在测试/测试设置菜单下没有选择设置文件,这意味着没有启用部署。我单击了测试/测试设置/选择测试设置文件菜单项,选择了 Local.TestSettings 文件,然后一切正常。

于 2012-11-15T21:20:49.850 回答
4

不确定这是否完全回答了这个问题,但它可能会有所帮助。首先,我发现必须选中“启用部署”框才能使部署工作。其次,文档说源路径是“相对于项目路径”,起初我认为它是指项目文件夹。实际上,它似乎是指构建输出文件夹。因此,如果我有一个名为“TestFiles”的项目文件夹和一个名为 的文件,则以Testdata.xml这种方式使用该属性是行不通的:

[DeploymentItem(@"TestFiles\Testdata.xml")] 

我可以标记Testdata.xml文件Copy Always,以便构建将副本放在输出文件夹下(例如,Debug\TestFiles\TestData.xml)。然后,部署机制将找到位于该路径 ( TestFiles\Testdata.xml) 相对于构建输出的文件副本。或者,我可以这样设置属性:

[DeploymentItem(@"..\\..\TestFiles\Testdata.xml")] 

部署机制会找到原始文件。所以两者都可以,但我注意到使用Copy Always我在项目中编辑 app.config 文件时偶尔会遇到同样的问题 - 如果我不更改代码或强制重建,则不会触发复制标记为的文件在构建时复制。

于 2012-07-23T19:02:21.177 回答
3

我首先禁用了部署标志。但是即使在我启用它之后,由于某种未知的原因,甚至目标 DLL 都不会被复制。不小心我打开了测试运行窗口并杀死了所有以前的运行,然后神奇地我在下一次运行时在测试文件夹中找到了我需要的所有 DLL 和文件......非常混乱。

于 2011-09-15T18:20:44.650 回答
2

我在尝试部署文件时遇到了巨大的问题 - 尝试了上面的所有建议。

然后我关闭了VS2010;重新启动它,加载解决方案,一切正常。(!)

我做了一些检查;在 local.TestSetting 上设置“启用部署”标志后,您不应简单地从“测试结果”窗口重新运行测试。您必须从 UI 中删除之前的测试运行,例如通过运行不同的测试或重新打开您的解决方案。

于 2013-01-11T16:41:39.907 回答
2

对于那些喜欢避免 DeploymentItem 的混乱并采用@Martin Peck 建议的方法(已接受答案)的人,您可以使用以下代码访问嵌入式资源的内容:

public string GetEmbeddedResource(string fullyQulifiedResourceName)
{
    var assembly = Assembly.GetExecutingAssembly();
    // NOTE resourceName is of the format "Namespace.Class.File.extension";

    using (Stream stream = assembly.GetManifestResourceStream(fullyQulifiedResourceName))
    using (StreamReader reader = new StreamReader(stream))
    {
        string result = reader.ReadToEnd();
    }
}

有关详细信息,请参阅此 SO 线程

于 2014-10-22T09:14:51.583 回答
1

由于我总是发现 DeploymentItem 属性一团糟,因此我使用构建后脚本来部署此类文件。- 确保您要复制的文件具有 Copy Always 属性集。- 修改您的测试项目构建后脚本,将文件从构建目标文件夹(Bin\Debug)复制到您的测试期望它们的位置。

于 2011-04-08T20:42:50.407 回答
1

在 VS2010 上试试这个。所以你不需要为每个 tif 添加 DeployItems
删除

[DeploymentItem(@"files\valid\valid_entries.txt")]  
[DeploymentItem(@"files\tif\")]  

添加测试配置。
- 在解决方案资源管理器中右键单击解决方案节点
- 添加 -> 新项目...
- 选择左侧的测试设置节点,选择右侧的项目
- 单击添加

称之为例如TDD

TDDTestMenu>下选择Edit Testsettings

单击部署。启用它,然后添加所需的文件和目录。将有一个相对于解决方案的路径。文件将被放置。原始文件例如在这里:

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate\Authority.xml  

当我运行我的单元测试时,它被复制到

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate.Tests\bin\Debug\TestResults\Patrik_HERKULES 2011-12-17 18_03_27\Authority.xml  

在测试代​​码中,我从以下位置调用它:

[TestMethod()]
public void Read_AuthorityFiles_And_ParseXML_To_Make_Dictonary()  
{  
  string authorityFile = "Authority.xml";  
  var Xmldoc = XDocument.Load(authorityFile);  

无需选择始终复制;将文件放在测试项目中;在测试代​​码中添加硬编码路径。对我来说,这个解决方案效果最好。我尝试使用 DeploymentItem,总是复制,但这不是我喜欢的。

于 2011-12-17T17:24:25.067 回答
1

我一直在 VS2013 中研究这个。我的发现使这个工作:

  • Copy to output directory 应设置为 Copy if Newer / Copy Always: MANDATORY。
  • .TestSettings 中的“启用部署”:不需要。我完全没有 .TestSettings 文件就可以正常工作。
  • 将文件夹指定为第二个参数:可选。塑造输出文件夹布局,没有它也能正常工作。
  • 文件名中的空格:这让我很头疼 - 文件从未被复制。删除空格解决了这个问题。还没有研究转义字符。

一个技巧,我也学到了一个艰难的方法:不要忘记将此属性添加到每个单独的测试中。该文件在 testrun 中的第一个属性测试中复制,但在测试顺序更改并且非属性测试尝试首先找到该文件时仍然丢失。

于 2014-06-24T13:37:56.543 回答
1

对我来说,根本原因完全是另外一回事:我的测试执行的生产代码是重命名和/或删除正在部署的 .xml 测试文件。

因此,当我单独运行我的测试时,它们会通过,但是当它们一起运行时,第二个和后续测试将失败,并出现“找不到文件”错误(我最初误诊为DeploymentItem属性不起作用)。

我的解决方案是让每个单独的测试方法复制部署的文件(使用这种技术),然后让正在测试的生产代码使用复制的文件而不是原始文件。

于 2015-11-05T15:13:34.940 回答
1

我们在本地单元测试运行和团队城市单元测试重新运行中花费了大量时间来解决部署项目问题。这不简单。

调试此问题的非常好的工具是ProcessExplorer。使用进程资源管理器,您可以检查 Visual Studio 在哪里搜索部署项并对项目进行更正。只需过滤路径包含您的部署项文件名的所有文件操作,您就会看到它。

于 2016-12-05T10:46:12.250 回答
1

除了需要检查 Deployment 属性之外,我还发现了有关 DeploymentItem 属性的其他内容。

[TestMethod()]
[DeploymentItem("folder\subfolder\deploymentFile.txt")]
public void TestMethod1()
{
   ...
}

您的 deploymentFile.txt 需要与解决方案文件相关,而不是 testfile.cs。

在此处输入图像描述

于 2016-12-19T10:01:45.097 回答
0

我最大的“陷阱”是 DeploymentItem 处理目录的方式。我使用的是双参数版本,两者都作为包含我想要部署的子目录的目录路径。最初我没有意识到它只复制目录根目录中的内容,而不是整个递归文件夹结构!

我基本上有 [DeploymentItem(@"Foo\", @"Foo\")] 并期待它部署我的 Foo\Bar。我特别不得不将其更改为 [DeploymentItem(@"Foo\Bar\", @"Foo\Bar\")],现在它就像一个魅力。

于 2014-04-10T16:34:39.363 回答
0

我也遇到过类似的问题。我有上面提到的所有步骤,但仍然没有运气。我正在使用VS2010。然后我发现选择了$Menu > Test > Select Active Test Setting > Trace and Test Impact在我将 Trace 和 test Impact 更改为Local后,它开始工作。此页面包含有关将文件复制到测试结果文件夹的非常丰富的信息,我觉得也可以添加此体验。

于 2014-07-11T09:26:31.813 回答