2009-09-11 55 views
35

我们使用TeamCity作为CI服务器,并且我刚开始在测试失败窗口中看到"TestFixtureSetUp Failed"如何诊断“TestFixtureSetUp失败”

任何想法如何去调试这个问题?测试在我的工作站(VS2008中的R#测试运行器)上运行良好。

+0

对!为什么NUnit不像TestFixtureSetUp那样显示异常细节和堆栈跟踪,就像测试失败时那样? – 2016-02-22 15:19:08

+0

我们应该向NUnit报告这个错误 – 2016-02-22 15:20:17

+0

请在https://github.com/nunit/nunit-vs-adapter/issues/99投票寻找错误报告 – 2016-02-22 15:26:09

回答

22

这是TestFixtureSetUp(和TestFixtureTearDown)的实现中的一个缺陷,即任何异常都没有很好地报告。我写了他们的第一个实现,我从来没有按照它应该的方式工作。当时NUnit代码中的概念与动作与单个测试直接相关的想法紧密相关。所以一切的报告都与测试结果有关。在没有大量重写的情况下,没有真正的空间来报告套件级别发生的事情(当您将绵羊换成自动扶梯时,这不是重构)。

由于这一点历史,很难找出TestFixtureSetUp中发生了什么。没有一个好的地方来附加错误。 TestFixtureSetUp调用是运行测试的副作用,而不是与测试直接相关。

@TueueWill有正确的想法。检查日志,然后修改测试以在必要时添加更多日志记录。您可能想将try/catch放在TestFixtureSetup中,并在catch块中记录很多内容。我只是认为我可以添加一些背景(换句话说,这是我的错)。

+3

@Mike - 谢谢!顺便说一下,我对NUnit的投诉很少 - 只要我一直在使用.NET,我一直在愉快地使用它。 – TrueWill 2009-09-13 22:04:27

+0

这些天,Nunit自己报告这些信息。所以他可以简单地在NUnit-Console下运行测试,看看是什么导致了错误。真正的问题是,VS测试窗口IDE没有提供任何地方报告与特定测试无关的错误 - 实际上让人想起NUnit本身的早期版本。 – Charlie 2016-02-22 15:42:24

+1

rep推动“这不是一个重构,当你将羊改变成自动扶梯” – 2016-11-30 04:11:26

11

我会首先检查生成日志。

如果不是很明显,你可以尝试在测试中包括Console.WriteLines--我不是很积极,但我认为这些写入了构建日志。或者,你可以登录到一个文件(如果你想要花哨的话,甚至可以使用log4net)。

如果您在CI服务器上安装了Visual Studio,则可以尝试从此处运行构建/测试。如果这是一个连接问题,那可能会解决它。

但是,我已经看到路径问题,其中文件的相对路径不再正确或使用绝对路径。这些更难以调试,并且可能需要记录路径,然后检查它们是否存在于构建服务器上。

0

我有这个问题,这是由于在课堂上增加了一个私人只读Dictionary而引起的,与您添加private const string的方式大致相同。

我试图使Dictionary恒定,但你不能在编译时做到这一点。我通过将我的Dictionary放入一个返回它的方法来解决这个问题。

+0

fyi你可以使用[ReadOnlyDictionary](https://msdn.microsoft.com/en-us/library/gg712875%28v= vs.110%29.aspx) – RJFalconer 2015-08-04 12:02:17

1

我在使用Visual NUnit运行SpecFlow测试时遇到了同样的错误。当我尝试从单元测试资源管理器(由Resharper提供)做同样的工作时,它提供了一些更有用的信息:不支持超过10个参数的绑定方法。我意识到我不能有超过10个参数的SpecFlow方法,必须删除测试。

1

我能够看到我没有正确创建我的测试数据库,通过快速切换到VS单元测试。在我的案例中,它能够更好地回应它失败的原因。我通常使用NUnit。 “无法创建类X的实例。错误:System.Data.SqlClient.SqlException:发生文件激活错误。物理文件名'\ DbTest.mdf'可能不正确。诊断并更正其他错误,然后重试操作。 CREATE DATABASE failed。某些列出的文件名无法创建。请检查相关错误.. “

0

我这种症状引起的字段初始化过程中出现错误。如果你在[SetUp]方法来初始化你的领域,你应该会看到一个更好的错误消息。

[TestFixture] 
internal class CommandParserTest 
{ 
    // obscure error message 
    private CommandParser parser = new CommandParser(...); 
    ... 
} 

[TestFixture] 
internal class CommandParserTest 
{ 
    private CommandParser parser; 

    [SetUp] 
    public void BeforeTest() 
    { 
     // better error message 
     parser = new CommandParser(...); 
    } 
    ... 
} 
0

我对今天这个困扰。 (1)在单独的fixture中写入另一个测试,该测试初始化​​烦人的测试夹具的一个实例,显式调用诸如TestFixtureSetUp和SetUp的安装方法(如果有的话),然后执行目标测试方法

(2)为上述新代码添加异常处理代码,并将实际异常记录/输出到某处。

6

我在创建一些集成测试时遇到了这个问题,这些测试有很长时间的运行设置,我不想复制。我最终将所有测试夹具设置逻辑封装在try/catch中。然后我添加一个SetUp方法,其唯一目的是查看灯具设置期间是否发生故障并提供更好的日志记录。

Exception testFixtureSetupException = null; 

[TestFixtureSetUp] 
public void FixtureSetup() 
{ 
    try 
    { 
     // DoTestFixtureSetup 
    } 
    catch (Exception ex) 
    { 
     testFixtureSetupException = ex; 
    } 
} 

[SetUp] 
// NUnit doesn't support very useful logging of failures from a TestFixtureSetUp method. We'll do the logging here. 
public void CheckForTestFixturefailure() 
{   
    if (testFixtureSetupException != null) 
    { 
     string msg = string.Format("There was a failure during test fixture setup, resulting in a {1} exception. You should check the state of the storage accounts in Azure before re-running the RenewStorageAccountE2ETests. {0}Exception Message: {3}{0}Stack Trace:{4}", 
      Environment.NewLine, testFixtureSetupException.GetType(), accountNamePrefix, testFixtureSetupException.Message, testFixtureSetupException.StackTrace); 
     Assert.Fail(msg); 
    } 
} 
1
运行

调试模式单元测试。您可能会在设置中发现运行时错误。

0

在情况下,它可以帮助别人: 您可以捕获该异常并把它写在控制台上的删除

喜欢的东西:

[SetUpFixture] 
public class BaseTest 
{ 
    private Exception caughtException = null; 

    [SetUp] 
    public void RunBeforeAnyTests() 
    { 
     try 
     { 
      throw new Exception("On purpose"); 
     } 
     catch (Exception ex) 
     { 
      caughtException = ex;    
     } 
    } 

    [TearDown] 
    public void RunAfterAnyTests() 
    { 
     if (caughtException != null) 
     { 
      Console.WriteLine(string.Format("TestFixtureSetUp failed in {0} - {1}", this.GetType(), caughtException.Message)); 
     }   
    } 

} 

而结果将是:

TestFixtureSetUp在IntegratedTests.Services.BaseTest中失败 - 故意使用

1

如果您在Visual Studio中使用SpecFlow和C#,请查看在测试失败后自动生成<whatever>.feature.cs文件。在public partial class <whatever>Feature行中,您应该看到一个符号,它在盘旋时会显示NUnit灯具设置失败的原因。就我而言,我的TestHooks类中的一些BeforeFeature方法不是静态的。所有的BeforeTestRunAfterTestRun,BeforeFeatureAfterFeature方法都需要是静态的。