CruiseControl.Net和NUnit - 测试完成,但任务未结束?

3
我有一个使用Nant设置的CruiseControl.Net,可以清理之前的日志,然后启动VS项目的msbuild,最后运行nunit-console执行测试。
它似乎会构建几秒钟(很好),然后跳到运行600个测试,大约需要一分钟。但是即使日志文件已经存在,它也会在那里“无所事事”10分钟,此时构建超时并退出进程。然后,CruiseControl.NET网页显示结果为失败,并出现异常:
ThoughtWorks.CruiseControl.Core.Tasks.BuilderException: Command Line Build timed out (after 600 seconds)
   at ThoughtWorks.CruiseControl.Core.Tasks.ExecutableTask.Execute(IIntegrationResult result)
   at ThoughtWorks.CruiseControl.Core.Tasks.TaskBase.Run(IIntegrationResult result)
   at ThoughtWorks.CruiseControl.Core.Project.RunTask(ITask task, IIntegrationResult result, Boolean isPublisher)
   at ThoughtWorks.CruiseControl.Core.Project.RunTasks(IIntegrationResult result, IList tasksToRun, Dictionary`2 parameterValues)
   at ThoughtWorks.CruiseControl.Core.Project.Run(IIntegrationResult result)
   at ThoughtWorks.CruiseControl.Core.IntegrationRunner.Build(IIntegrationResult result)
   at ThoughtWorks.CruiseControl.Core.IntegrationRunner.Integrate(IntegrationRequest request) BaseDirectory: , Executable: C:\Program Files\NUnit 2.5.8\bin\net-2.0\nunit-console.exe

以下是ccnet.config脚本。我尝试将超时时间更改为3分钟,以防这与问题有关,但即使如此(它没有起作用),这也是一个不可靠的hack,因为在测试完成运行后,它们应该正常退出!

我已经在命令行中运行了该命令,并确认它只需要约1分钟才能运行。有什么理论吗?

<cruisecontrol xmlns:cb="urn:ccnet.config.builder">

    <project name="CodeTests">
      <workingDirectory>C:\Source\Wholesale\Comp.EventControl.TestingFramework\</workingDirectory>
      <artifactDirectory>C:\Source\Wholesale\Comp.EventControl.TestingFramework\</artifactDirectory>

    <prebuild>
    <!-- clean nunit output to avoid CCNET reporting
           about previous build tests if current build fails -->
      <nant>
        <executable>C:\Nant\bin\nant.exe
        </executable>
        <baseDirectory>C:\Source\Wholesale\Comp.EventControl.TestingFramework</baseDirectory>
        <nologo>false</nologo>
        <buildFile>nant.build</buildFile>
        <targetList>
          <target>cleanNunit</target>
        </targetList>
      </nant>
    </prebuild>

    <tasks>
        <msbuild>
            <executable>C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
            </executable>
            <workingDirectory>C:\Source\Wholesale\Comp.EventControl.TestingFramework\CodeReboot
            </workingDirectory>
        <projectFile>CodeReboot.sln</projectFile >
            <buildArgs>/noconsolelogger 
            /v:quiet 
            /noconlog 
            /p:Configuration=Debug
            /p:ReferencePath="C:\Program Files\NUnit 2.5.8\bin;C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
            /p:AdditionalReferencePath="C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
            </buildArgs>
            <targets>ReBuild</targets >
            <timeout>180</timeout >
            <logger>c:\Program Files\CruiseControl.NET\server\Rodemeyer.MsBuildToCCNet.dll</logger>

        </msbuild>
        <exec>
            <executable>C:\Program Files\NUnit 2.5.8\bin\net-2.0\nunit-console.exe
            </executable >
            <buildArgs>/xml:C:\Source\Wholesale\Comp.EventControl.TestingFramework\nunit-results.xml
            /nologo C:\Source\Wholesale\Comp.EventControl.TestingFramework\CodeReboot\CodeReboot\bin\Debug\CodeReboot.dll
            </buildArgs>
        </exec>
    </tasks>
    <publishers>
      <merge>
        <files>
          <file>C:\Source\Wholesale\Comp.EventControl.TestingFramework\nunit-results.xml
          </file>
        </files>
      </merge>
      <xmllogger />
      <statistics />
      <artifactcleanup cleanUpMethod="KeepLastXBuilds"
        cleanUpValue="20" />
    </publishers>

    </project>
</cruisecontrol>

你的测试中是否有一个打开新图形窗口的功能? - Benjamin Baumann
不,它们都是 API 命令行测试。 - Mark Mayo
2个回答

4

您使用的是哪个版本的nunit?在2.5.7/2.5.8版本中存在一些问题,会导致nunit-agent在测试结束时挂起。我曾经遇到过这个问题,并回退到较旧的nunit版本,挂起问题就解决了。在2.5.9的发布说明中,他们展示了"602761 nunit-agent在测试完成后挂起"已经被修复。我还没有升级到2.5.9,但那可能会解决您的问题。


哦,好的发现!现在正在尝试2.5.9版本,如果失败了,我可能会回退到之前使用过的2.4.7版本。稍后会汇报结果。 - Mark Mayo
+1000,2.5.9已经解决了卡顿问题,现在运行得非常好。现在我只需要解决发布器中的合并文件部分。非常感谢! - Mark Mayo
顺便问一下,您的构建服务器是否使用与本地开发人员机器相同的nunit版本? - Mark Simpson
在我的情况下 - 是的。问题可能是通过CruiseControl.NET服务进程在构建机器上运行nunit,而不是从开发人员的机器上登录的交互式桌面运行nunit。 - Brian Walker

1

你应该首先尝试在本地复制问题。你的测试能够正确运行并顺利退出吗?在本地运行它们,看看是否有nunit进程仍然存在。

如果你的测试在本地正常运行,请尝试找出构建服务器在哪个测试上停滞,或者它是否完成了所有的测试。如果你的构建脚本无法在本地运行,那么诊断起来会稍微困难一些。

在我们的测试中还使用了大量线程编码时,几乎总是出现一个测试(或被测试代码)创建了线程但未能关闭它们,导致NUnit仍然运行。线程问题很让人头疼,因为它们是非确定性的,只有在拥有更多内核的机器上(比如...构建服务器)运行时才可见。

如果你的测试涉及到线程/外部依赖,我建议首先禁用它们(600个测试需要一分钟运行的事实表明涉及了外部依赖和/或线程,因为一个单元测试通常只需要约1毫秒运行)。


我在本地的 DOS 窗口中运行了它们。它们大约需要一分钟才能运行,有一些失败测试的异常(它们都是 API 测试),但它们确实可以完全执行。 - Mark Mayo
通过脚本完成后,日志文件已经生成,我可以查看其中的内容,但是进程会一直挂起直到超时。 - Mark Mayo
已与开发人员核实,据他们所知目前没有进行多线程处理。 - Mark Mayo
这是一个好主意,我会尝试运行测试的子部分,并查看它是否正常退出... - Mark Mayo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接