【问题标题】:How to diagnose "TestFixtureSetUp Failed"如何诊断“TestFixtureSetUp 失败”
【发布时间】:2010-11-27 13:19:15
【问题描述】:

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

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

【问题讨论】:

  • 对!为什么 NUnit 不像测试失败时那样显示来自 TestFixtureSetUp 的异常详细信息和堆栈跟踪?
  • 我们应该向 NUnit 报告这个错误
  • 请在github.com/nunit/nunit-vs-adapter/issues/99为错误报告投票
  • @Colonel Panic - 容易回答的问题:因为 VS 测试窗口仅显示测试方法。我们能做的最多就是在已经很混乱的输出窗口中生成一些文本输出。请参阅 nunit 上的问题以继续讨论。

标签: nunit teamcity


【解决方案1】:

我会先检查构建日志。

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • @Mike - 谢谢!顺便说一句,我对 NUnit 几乎没有抱怨——只要我在 .NET 中工作,我就一直在愉快地使用它。
    • Nunit 这些天自己报告了这些信息。所以他可以简单地在 NUnit-Console 下运行测试,看看是什么导致了错误。真正的问题是 VS 测试窗口 IDE 没有提供任何地方来报告与特定测试没有直接关联的错误 - 事实上,这让人想起 NUnit 本身的早期。
    • rep boost “当你把羊变成自动扶梯时,这不是重构”
    【解决方案3】:

    我遇到了这个问题,它是由在课程中添加私有只读 Dictionary 引起的,与添加 private const string 的方式非常相似。

    我尝试将Dictionary 设为常量,但您不能在编译时这样做。我通过将我的 Dictionary 放入返回它的方法中解决了这个问题。

    【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我在字段初始化过程中出现错误导致此症状。如果您在 [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(...);
            }
            ...
        }
        

        【讨论】:

          【解决方案7】:

          我今天被这个困扰了。我做了以下得到实际错误。

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

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

                您可以捕获异常并将其写入 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 中失败 - 故意

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-08-03
                    • 2023-04-01
                    • 2015-06-09
                    • 2019-10-07
                    • 2012-01-12
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多