C# 在TeamCity上运行测试时,为什么UnitTestOutput设置为Unknown?

C# 在TeamCity上运行测试时,为什么UnitTestOutput设置为Unknown?,c#,selenium-webdriver,mstest,teamcity-8.0,C#,Selenium Webdriver,Mstest,Teamcity 8.0,我正在检查我的TestCleanup方法中的TestContext.CurrentTestOutput,以便在测试未通过时执行操作(在本例中,测试使用Selenium来运行网站,如果测试未通过,我将保存屏幕截图) 这在使用ReSharper的本地开发PC上运行时效果很好,但在我们的构建服务器(使用TeamCity)上,unittestoutput始终是未知的,尽管TeamCity报告它们已通过 这项建议没有多大帮助。是什么原因导致该值设置为未知?根据TeamCity不支持即时报告单个测试结果,它

我正在检查我的
TestCleanup
方法中的
TestContext.CurrentTestOutput
,以便在测试未通过时执行操作(在本例中,测试使用Selenium来运行网站,如果测试未通过,我将保存屏幕截图)

这在使用ReSharper的本地开发PC上运行时效果很好,但在我们的构建服务器(使用TeamCity)上,
unittestoutput
始终是
未知的,尽管TeamCity报告它们已通过

这项建议没有多大帮助。是什么原因导致该值设置为未知?

根据TeamCity不支持即时报告单个测试结果,它解析测试结果文件以向构建步骤提供结果

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

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

此外,的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
  • 来源

但是,要使用NUnit
TestContext.CurrentContext.Result.Status
,您必须在
TeardownTest
方法中执行类似的操作。

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

i、 e

试跑者会


(这与另一个问题I有关)

在本地运行时,测试是如何运行的?再竖琴?Visual Studio内置的MSTest工具?@Arran-我们正在使用Resharper在本地运行测试。我已经相应地更新了我的问题。
#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
public TestContext TestContext { get; set; }