2010-08-16 57 views
0

我試圖讓TeamCity的運行在一個惡性腳本設置NUnit的測試如下:TeamCity NUnit集成失敗 - 總是收到「無法找到程序集nunit.framework ...」!

<nunit2> 
    <formatter type="Xml" 
       usefile="true" 
       extension=".xml" 
       outputdir="${BuildArea.ReportsDir}" /> 

    <test assemblyname="${BuildArea.OutputDir}\Common.Tests.dll" 
      appconfig="src\Common.Tests\Tests.config" />  
</nunit2> 

手動運行從buildserver /代理計算機上的命令行構建腳本運行測試就好了所以我知道構建腳本本身沒有問題。然而,當構建從內部的TeamCity運行我總是得到錯誤:

「無法定位程序集nunit.Framework」

我遇到其中建議將NUnit的一個相關的帖子(http://devnet.jetbrains.net/message/5211436#5211436)。框架在與dll相同的位置包含測試,但我已經這樣做了,而且我仍然得到相同的錯誤。安裝到GAC不是一種選擇。

任何人有任何想法如何解決這個問題?我花了幾個小時試圖弄清楚可能是什麼問題,但我不明白我可能會做錯什麼。

由於

確切錯誤和堆棧跟蹤如下:

[23時48分02秒]:啓動的TeamCity NUnit測試轉輪

[23時48分02秒]:

NUnit錯誤:System.IO.FileNotFoundException:無法加載文件或程序集'nunit.framework,Version = 2.4.8.0,Culture = neutral,PublicKeyToken = 96d09a1eb7f44a77'或其某個依賴項。該系統找不到指定的文件。 文件名: 'nunit.framework,版本= 2.4.8.0,文化=中性公鑰= 96d09a1eb7f44a77'

服務器堆棧跟蹤: 在System.Reflection.Assembly._nLoad(的AssemblyName文件名,字符串的代碼庫,證據assemblySecurity,組件locationHint,StackCrawlMark & stackMark,布爾throwOnFileNotFound,布爾forIntrospection) 在System.Reflection.Assembly.nLoad(的AssemblyName文件名,字符串的代碼庫,證據assemblySecurity,組件locationHint,StackCrawlMark & stackMark,布爾throwOnFileNotFound,布爾forIntrospection) 在的System.Reflection .Assembly.InternalLoad(AssemblyName assemblyRef,證據assemblySecurity,StackCrawlMark & stackMark布爾forIntrospection) 在System.Reflection.Assembly.Load(的AssemblyName assemblyRef) 在NUnit.Core.TestFramework.FromAssembly(組裝組件) 在NUnit.Core.Builders.TestAssemblyBuilder.Load(字符串路徑) 在NUnit.Core .Builders.TestAssemblyBuilder.Build() 在NUnit.Core.Builders.TestAssemblyBuilder.Build(字符串測試名) 在NUnit.Core.TestSuiteBuilder.Build(字符串的AssemblyName,字符串測試名) 在NUnit.Core.SimpleTestRunner.Load(字符串的AssemblyName,字符串測試名) 在NUnit.Core.SimpleTestRunner.Load(字符串的AssemblyName) 在NUnit.Core.ProxyTestRunner.Load(字符串的AssemblyName) 在NUnit.Core.ProxyTestRunner.Load(字符串的AssemblyName) 在System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md,Object [] args,Object server,Int32 methodPtr,Boolean fExecuteInContext,Object [] & outArgs) at System.Runtime.Remoting.Messaging.StackBuilderSink。PrivateProcessMessage(RuntimeMethodHandle MD,對象[]指定參數時,對象服務器,的Int32 methodPtr,布爾fExecuteInContext,對象[] & outArgs) 在System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(即時聊天味精,的Int32 methodPtr,布爾fExecuteInContext)

異常[0]時重新拋出: 在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(即時聊天reqMsg,即時聊天retMsg) (MessageData & MSGDATA,的Int32類型) at NUnit.Core.TestRunner.Load(String assemblyName) at JetBrains.TeamCity.NUnitLauncher.NUnitRunner.LoadTest(String testAssembly,String testName,TestRunner runner)在c:\ Agent \ work \ e34bdcb45e12f223 \ src \ NUnitLauncher \ src \ NUnit-2.2 \ NUnitRunner.cs:line 33 at JetBrains.TeamCity.NUnitLauncher.AssemblyTest.LoadTestDomain()in c:\ Agent \ work \ e34bdcb45e12f223 \ src \ NUnitLauncher \ src \ AssemblyTest.cs:第71行 位於JetBrains.TeamCity.NUnitLauncher.LoadTestDomainAction.Action(AssemblyTest測試)位於c:\ Agent \ work \ e34bdcb45e12f223 \ src \ NUnitLauncher \ src \ LoadTestDomainAction.cs:line 14 at JetBrains.TeamCity.NUnitLauncher.TryOneAssemblyTest.Action(c)中:\代理\工作\ e34bdcb45e12f223 \ SRC \ NUnitLauncher \ SRC \ TryOneAssemblyTest.cs:線18 在JetBrains.TeamCity.NUnitLauncher.TryOneAssembly.Do(c)中:\ Agent \ work \ e34bdcb45e12f223 \ src \ NUnitLauncher \ src \ TryOneAssembly.cs:line 31

