C# 为什么有些vstest事件不是';你没养大吗?

C# 为什么有些vstest事件不是';你没养大吗?,c#,vstest,C#,Vstest,通过从Microsoft.VisualStudio.TestPlatform.ObjectModel.Client实现ITestLogger接口,我创建了简单的vstest记录器。但我无法处理某些事件(例如TestRunMessage)。这是我的简单记录器 [ExtensionUri("logger://SimpleLogger")] [FriendlyName("SimpleLogger")] public class SimpleLogger : ITestLogger

通过从Microsoft.VisualStudio.TestPlatform.ObjectModel.Client实现
ITestLogger
接口,我创建了简单的
vstest
记录器。但我无法处理某些事件(例如
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");
        }
    }
[ExtensionUri(“logger://SimpleLogger")]
[FriendlyName(“SimpleLogger”)]
公共类SimpleLogger:ITestLogger
{
公共void初始化(TestLoggerEvents事件、字符串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;
}
私有void TestRunStartHandler(对象发送方,TestRunStartEventArgs e)
{
Console.WriteLine(“TestRunStartHandler”);
}
私有无效已发现测试发送器(对象发送器,已发现测试七个参数e)
{
Console.WriteLine(“发现的测试”);
}
私有void DiscoveryMessageHandler(对象发送方,TestRunMessageEventArgs e)
{
Console.WriteLine(“发现消息”);
}
私有void DiscoveryCompleteHandler(对象发送方,DiscoveryCompleteEventArgs e)
{
Console.WriteLine(“发现完成”);
}
私有void DiscoveryStart(对象发送方,DiscoveryStartEventArgs e)
{
Console.WriteLine(“发现启动”);
}
/// 
///在收到测试消息时调用。
/// 
私有void TestRunMessageHandler(对象发送方,TestRunMessageEventArgs e)
{
Console.WriteLine(“TestRunMessage”);
}
/// 
///在收到测试结果时调用。
/// 
私有void TestResultHandler(对象发送方,TestResultEventArgs e)
{
Console.WriteLine(“测试结果”);
}
/// 
///在测试运行完成时调用。
/// 
私有void TestRunCompleteHandler(对象发送方,TestRunCompleteEventArgs e)
{
Console.WriteLine(“TestRunComplete”);
}
}

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

我不是这里的专家,但我快速浏览了Github上的vstest的来源,并从vstest使用插件或“代理”发现并执行测试的事实以及第163-166行猜测,我认为没有直接干净的方法

我认为第166行中的“testRunCriteria”被发送给代理,并且伴随的启动/挂起/完成事件指的是代理内执行的整个测试批。稍后,代理返回带有特定结果的摘要,结果就到此为止

您可能可以通过选择狭义的标准来消除批处理并逐个执行测试来解决这个问题。这样,跟踪代理作业就等于跟踪单个测试。。但这可能会导致测试运行速度大大降低

我可以想到的另一种方法是测试消息处理程序。发送的每个“消息”都有一个级别(info/warning/error/),从批次开始每个特定测试很有可能被报告为某种级别为“info”的“starting test xyz”消息

我搜索了这样一条消息,我想我在同一个文件中找到了一些相关的东西,在TestRunChangedEventArgs的event hander中,第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,这似乎是当前执行的测试的列表<代码>测试用例.DisplayName提示。事件似乎是通过LoggerManager(ITestLoggerManager)进一步转发的,它似乎或多或少与您正在实现的
ITestLogger
相关

以下是LoggerManager的相关文件:第216-228行:

    public void HandleTestRunStatsChange(TestRunChangedEventArgs e)
    {
        // ....
        foreach (TestResult result in e.NewTestResults)
        {
            this.loggerEvents.RaiseTestResult(new TestResultEventArgs(result));
        }
    }
loggerEvents
似乎是您正在检查的事件的包装器。因此,嗯,LoggerManager似乎以
TestRunChangedEventArgs
的形式获得了完整的信息,但它似乎只关心已完成的测试。没有其他信息传递到
loggerEvents

因此,如果您没有收到任何关于通过
ITestLogger
启动测试用例的
消息,您可以尝试自己拦截
ITestLoggerManager
HandleTestRunStatsChange
?如果你能做到这一点,它可以通过
ActiveTests
告诉你一些事情,但是我感觉这个
handletstrunstatschange
事件并不能保证每次进入运行状态的测试都会发出。另外,它可能真的与测试执行不同步(意思是:代理可能会发送事件并进一步运行,而不是等待事件完成),因此如果您想在每个测试运行之前抓紧时间做一些事情。。那么,一个接一个地运行测试可能是唯一的方法

尽管如此,请记住我不知道。我只是在随机的地方查看源代码,这些地方看起来很合理。您可能希望将此问题作为GitHub项目的问题重新发布。你可能会得到一个更权威的回答:)(或者在这里稍等一下,等待其他人的回答)