Вы не можете получить доступ к TestResult
объекту в TestCleanup
, потому что он еще не существует на данном этапе.Время, проведенное в TestCleanup
и TestInitialize
, объединяется в свойство TestResult.Duration
во время выполнения теста.Вы можете легко проверить это, вставив что-то вроде:
[TestCleanup]
public void TestCleanup()
{
Thread.Sleep(1000);
}
в ваше быстрое выполнение TestMethod
.Или вы можете проверить Invoke
метод на TestMethodInfo
: https://github.com/microsoft/testfx/blob/167533cadfd2839641fc238d39ad2e86b4262be1/src/Adapter/MSTest.CoreAdapter/Execution/TestMethodInfo.cs#L127
Этот метод запустит ваш тест.Вы можете увидеть, где размещены watch.Start()
и watch.Stop()
и где выполняется метод ExecuteInternal
.Этот метод будет запускать RunTestInitializeMethod
и RunTestCleanupMethod
между Start
и Stop
.
Ваше единственное решение - объединить все TestResults из вашего тестового класса и затем получить к ним доступ в вашем методе ClassCleanup.
Вы можете сделать это, реализовав свой собственный TestMethodAttribute
и переопределив метод Execute
.Затем вы можете сохранить все результаты в статическом свойстве - Results
в TestResultCollection
классе - и получить к нему доступ в методе TestCleanup
.Вот небольшой пример:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
namespace UnitTestProject
{
[TestClass]
public class UnitTest
{
[ClassCleanup]
public static void ClassCleanUp()
{
// Save TestResultCollection.Results in csv file
}
[MyTestMethod]
public void TestMethod()
{
Assert.IsTrue(true);
}
}
public static class TestResultCollection
{
public static Dictionary<ITestMethod, TestResult[]> Results { get; set; } = new Dictionary<ITestMethod, TestResult[]>();
}
public class MyTestMethodAttribute : TestMethodAttribute
{
public override TestResult[] Execute(ITestMethod testMethod)
{
TestResult[] results = base.Execute(testMethod);
TestResultCollection.Results.Add(testMethod, results);
return results;
}
}
}
Имейте в виду, что это больше похоже на взлом, а не на правильное решение.Лучшим вариантом было бы реализовать свой собственный csv logger и запустить его с vstest.console.exe
с переключателем csv
.