Ошибка интеграции TeamCity NUnit - Всегда появляется сообщение «Не удалось найти сборку nunit.framework ...»! - PullRequest
0 голосов
/ 16 августа 2010

Я пытаюсь заставить TeamCity запускать тесты NUnit, как установлено в сценарии NAnt, следующим образом:

<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>

Запуск сценария сборки вручную из командной строки на компьютере с сервером сборки / агентом запускаеттесты просто отлично, так что я знаю, что нет никаких проблем с самим сценарием сборки.Однако, когда сборка запускается из TeamCity, я всегда получаю сообщение об ошибке:

"Не удалось найти nunit.Framework сборки"

Я сталкивался с соответствующим постом(http://devnet.jetbrains.net/message/5211436#5211436), который рекомендует поместить nunit.framework в то же место, где находится dll, содержащая тесты, но я уже делал это, и все еще получаю ту же ошибку. Установка в GAC не является опцией.

У кого-нибудь есть идеи, как это исправить? Я потратил часы, пытаясь выяснить, в чем может быть проблема, но я не понимаю, что я могу делать неправильно.

Спасибо

Ниже приведены точные ошибки и трассировка стека:

[23:48:02]: Запустите TeamCity NUnit Test Runner

[23:48:02]:

Ошибка NUnit: System.IO.FileNotFoundException: не удалось загрузить файл или сборку 'nunit.framework, версия = 2.4.8.0, Culture = нейтральный, PublicKeyToken = 96d09a1eb7f44a77' или одна из ее зависимостей. Системе не удалось найтиуказанный файл. Имя файла: 'nunit.framework, Version = 2.4.8.0, Culture = нейтральный, PublicKeyToken = 96d09a1eb7f44a77 '

Трассировка стека сервера: в System.Reflection.Assembly._nLoad (имя_файла_имя_символов, имя_строки, строка кода, сборка доказательств, Boolean forIntrospection) в System.Reflection.Assembly.nLoad (AssemblyName fileName, String codeBase, Evidence AssemblySecurity, Location AssemblyHint, StackCrawlMark & ​​stackMark, Логическое значение throwOnFileNotFound, Boolean дляIntrospectionstackMark, логическое значение forIntrospection) в System.Reflection.Assembly.Load (AssemblyName assemblyRef) в NUnit.Core.TestFramework.FromAssembly (сборка сборки) в NUnit.Core.Builders.TestAssemblyBuilder.Load (путь строки) в NUnnit.TestAssemblyBuilder.Build () в NUnit.Core.Builders.TestAssemblyBuilder.Build (String testName) в NUnit.Core.TestSuiteBuilder.Build (Stкольцо assemblyName, String testName) в NUnit.Core.SimpleTestRunner.Load (String assemblyName, String testName) в NUnit.Core.SimpleTestRunner.Load (String assemblyName) в NUnit.Core.ProxyTestRunner.Load. Nore.ProxyTestRunner.Load (String assemblyName) в System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage (IntPtr md, Object [] args, Объектный сервер, Int32 methodPtr, логическое fExecuteInContext, Object [] & outAruntime)Messaging.)

Исключение, переброшенное в [0]: в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData)a, тип Int32) в NUnit.Core.TestRunner.Load (String assemblyName) в JetBrains.TeamCity.NUnitLauncher.NUnitRunner.LoadTest (строковый testAssembly, String testName, TestRunner runner) в c: \ Agent \ work \ nsf\ src \ NUnit-2.2 \ NUnitRunner.cs: строка 33 в JetBrains.TeamCity.NUnitLauncher.AssemblyTest.LoadTestDomain () в c: \ Agent \ work \ e34bdcb45e12f223 \ src \ NUnitLauncT.TeamCity.NUnitLauncher.LoadTestDomainAction.Action (тест AssemblyTest) в c: \ Agent \ work \ e34bdcb45e12f223 \ src \ NUnitLauncher \ src \ LoadTestDomainAction.cs: строка 14в JetBrains.TeamCity.NUnitLauncher.TryOneAssemblyTest.Action () в c: \ Agent \ work \ e34bdcb45e12f223 \ src \ NUnitLauncher \ src \ TryOneAssemblyTest.cs: строка 18 в JetBrains.TeamCity.NUnitLauncher.TryOneAssembly.Do () в c: \ Agent \ work \ e34bdcb45e12f223 \ src \ NUnitLauncher \ src \ TryOneAssembly.cs: строка 31

1 Ответ

0 голосов
/ 25 августа 2010

На странице свойств вашего бегуна вы установили Нант в качестве дома?Мы используем% 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>
...