我们使用TeamCity作为CI服务器,我刚开始在测试失败窗口中看到"TestFixtureSetUp Failed"
。
知道如何调试此问题吗?测试在我的工作站上运行良好(VS2008中的R#test runner)。
答案 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
方法不是静态的。所有BeforeTestRun
,AfterTestRun
,BeforeFeature
和AfterFeature
方法都必须是静态的。
答案 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中失败 - 故意