簡體   English   中英

我可以強制MSTest為每次測試運行使用新進程嗎?

[英]Can I force MSTest to use a new process for each test run?

我們正在使用VS 2010測試運行器(MSTest)進行自動功能測試。 當我們從Visual Studio運行測試時,VS會創建一個名為QTAgent32.exe的進程,並在該進程中運行測試。

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

每次我們進行測試運行時,MSTest都會創建一個新的appdomain; 但這些appdomains都在同一個過程中。

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

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

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

此鏈接顯示了如何創建適配器,然后您可以啟動evertest的新進程,創建管道通信並在測試后將其拆除。

我知道MS本身使用不同的主機來運行摩爾測試

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

在閱讀了Wiktor關於FreeLibrary()的評論之后,我能夠開始工作。

我使用了由Mike Stall創建的這個類 ,它提供了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);

Mike Stall的代碼包含泛型委托(Action <T>等)的示例。 但是我無法工作,所以我創建了自己的委托類型。

我可以像這樣動態加載DLL:

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

要調用函數,我這樣做:

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

感謝Wiktor和np-hard的幫助!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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