簡體   English   中英

在Visual Studio擴展中使用DTE2接口接收測試運行開始/結束

[英]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中找不到任何關於此的信息。

編輯:關於兼容性的兩個評論。

  1. 這僅適用於Visual Studio 2012及更高版本。
  2. 必要的程序集(如上所述)在兩個版本的Visual Studio中具有不同的強名稱,並且Visual Studio 2013中沒有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM