[英]Receive Test Run start/finish with DTE2 interface in Visual Studio extension
有沒有辦法在visual studio擴展中訂閱Test Explorer事件? 我沒有在DTE2界面中找到類似的東西。 我的目標是在測試運行完成時從擴展觸發一些功能(對於從Test Explorer運行的測試)
謝謝!
感謝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();
});
您需要的接口可通過Microsoft.VisualStudio.TestWindow.Interfaces.dll程序集中的MEF獲得。
您需要通過MEF和[Import]
IOperationState
實例公開您的擴展,或使用IComponentModel
接口(為SComponentModel
服務返回)來訪問IOperationState
。 從那里,您希望向IOperationState.StateChanged
事件添加事件處理程序,並查找State
屬性以包含TestOperationStates.TestExecutionFinished
標志。
我非常抱歉缺少鏈接,但我在MSDN中找不到任何關於此的信息。
編輯:關於兼容性的兩個評論。
bindingRedirect
。這意味着您將被迫為Visual Studio 2012和Visual Studio 2013部署單獨的擴展,或者“聰明地”了解動態加載擴展代碼的方式(后者超出了本答案的范圍,但我已將它用於某些情況,例如需要訪問特定於版本的IntelliSense資源的繼承保證金擴展) 。 樣本VS 2017
使用MEF和ITestContainerDiscoverer導出類型的示例。 但要注意這可能在VS 2019中消失了!
[Export(typeof(ITestContainerDiscoverer))]
[Export(typeof(Testything))]
internal class Testything : ITestContainerDiscoverer
{
[ImportingConstructor]
internal Testything([Import(typeof(IOperationState))]IOperationState operationState)
{
operationState.StateChanged += OperationState_StateChanged;
}
public Uri ExecutorUri => new Uri("executor://PrestoCoverageExecutor/v1");
public IEnumerable<ITestContainer> TestContainers
{
get
{
return new ITestContainer[0].AsEnumerable();
}
}
public event EventHandler TestContainersUpdated;
private void OperationState_StateChanged(object sender, OperationStateChangedEventArgs e)
{
if (e.State == TestOperationStates.TestExecutionFinished)
{
var s = e.Operation;
}
}
}
可以在這里找到更多的東西https://www.fuget.org/packages/Microsoft.VisualStudio.TestWindow.Interfaces/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.