在Visual Studio扩展中使用DTE2接口接收测试运行开始/结束

时间:2013-12-18 03:31:08

标签: c# visual-studio visual-studio-extensions

有没有办法在visual studio扩展中订阅Test Explorer事件? 我没有在DTE2界面中找到类似的东西。我的目标是在测试运行完成时从扩展中触发一些功能(对于从测试资源管理器运行的测试)

谢谢!

2 个答案:

答案 0 :(得分:5)

感谢280Z28的回答。使用应用程序对象DTE工作代码:

using System.ComponentModel.Composition;
using Microsoft.VisualStudio.TestWindow.Extensibility;
using Microsoft.VisualStudio.ComponentModelHost;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.TestTools.Execution;

public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref Array custom)
{            
    Microsoft.VisualStudio.OLE.Interop.IServiceProvider InteropServiceProvider = application as Microsoft.VisualStudio.OLE.Interop.IServiceProvider;
    _ServiceProvider = new ServiceProvider(InteropServiceProvider);
    _ComponentModel = (IComponentModel)_ServiceProvider.GetService(typeof(SComponentModel));
    _OperationState = _ComponentModel.GetService<IOperationState>();
    _OperationState.StateChanged += _OperationState_StateChanged;
}

void _OperationState_StateChanged(object sender, OperationStateChangedEventArgs e)
{            
}

也可以通过ITestsService访问当前发现的测试。

_TestsService = _ComponentModel.GetService<Microsoft.VisualStudio.TestWindow.Extensibility.ITestsService>();

var GetTestTask = _TestsService.GetTests();
GetTestTask.ContinueWith(Task =>
{
    var DiscoveredTests = Task.Results.ToList();
});

答案 1 :(得分:4)

您需要的接口可通过MEF在 Microsoft.VisualStudio.TestWindow.Interfaces.dll 程序集中获得。

您需要通过MEF和[Import] IOperationState实例公开您的扩展程序,或使用IComponentModel接口(为SComponentModel服务返回)来访问{ {1}}。从那里,您想要为IOperationState事件添加事件处理程序,并查找IOperationState.StateChanged属性以包含State标记。

我非常抱歉缺少链接,但我在MSDN中找不到任何相关信息。

编辑:有关兼容性的两条评论。

  1. 仅适用于Visual Studio 2012及更高版本。
  2. 必要的程序集(如上所述)在两个版本的Visual Studio中具有不同的强名称,并且Visual Studio 2013中没有TestOperationStates.TestExecutionFinished。这意味着您将被迫部署 Visual Studio 2012和Visual Studio 2013的单独扩展,或者“动态”加载扩展代码的方式“聪明”(后者超出了这个答案的范围,但我在某些情况下使用它类似于继承保证金扩展,需要访问特定于版本的IntelliSense资源。)
  3. 样本VS 2017

    使用MEF和ITestContainerDiscoverer导出类型的示例。但请注意,这可能在VS 2019中消失了!

    bindingRedirect

    这里可以找到更多的东西 https://www.fuget.org/packages/Microsoft.VisualStudio.TestWindow.Interfaces/