为什么一些vstest活动没有被提出?

时间:2018-04-01 19:16:14

标签: c# vstest

我通过vstest实现ITestLogger接口创建了简单的Microsoft.VisualStudio.TestPlatform.ObjectModel.Client记录器。但我无法处理某些事件(例如TestRunMessage)。这是我的简单记录器。

[ExtensionUri("logger://SimpleLogger")]
    [FriendlyName("SimpleLogger")]
    public class SimpleLogger : ITestLogger
    {
        public void Initialize(TestLoggerEvents events, string testRunDirectory)
        {
            events.TestRunMessage += TestRunMessageHandler;
            events.TestResult += TestResultHandler; 
            events.TestRunComplete += TestRunCompleteHandler; 
            events.TestRunStart += TestRunStartHandler; 
            events.DiscoveredTests += DiscoveredTestsHandler;
            events.DiscoveryMessage += DiscoveryMessageHandler;
            events.DiscoveryComplete += DiscoveryCompleteHandler;
            events.DiscoveryStart += DiscoveryStart;
        }

        private void TestRunStartHandler(object sender, TestRunStartEventArgs e)
        {
            Console.WriteLine("TestRunStartHandler");
        }

        private void DiscoveredTestsHandler(object sender, DiscoveredTestsEventArgs e)
        {
            Console.WriteLine("DiscoveredTests");
        }

        private void DiscoveryMessageHandler(object sender, TestRunMessageEventArgs e)
        {
            Console.WriteLine("DiscoveryMessage");
        }

        private void DiscoveryCompleteHandler(object sender, DiscoveryCompleteEventArgs e)
        {
            Console.WriteLine("DiscoveryComplete");
        }

        private void DiscoveryStart(object sender, DiscoveryStartEventArgs e)
        {
            Console.WriteLine("DiscoveryStart");
        }

        /// <summary>
        /// Called when a test message is received.
        /// </summary>
        private void TestRunMessageHandler(object sender, TestRunMessageEventArgs e)
        {
            Console.WriteLine("TestRunMessage");
        }

        /// <summary>
        /// Called when a test result is received.
        /// </summary>
        private void TestResultHandler(object sender, TestResultEventArgs e)
        {
            Console.WriteLine("TestResult");
        }

        /// <summary>
        /// Called when a test run is completed.
        /// </summary>
        private void TestRunCompleteHandler(object sender, TestRunCompleteEventArgs e)
        {
            Console.WriteLine("TestRunComplete");
        }
    }

我只能捕获三个事件:TestRunStart(在运行所有测试之前引发一次),TestResult(在每次测试后引发)TestRunComplete(在所有测试之后引发) 。我无法处理其他任何事情。我没有看到其他处理程序的控制台输出。我该如何处理测试的开始?

1 个答案:

答案 0 :(得分:1)

这里不是专家,但我快速浏览了Github上vstest的来源,并猜测vstest使用插件或代理商&#34;发现并执行测试,并从https://github.com/Microsoft/vstest/blob/21723abbc390609fd4f45853de32636d3830fe75/src/Microsoft.TestPlatform.Client/Execution/TestRunRequest.cs第163-166行我认为没有直接干净的方法。

我认为&#34; testRunCriteria&#34;第166行被发送给代理,并且启动/挂起/完成的伴随事件引用代理内执行的整批测试。之后,代理会返回具有特定结果的摘要,并且全部都是它。

你可能可以通过选择狭窄的标准来消除批处理并逐个执行测试。这种方式跟踪代理作业将等于跟踪单个测试..但是会导致测试运行得慢得多的因素。

我能想到的另一种方法是Test-Message处理程序。每条消息&#39;发送了一个级别(信息/警告/错误/ ...),并且很有可能从批处理开始每个特定测试被报告为某种类型的&#34;开始测试xyz&#34;消息的级别为“&#39;信息”。

我搜索了这样的消息,我想我在同一个文件中找到了相关的东西,在TestRunChangedEventArgs的事件处理中,第487-494行:

// Do verbose check to save perf in iterating test cases
if (EqtTrace.IsVerboseEnabled)
{
    foreach (TestCase testCase in testRunChangedArgs.ActiveTests)
    {
        EqtTrace.Verbose("InProgress is {0}", testCase.DisplayName);
    }
}
// ....
this.LoggerManager.HandleTestRunStatsChange(testRunChangedArgs)

TestRunChangedEventArgs保存ActiveTests,这似乎是当前执行的测试列表。 testCase.DisplayName暗示说。似乎事件是通过LoggerManager(ITestLoggerManager)进一步转发的,这似乎与您正在实施的ITestLogger或多或少相关。

这里是LoggerManager的相关文件:https://github.com/Microsoft/vstest/blob/2cee46f833fc73304b6cb4952bf1ac1fc240a1a6/src/Microsoft.TestPlatform.CrossPlatEngine/Client/TestLoggerManager.cs第216-228行:

    public void HandleTestRunStatsChange(TestRunChangedEventArgs e)
    {
        // ....
        foreach (TestResult result in e.NewTestResults)
        {
            this.loggerEvents.RaiseTestResult(new TestResultEventArgs(result));
        }
    }

loggerEvents似乎包含了您正在检查的事件。所以,嗯,似乎LoggerManager以TestRunChangedEventArgs的形式获取完整的信息,但它似乎只关心已完成的测试。没有其他信息传递给loggerEvents

因此,如果您未通过Message获得有关启动测试用例的任何ITestLogger,可能会尝试自行拦截ITestLoggerManagerHandleTestRunStatsChange?如果你能够达到这一点,它可以通过ActiveTests告诉你一些事情,但我觉得这个HandleTestRunStatsChange事件并不能保证每次进入运行状态的测试都会被发出。也可能它与测试执行真的不同步(意思是:代理probalby发送事件并进一步运行,而不是等待事件完成),所以如果你想抓住那个时刻在每个事件之前做一些事情测试运行..然后可能一个接一个地运行测试是唯一的方法。

所有这一切,请记住,我不知道。我只是看看看起来合理的随机位置的源代码。您可能希望将此问题重新发布为该GitHub项目的问题。您可能会获得更权威的回复:)(或者只是等待其他人的答案)