2011-11-18 56 views
11

我們使用VS 2010測試運行器(MSTest)進行自動功能測試。當我們從Visual Studio運行測試時,VS創建一個名爲QTAgent32.exe的進程,並在該進程中運行測試。我可以強制MSTest爲每次測試運行使用一個新進程嗎?

我們發現,當我們進行多次測試運行時,MSTest將重新使用相同的QTAgent32進程 - 進程ID不會改變。這對我們來說是個問題,因爲我們正在測試的代碼是P /調用到非託管DLL。在進程的生命週期中,DLL只需要初始化一次。我們有一個[AssemblyInitialize]方法,但是每次測試運行一次。如果我們執行多個測試運行,它將在同一個進程中執行多次。

每次我們做測試運行時,MSTest都會創建一個新的appdomain;但是這些應用程序域都處於相同的過程中。

所以我想知道:有沒有辦法告訴Visual Studio測試運行器每次運行測試時都要使用新進程?我查看了「.testsettings」配置,但沒有看到任何相關的內容。

+2

只是爲了我的好奇心 - 是否可能在每次使用FreeLibrary進行連續測試後卸載非託管DLL? –

+0

謝謝Wiktor - 很好的建議。目前代碼只是靜態引用非託管API,在C#extern函數聲明中使用[DllImport]屬性。我認爲.NET在appdomain被拆除時不會自動釋放庫,因爲我們正在收到錯誤。我實際上不知道如何從C#代碼調用動態加載的DLL - 你可以調用LoadLibrary()和GetProcAddress(),然後以某種方式將返回的函數指針轉換爲委託類型?無論如何,我會研究它 - 謝謝!我只是發現這可能有所幫助:http://www.codeproject.com/KB/cs/dyninvok.aspx –

回答

6

不知道你想多遠去用它,但一個解決方案可能是創建單元測試主機

http://technet.microsoft.com/fr-fr/query/bb166558

此鏈接顯示瞭如何創建適配器,你也可以再發動新處理過程中,創建管道通信並在測試後將其撕下。

我知道MS本身使用不同的主機下的痣

http://research.microsoft.com/en-us/projects/pex/molestutorial.pdf

+0

謝謝!我會檢查一下。我沒有意識到你可以創建一個自定義主機。現在我們正在尋找是否有不同的測試運行者(例如Gallio Icarus),每次都可以在新進程中運行測試。在構建服務器上進行交互式開發和測試時,這確實只是一個問題,我們在單個測試過程中只進行一次測試。 –

1

我能讀到FreeLibrary則Wiktor的的評論後,得到這個工作()運行測試。

我使用了由Mike Stall創建的this class,它提供了LoadLibrary,GetProcAddress和FreeLibrary的包裝。這樣,我可以在每次測試運行中加載一次庫,調用必要的方法,然後在測試運行結束時釋放庫。

Mike Stall的代碼使用Marshal.GetDelegateForFunctionPointer,它將非託管函數指針轉換爲託管代表類型。

我必須用委託類型的聲明替換[DllImport] extern聲明。因此,我將這筆:

[DllImport("asesignal.dll")] 
public static extern bool ASESDK_Initialize(string licenseCode); 

這樣:

public delegate bool ASESDK_Initialize(string licenseCode); 

邁克失速的代碼包含與泛型委託(動作<牛逼>等)的例子。但我無法得到這個工作,所以我創建了自己的委託類型。

我可以動態加載DLL是這樣的:

_ht = new UnmanagedLibrary(@"c:\windows\system32\asesignal.dll"); 

要調用函數,我這樣做:

var function = _ht.GetUnmanagedFunction<ASESDK_Initialize>("ASESDK_Initialize"); 
function(licenseCode); 

感謝Wiktor的和NP-很難對你有所幫助!

0

VS 2013和轉發現在有一個測試>測試設置>保持測試執行引擎運行的設置。取消選中此選項將啓動每次運行的新引擎。

相關問題