2009-05-19 63 views
84

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

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

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

以前的测试工作,但现在我不得不更改\ files \ tif目录中包含的TIF文件的名称。根据规则,TIF文件名必须匹配一个特定的模式,这也由ExistsTifTest()方法检查。 现在我不得不改变文件名以适应新的需求,突然间TIF文件不再像以前那样部署了。

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

我通过直接在testrunco​​nfig中定义部署路径,得到了现在部署的映像,但我想了解为什么会发生这些情况,或者为什么我的新文件“my2ndTest.txt”未部署,而别人呢。

+2

这里的一个大问题是要认识到,DeploymentItemAttribute中指定的所有项目都将被复制到测试程序集运行所在的位置。换句话说,如果你希望它能保持你的目录结构,你将会失败。如果需要将其复制到特定目录,则使用两个参数DeploymentItem(source,outputDir)版本。仅供参考 - 您可以前往旧学校,通过将System.Console.WriteLine(System.Environment.CurrentDirectory)放入您的测试中来找出MsTest运行的文件的位置。 NCrunch没有这个问题! – CodeMonkeyKing 2013-11-01 22:39:43

回答

92

DeploymentItem有点乱。

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

检查您是否已经为新文件设置了此设置。如果你没有这个设置,那么这些文件将不会被复制到输出文件夹,然后他们不能从输出文件夹部署到MSTest所需的文件夹。个人而言,如果我有我需要的单元测试文件,我发现将这些文件作为资源嵌入到程序集中,并让该程序集在测试期间“解开”自己是一种更可预测的做事方式。因人而异。

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

+0

这正是问题所在。你说得对,这些DeploymentItems有点混乱。非常感谢。 – Juri 2009-05-20 11:12:04

+2

复制到输出目录从不影响MSTest部署文件的方式。这个答案是不正确的。 – kzu 2011-03-16 09:35:51

+17

在VS2010 Premium上,使此更改(以及其他更改)导致文件部署。因此,我根据实际证据得出结论,它会影响MsTest的部署。 – JonStonecash 2011-04-05 14:35:13

10

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

72

在VS2010,我Local.testsettings有“启用部署”未与DeploymentItem属性不能正常工作。我检查了它,一切正常。 我希望这有助于!

1

因为我总是发现DeploymentItem属性一团糟,我通过使用生成后的脚本做此类文件的部署。 - 确保要复制的文件具有“始终复制”属性集。 - 修改测试项目构建脚本,将文件从构建目标文件夹(Bin \ Debug)复制到测试期望的位置。

8

这可能与您确切的问题无关,但这里有几个我在[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() 
    { 
     ... 
    } 
3

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

1

试试这个VS2010。所以,你不需要添加DeployItems每一个TIF
取出

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

添加一个测试配置。
- 添加 - - >新项...
- 选择左侧的测试设置节点,选择右边的项目
- 单击添加

呼叫解决方案资源管理
解决方案节点上单击鼠标右键它例如TDD

选择TDD根据TestMenu>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 

在testcode我把它从:

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

没有需要选择总是复制;把文件放在测试项目中;在测试代​​码中添加硬编码路径。对我来说这个解决方案效果最好我试着用DeploymentItem,总是复制,但它不符合我的喜好。

11

对于希望帮助其他人:我在此尝试了所有建议,并且仍然是我的部署项目未被复制。

我必须做什么(as suggested here)是第二个参数添加到DeploymentItem属性:

[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")] 
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文件 - 如果我不改变代码或强制重建,没有触发文件的复制标记为在构建时被复制。

4

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

2

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

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

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

15

我也面临类似的问题,但我发现这个简单的3步解决方案:

假设你的文件夹结构是这样的: SolutionFolder\ TestProjectFolder\ SubFolder\

  1. 转到“解决方案项目/本地。testsettings“>”Deployment“>选中”Enable Deployment“
  2. 如果您使用的是VS2010,请确保您要部署的任何文件的”复制到输出文件夹“属性设置为”始终复制“或”如果新建复制“
  3. 属性您TestMethod的有两种之一:
    • [DeploymentItem(@"TestProjectFolder\SubFolder")]部署的<SubFolder>到试运行目录
    • [DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")]所有内容,在测试运行目录的<SubFolder>的所有内容部署到<TargetFolder>
  4. 约MSTest的(至少VS2010)

最后一点:

如果你想<TargetFolder>具有相同的名称作为<SubFolder>,使用[DeploymentItem(@"SubFolder", @"SubFolder")]作为MSTest的亚军打一个愚蠢的边缘情况下会静默失败。这就是为什么你应该在<SubFolder>前加上<TestProjectFolder>这样的号码:[DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]

0

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

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

1

我一直在VS2013工作。我的结论得到这个工作:

  • 复制到输出目录应设置为始终复制:强制性的。
  • .TestSettings中的“启用部署”:不是必需的。我得到这个工作 根本没有.TestSettings文件。
  • 指定一个文件夹作为第二个参数:可选。形成输出文件夹布局,没有工作正常。
  • 文件名中的空格:这让我很头疼 - 文件从未被复制过。删除空间解决了这个问题。还没有查看转义字符。

一个提示我也学会了艰难的方式:不要忘记将这个属性添加到每个单独的测试。该文件在testrun中的第一个属性测试上复制,但当测试顺序发生变化并且非属性测试首先尝试查找文件时,该文件仍然丢失。

0

我也遇到了类似的问题。我有上面提到的所有步骤,但仍然没有运气。我正在使用VS2010。然后我发现$ Menu> Test> Select Active Test Setting> Trace and Test impact was selected。它开始工作后,我更改跟踪和测试影响本地。该页面包含有关将文件复制到测试结果文件夹的非常丰富的信息,我也希望增加这种体验。

1

对于那些谁希望避免DeploymentItem的混乱,并采取由@马丁·佩克(接受的答案)建议的方法,你可以用下面的代码来访问嵌入式资源的内容:

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(); 
    } 
} 

有关详细信息,请参阅this SO Thread

1

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

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

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

0

我们花了很多时间通过部署项目问题来解决它在本地单元测试运行和teamcity unittest回退以及。这不简单。

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

0

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

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

您的deploymentFile.txt需要重定位到解决方案文件而不是testfile.cs。

enter image description here

0

不要使用DeploymentItem

这是很难正确地设置和它不符合我的ReSharper的测试运行,也不在Visual Studio中的原生一个MSTEST工作2017年

相反,右键单击您的数据文件,并选择性能 。选择复制到输出目录:总是

现在在您的测试中,执行此操作。该目录只是该文件相对于测试项目的目录。简单。

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

警告。我不知道这是否适用于自动化构建和测试系统。我还没有。