如何诊断“TestFixtureSetUp失败”

时间:2009-09-11 15:37:23

标签: nunit teamcity

我们使用TeamCity作为CI服务器,我刚开始在测试失败窗口中看到"TestFixtureSetUp Failed"

知道如何调试此问题吗?测试在我的工作站上运行良好(VS2008中的R#test runner)。

11 个答案:

答案 0 :(得分:23)

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

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

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

答案 1 :(得分:11)

我先检查Build Log。

如果不是很明显,你可以尝试在测试中包含Console.WriteLines - 我不是肯定的,但我认为这些都是写在Build Log中的。或者你可以登录到一个文件(如果你想获得想象,甚至可以使用log4net)。

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

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

答案 2 :(得分:7)

我今天遇到了这个问题,在创建一些我不想复制的长时间运行设置的集成测试时。我最终将所有测试夹具设置逻辑包装在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);
    }
 }

答案 3 :(得分:1)

使用Visual NUnit运行任何使用SpecFlow的测试时,我遇到了同样的错误。当我尝试从单元测试资源管理器(由Resharper提供)执行相同操作时,它提供了一些更有帮助的消息:不支持具有10个以上参数的绑定方法。我意识到我不能拥有超过10个参数的SpecFlow方法,不得不删除测试。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

我遇到了这个问题,这是因为在类中添加了一个私有只读Dictionary,这与添加private const string的方式非常相似。

我试图使Dictionary成为常量但你不能在编译时这样做。我通过将Dictionary放在一个返回它的方法中来解决这个问题。

答案 8 :(得分: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(...);
    }
    ...
}

答案 9 :(得分:0)

今天我对此感到不安。我做了以下操作以获得实际错误。

(1)在另一个夹具中编写另一个测试,初始化一个麻烦的测试夹具的实例,显式调用TestFixtureSetUp和SetUp等设置方法,然后执行目标测试方法。

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

答案 10 :(得分:0)

如果它可以帮助某人: 您可以捕获异常并将其写入TearDown

的控制台中

类似的东西:

[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中失败 - 故意