6

我正在检查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 报告它们已通过。

MSDN上的文档不是很有帮助。什么可能导致此值设置为Unknown

4

2 回答 2

1

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

IE

public TestContext TestContext { get; set; }

测试运行器将自动设置属性

(这与我在 SO 上发布的另一个问题有关)

于 2014-06-16T18:16:06.253 回答
1

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

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

上面的链接提到“MSTest 工具的细节”是非即时测试结果报告的原因,所以我只能推测相同的细节可能意味着从构建服务器运行时 TestContext 不可用。

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

检查 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

于 2014-02-24T22:31:42.970 回答