+0

同樣的問題給我。除了Moq – Dann 2010-09-06 13:22:19

+0

您是否在您的構建代理上安裝了NUnit? – 2010-11-02 12:16:59

+0

這是舊的,只是爲了日誌:這可能是一個x64的問題 - 你應該試着告訴跑步者顯式運行x86運行時(在跑步者設置中),這有助於在x64構建機器上運行測試。 – galaktor 2011-06-06 14:52:06

回答

0

在您的跑步者屬性頁面中,您是否將Nant設置爲任何事情?我們使用%env.NANTHOME%。請注意,它是區分大小寫的。

我們還必須爲teamcity創建一個單獨的單元測試目標,因此我們稱目標爲:clean compile run-unit-tests-teamcity。

下面是我們的目標提取,整理了一下。

<target name="run-unit-tests"> 
    <property name="test.executable" value="tools\nunit\nunit-console.exe"/> 
    <property name="test.args" value="${test.assemblies} /xml=&quot;${build.fullpath}\test-reports\${prefix}_UnitTests.xml&quot; /nologo /exclude=WetTest" dynamic="true"/>  
    <call target="do-unit-tests"/> 
</target> 

<target name="run-unit-tests-teamcity"> 
    <property name="test.executable" value="${teamcity.dotnet.nunitlauncher}"/> 
    <property name="test.args" value="v2.0 MSIL NUnit-2.4.6 /category-exclude:WetTest ${test.assemblies}" dynamic="true"/>  
    <call target="do-unit-tests"/> 
</target> 

<!-- Run each of the unit tests in their own directory by project--> 
<target name="do-unit-tests"> 

    <!-- Run the unit tests for component1 --> 
    <property name="prefix" value="${prefix.component1}"/> 
    <property name="test.assemblies" value="component1.Common.dll component1.a.dll component1.b.dll component1.c.dll etc.dll"/> 
    <property name="test.assembly.dir" value="${build.dir}\${prefix.component1}" /> 
    <call target="do-unit-test-single-project" /> 

    <!-- Run the unit tests for component2 --> 
    <property name="prefix" value="${prefix.component2}"/> 
    <property name="test.assemblies" value="component2.Common.dll component2.a.dll component2.b.dll component2.c.dll etc.dll"/> 
    <property name="test.assembly.dir" value="${build.dir}\${prefix.component2}" /> 
    <call target="do-unit-test-single-project" /> 

</target> 

<target name="do-unit-test-single-project"> 

    <mkdir dir="${build.dir}\test-reports" /> 

    <!-- Ensure all tests have the default test config --> 
    <copy file="${build.dir}\${prefix.component1}\Tests.config" tofile="${test.assembly.dir}\Tests.config" /> 

    <echo message="Starting NUnit code coverage run..."/> 
    <property name="test.failed" value="false"/> 

    <trycatch> 
     <try> 
      <ncover program="${path::get-full-path('tools\NCover\NCover.Console.exe')}" 
        commandLineExe="${test.executable}" 
        commandLineArgs="${test.args}" 
        workingDirectory="${build.dir}\${prefix}" 
        coverageFile="${build.fullpath}\test-reports\${prefix}_Coverage.xml" 
        logFile="${build.fullpath}\test-reports\${prefix}_coverage.log" 
        > 
        <assemblies basedir="${build.dir}\${prefix}"> 
         <include name="${test.assemblies}"/> <!-- Only create the coverage for the specific project's assemblies --> 
        </assemblies> 
      </ncover> 
     </try> 
     <catch property="failure"> 
      <echo message="At least one test failed: ${failure}"/> 
      <property name="fail.message" value="${failure}"/> 
      <property name="test.failed" value="true"/> 
     </catch> 
    </trycatch> 

    <call target="create-coverage-report"/> 
</target> 

<target name="create-coverage-report"> 
    <ncoverexplorer program="tools\NCoverExplorer\NcoverExplorer.Console.exe" 
        projectName="NCoverExplorer" 
        reportType="4" 
        outputDir="${build.dir}\test-reports" 
        xmlReportName="${prefix}_CoverageReport.xml" 
        htmlReportName="${prefix}_CoverageReport.html" 
        mergeFileName="${prefix}_CoverageMerge.xml" 
        showExcluded="True" 
        satisfactoryCoverage="80" > 
     <fileset basedir="${build.dir}\test-reports"> 
      <include name="${prefix}_Coverage.xml"/> <!-- Create a coverage report for each project group--> 
     </fileset> 
     <exclusions> 
      <exclusion type="Namespace" pattern="*.Tests" /> 
     </exclusions> 
    </ncoverexplorer> 
</target> 
相關問題