我通过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
(在所有测试之后引发) 。我无法处理其他任何事情。我没有看到其他处理程序的控制台输出。我该如何处理测试的开始?
答案 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
,可能会尝试自行拦截ITestLoggerManager
和HandleTestRunStatsChange
?如果你能够达到这一点,它可以通过ActiveTests
告诉你一些事情,但我觉得这个HandleTestRunStatsChange
事件并不能保证每次进入运行状态的测试都会被发出。也可能它与测试执行真的不同步(意思是:代理probalby发送事件并进一步运行,而不是等待事件完成),所以如果你想抓住那个时刻在每个事件之前做一些事情测试运行..然后可能一个接一个地运行测试是唯一的方法。
所有这一切,请记住,我不知道。我只是看看看起来合理的随机位置的源代码。您可能希望将此问题重新发布为该GitHub项目的问题。您可能会获得更权威的回复:)(或者只是等待其他人的答案)