为什么在TeamCity上运行测试时UnitTestOutcome设置为Unknown?

时间:2013-12-10 14:32:28

标签: c# selenium-webdriver mstest teamcity-8.0

我在TestContext.CurrentTestOutcome方法中检查TestCleanup,以便在测试未通过时执行操作(在这种情况下,测试使用Selenium来运行网站,我正在保存屏幕截图,如果测试没有通过)。

private static TestContext _testContext;

private static IWebDriver _driver;

[ClassInitialize]
public static void SetupTests(TestContext testContext)
{
    _testContext = testContext;
    _driver = new FirefoxDriver();
}

[TestCleanup]
public void TeardownTest()
{
    if (_testContext.CurrentTestOutcome != UnitTestOutcome.Passed)
    {
        var fileName = Path.Combine(
            Environment.CurrentDirectory,
            string.Format("{0}.{1}.gif", _testContext.FullyQualifiedTestClassName, _testContext.TestName));

        ((ITakesScreenshot)driver).GetScreenshot().SaveAsFile(fileName, ImageFormat.Gif);

        Console.WriteLine("Test outcome was {0}, saved image of page to '{1}'", _testContext.CurrentTestOutcome, fileName);
    }
}

使用ReSharper在本地开发PC上运行时效果很好,但在我们的构建服务器(使用TeamCity)上,UnitTestOutcome始终为Unknown,但TeamCity会将其报告为已通过。

documentation on MSDN不是很有帮助。什么可以导致此值设置为Unknown

2 个答案:

答案 0 :(得分:1)

根据http://confluence.jetbrains.com/display/TCD8/MSTest+Support,TeamCity不支持单个测试结果的即时报告,它会解析测试结果文件,以便将结果提供给构建步骤。

这将解释TeamCity如何能够将测试报告为已通过,即使在单个测试完成时UnitTestOutcome可能未知。

上面的链接提到了“MSTest工具的细节”作为非实时测试结果报告的原因,因此我只能理解相同的细节可能意味着从构建服务器运行时TestContext不可用。

此外,TestContext.CurrentTestOutcome的MSDN文档确实提到需要直接调用方的完全信任。 TeamCity可能只是部分信任的方式执行测试,因此导致测试结果为Unknown。

检查MSTest是否是您的问题的一种快速方法是使用以下方法切换到NUnit:

#if NUNIT
using NUnit.Framework;
using TestClass = NUnit.Framework.TestFixtureAttribute;
using TestMethod = NUnit.Framework.TestAttribute;
using TestInitialize = NUnit.Framework.SetUpAttribute;
using TestCleanup = NUnit.Framework.TearDownAttribute;
using IgnoreAttribute = NUnit.Framework.IgnoreAttribute;
#else
using Microsoft.VisualStudio.TestTools.UnitTesting;
using IgnoreAttribute = Microsoft.VisualStudio.TestTools.UnitTesting.IgnoreAttribute;
#endif

您必须在TeardownTest方法中执行类似操作才能使用NUnit TestContext.CurrentContext.Result.Status

答案 1 :(得分:1)

此问题的解决方法是使用TestContext的公共属性,而不是使用传递给[ClassInitialize]方法的参数。

public TestContext TestContext { get; set; }

测试运动员将automatically set the property

(这与另一个问题posted on SO

有关