Почему для UnitTestOutcome установлено значение «Неизвестно» при выполнении тестов в TeamCity?

Я проверяю 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, но на нашем сервере сборки (который использует TeamCity) UnitTestOutcome всегда равно Unknown, хотя TeamCity сообщает о них как о пройденных.

документация на MSDN не очень полезный. Что может привести к тому, что это значение будет установлено на Unknown?


person Richard Ev    schedule 10.12.2013    source источник
comment
Как выполняются тесты при локальном запуске? Решарпер? В Visual Studio встроены инструменты MSTest?   -  person Arran    schedule 11.12.2013
comment
@Arran - мы проводим тесты локально с помощью Resharper. Я обновил свой вопрос соответственно.   -  person Richard Ev    schedule 11.12.2013


Ответы (2)


Согласно http://confluence.jetbrains.com/display/TCD8/MSTest+Support TeamCity не поддерживает отчеты о результатах отдельных тестов «на лету», он анализирует файл результатов тестов, чтобы предоставить результаты на этапе сборки.

Это объясняет, как TeamCity может сообщать о пройденных тестах, даже если UnitTestOutcome может быть неизвестен на момент завершения отдельного теста.

В приведенной выше ссылке упоминаются «особенности инструмента MSTest» как причина для отчетов о результатах тестирования не на лету, поэтому я могу только предположить, что те же особенности могут означать, что TestContext недоступен при запуске с вашего сервера сборки.

Кроме того, документация MSDN для TestContext.CurrentTestOutcome упоминает, что требуется полное доверие для непосредственного вызывающего объекта. 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.

person thudbutt    schedule 24.02.2014

Исправление этой проблемы заключается в использовании общедоступного свойства для TestContext вместо использования параметра, переданного методу [ClassInitialize].

i.e.

public TestContext TestContext { get; set; }

Средство выполнения тестов автоматически установит свойство.

(Это связано с другим вопросом, который я опубликовал на SO)

person Richard Ev    schedule 16.06.2014