我記錄了這個宏,重視對我的過程(nunit.exe)的按鈕。現在我想在我附加的過程的窗口上按下一個按鈕(名爲「運行」),但是如何?我記錄了這個宏:怎麼按上一個不同的進程(nunit.exe)
Sub DebugNUnit()
DTE.ExecuteCommand("Tools.ExternalCommand6")
'need a short delay for nunit process to appear in process list:
Threading.Thread.Sleep(200)
Try
Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
Dim dbgeng(1) As EnvDTE80.Engine
dbgeng(0) = trans.Engines.Item("Managed (v4.0)")
Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "myPC").Item("nunit.exe")
proc2.Attach2(dbgeng)
Catch ex As System.Exception
MsgBox(ex.Message)
End Try
End Sub
更新:我具有基於這樣回答
Sub DebugNUnit()
DTE.ExecuteCommand("Tools.ExternalCommand6")
'need a short delay for nunit process to appear in process list:
Threading.Thread.Sleep(200)
Try
Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
Dim dbgeng(1) As EnvDTE80.Engine
dbgeng(0) = trans.Engines.Item("Managed (v4.0)")
Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "myPC").Item("nunit.exe")
proc2.Attach2(dbgeng)
'added this because we may need a short delay for nunit gui to load
'(would prefer to replace it with a wait on some loaded event or something)
Threading.Thread.Sleep(5000)
'use Process.Handle or Process.MainWindowHandle? anyway, both do not seem to work.. are the parameters incorrect?
Dim ButtonHandle As IntPtr = FindWindowEx(System.Diagnostics.Process.GetProcessById(proc2.ProcessID).Handle, 0, "Button", "Run")
'Dim ButtonHandle As IntPtr = FindWindowEx(System.Diagnostics.Process.GetProcessById(proc2.ProcessID).MainWindowHandle, 0, "Button", "Run")
SendMessage(ButtonHandle, &HF5, 0, 0)
Catch ex As System.Exception
MsgBox(ex.Message)
End Try
End Sub
但推出NUnit的用戶界面上的「運行」按鈕(調整腳本通過Tools.ExternalCommand6)仍然沒有被按下。這是有道理的,因爲按鈕手柄似乎總是0 ..爲什麼?有沒有人有解決方案?
更新:我已經調整基於這樣
Option Strict Off
Option Explicit Off
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Public Module RecordingModule
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Boolean
End Function
Sub DebugNUnit()
DTE.ExecuteCommand("Tools.ExternalCommand6")
'need a short delay for nunit processes to appear in process list:
Threading.Thread.Sleep(1000)
Try
Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
Dim dbgeng(1) As EnvDTE80.Engine
dbgeng(0) = trans.Engines.Item("Managed (v4.0)")
Dim proc2nunitagent As EnvDTE80.Process2 = dbg2.GetProcesses(trans, Environment.MachineName).Item("nunit-agent.exe")
Dim proc2nunit As EnvDTE80.Process2 = dbg2.GetProcesses(trans, Environment.MachineName).Item("nunit.exe")
proc2nunitagent.Attach2(dbgeng)
PostMessage(System.Diagnostics.Process.GetProcessById(proc2nunit.ProcessID).MainWindowHandle, &H100, Keys.Alt Or Keys.R, IntPtr.Zero)
Catch ex As System.Exception
MsgBox(ex.Message + Environment.NewLine + ex.StackTrace)
End Try
End Sub
End Module
我使用NUnit 2.5.7編輯的答案,用於連接和調試腳本工作,你需要附加到NUnit的代理和在nunit gui上運行,可以附加到nunit gui的更新版本的nunit。
上面的腳本使NUnit的調試從只有Visual Studio和NUnit的二進制文件的Visual Studio IDE中。您只需將nunit設置爲外部工具(將當前項目作爲參數),創建自定義工具欄,然後將按鈕添加到使用上述腳本的工具欄中。這將啓動nunit,附加到它,開始運行測試,並在您的斷點處斷開。
還有一件事:在nunit gui中,在Tools - > Settings - > Tree Display中禁用「Save Visual state of each Project」,或者nunit gui會記住最後一次運行測試,如果那不是那個你想調試。
可能的改進:建造開始之前NUnit的。
如果你只是想調試你的單元測試,我建議你得到像TestDriven.NET或ReSharper的東西。它們都允許您輕鬆地在Visual Studio中調試您的測試。 – 2012-01-16 09:58:49
我對這些工具很熟悉,但它們不是免費軟件,像VisualNUnit這樣的免費軟件工具不夠可靠。除此之外,我快到了......我現在需要的是按鈕句柄,而且我有自己的自定義工具欄,並帶有一個按鈕,該按鈕爲當前項目啓動NUnit,附加到它,運行測試並斷開我的斷點。 – mtijn 2012-01-16 10:04:54
Visual NUnit是開源的,與免費軟件相對;你總是可以修復它...? – 2012-01-16 11:37:37