Получить TestResult в TestCleanup mstest c # - PullRequest
0 голосов
/ 14 июня 2019

Я хочу использовать TestResult в TestCleanup (), чтобы получить некоторую информацию о тестах. Но я не знаю, как инициализировать объект TestResult и получить его. Мне нужно то же поведение, что и у объекта TestContext.

Спасибо

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

Редактировать: Так что, если я не могу получить доступ к TestResult в TestCleanup, как я могу записать все результаты теста в CSV-файл после завершения всего теста?

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Вы не можете получить доступ к 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.

0 голосов
/ 14 июня 2019

Массив объекта TestResult возвращается атрибутом TestMethod адаптеру. Это не то, что вы можете получить доступ. Вам нужно будет получить информацию из TestContext.

https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.testtools.unittesting.testmethodattribute?view=mstest-net-1.2.0

https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.testtools.unittesting.testresult?view=mstest-net-1.2.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...