2016-09-24 146 views
1

爲了測試使用DirectX的可視WPF控件庫,我創建了幾個單元測試,它們創建了DirectX場景,屏幕截圖,然後與預期圖像比較。在Teamcity構建服務器上進行單元測試D3DERR_NOTAVAILABLE

我知道這是一個脆弱的單元測試技術(視覺比較),但它可以幫助我們涵蓋大量的可能組合。

我的問題是測試在本地運行得很好,但錯誤在構建服務器失敗:

SharpDX.SharpDXException : HRESULT: [0x8876086A], Module: 
[SharpDX.Direct3D9], ApiCode: [D3DERR_NOTAVAILABLE/NotAvailable], Message: Unknown 
    at SharpDX.Result.CheckError() 
    at SharpDX.Direct3D9.D3D9.Create9Ex(Int32 sDKVersion, Direct3DEx arg1) 
    at SharpDX.Direct3D9.Direct3DEx..ctor() 

但是,如果我登錄到構建服務器並運行測試,他們通過! (見下文)

Unit Tests when run on server - pass!

構建服務器爲Windows Server 2012 R2和具有DirectX10的偏差(軟件)的驅動程序。

我懷疑related to this issue here團隊城市構建代理的用戶配置文件不允許獲取DirectX設備。我已經改變了Teamcity服務,TeamCity構建了以用戶身份登錄的代理,但仍然沒有運氣。

任何想法?

+0

可能是服務需要被允許與桌面交互? – rene

+0

就是這樣的。我不知道它是否是。)可能與否,以及b。)如果可能,如何配置它。 –

+0

oo我剛剛看到服務中的複選框 - > Teamcity Build Agent - >登錄爲!我會嘗試... –

回答

1

要運行在Teamcity代理上使用DirectX驅動程序的測試,您必須確保服務在用戶帳戶下運行(例如,不是代理服務默認的SYSTEM帳戶)。此外,該帳戶需要當前登錄到代理計算機。沒有登錄賬戶,就沒有活動桌面(DirectX初始化需要這個桌面)。

從評論中,聽起來您已經找到了如何更改服務運行的帳戶(例如,在How can I change the user identity that runs a build agent in TeamCity?中描述的)。要使用戶始終登錄服務的用戶帳戶,可以考慮配置Windows Automatic Login。您也可以手動登錄電腦,具體取決於您的設置。

作爲附加提示,遠程桌面有時會導致登錄用戶的桌面出現問題,導致DirectX初始化失敗。如果您想遠程查看代理,則可以使用VNC(或等效),但不會導致此類問題。

+0

這是一個很好的答案,但我已經嘗試過了。我已經將Teamcity構建代理和服務更改爲以用戶身份運行,啓用「允許本地桌面交互」並重新啓動服務器。然後我登錄時運行了teamcity作業(作爲遠程桌面)。測試失敗:/ –

+0

您無法使用遠程桌面登錄,因爲DirectX應用程序無法在遠程桌面會話中運行,它必須是本地登錄。如果您沒有物理訪問權限,則應考慮我在答覆中提到的自動登錄(這是本地登錄)。 – MuertoExcobito

+0

這實際上部分是不真實的。正如我在我的問題中提到的,我可以登錄到服務器,在本地運行測試(在Visual Studio中),並且它們通過。因此,在構建服務器上運行的Visual Studio實例能夠通過遠程桌面登錄時獲取DirectX設備。只有teamcity agent不能(即使它作爲用戶登錄,與桌面交互):? –

相關問題