如何将TestComplete的结果直接发送到TeamCity

如何将TestComplete的结果直接发送到TeamCity,teamcity,testcomplete,Teamcity,Testcomplete,以前关于这个主题的一篇文章很有帮助(参见) 现在,我们的TestComplete解决方案创建了一个文本文件,MSBuild使用Microsoft.Build.Utilities.Task帮助程序将消息发送回TeamCity。不过,我想知道我们是否能做得更好 TeamCity帮助主题()说,消息“应该打印到构建的标准输出流中”。我想弄清楚的是,我可以直接从TestComplete脚本访问该流吗 我希望它能简单到: dotNET.System.Console.WriteLine_11(“##team

以前关于这个主题的一篇文章很有帮助(参见)

现在,我们的TestComplete解决方案创建了一个文本文件,MSBuild使用Microsoft.Build.Utilities.Task帮助程序将消息发送回TeamCity。不过,我想知道我们是否能做得更好

TeamCity帮助主题()说,消息“应该打印到构建的标准输出流中”。我想弄清楚的是,我可以直接从TestComplete脚本访问该流吗

我希望它能简单到: dotNET.System.Console.WriteLine_11(“##teamCity[testSuiteStarted name='Foo']”)


但这显然没有给我正确的输出流。思想?可以吗?

我正在与TeamCity和TestComplete合作。我遇到了完全相同的问题,无论您尝试做什么,您都无法向控制台写入,至少我发现不是这样。我甚至试着编写一个C#应用程序,用TestComplete中的CLR桥与之对话,但仍然一无所获

我们最终做的是创建批处理文件来处理TestExecute调用。然后我们从TeamCity调用批处理文件。要调用TestExecute,请使用以下命令(使用特定于测试的pjs文件和/p):

然后检查TestExecute返回的ERRORLEVEL属性。级别2表示测试执行失败。在这种情况下,我们使用echo语句打印以下内容:

##teamcity[testFailed name='{TestCaseID} - {TestName}' message='TestExecute reported a failure' details='See artifacts']
TestExecute关闭后,它将尝试打开日志文件。我们设置了构建服务器,这样mht文件就可以由计算器打开,因为它们需要一段时间才能打开(在Windows右键单击->使用菜单打开时将其设置为默认值)。因此,TestExecute完成后,它会打开计算器,然后我们的批处理文件会使用taskkill终止计算器

然后,我们将结果文件从TestExecute复制到指定位置(这是我们编写的一个单独的可执行文件)。我们完成测试执行并将工件发布到TestExecute:

echo ##teamcity[testFinished name='{TestCaseID} - {TestName}' duration='%milliSecondsElapsed%']
echo ##teamcity[publishArtifacts 'C:\BuildResults\{GroupName}\{TestCaseID}\*.mht']
需要注意的一点是:我们从未能够让TestExecute一次可靠地运行一个测试,因此我们实际上使用测试用例列表为每个测试用例生成单独的pjs和mds文件。然后我们在TestExecute中使用生成的pjs和mds文件。这就是上面的{GroupName}、{TestCaseID}和{TestName}变量的来源。这些都是特定于我们的实施,但您可能需要不同的指标


希望这有帮助

您遇到的问题是TestComplete不支持写入标准输出流,即使您调用CLR
控制台.WriteLine
,您正在写入名为tcHostingProcess.exe的进程,其中存在所有CLR对象

为了解决这个问题,您需要一个运行的控制台应用程序,它可以接受来自TestComplete项目的消息。有很多方法可以做到这一点,但这里有一个建议的解决方案,使用TCP/IP实现必要的IPC

在TeamCity

在TeamCity构建步骤中,您希望启动TestComplete或TestExecute过程而不中断构建脚本,然后启动一个自定义控制台应用程序,该应用程序将接收来自TestComplete的消息

start TestComplete.exe [arg1] [arg2] ...
TCConsoleHost.exe
控制台主机应用程序

控制台主机程序将启动一个
TcpListener
,一旦客户端连接,它将从生成的
NetworkStream
对象读取消息并将其打印到控制台。此程序将继续,直到从流中读取时出错(即TestComplete已退出)

消息客户端类

同样,我们可以创建一个
TcpClient
,它可以连接到我们的侦听过程并转发消息。这里真正的技巧是用静态构造函数将其包装在一个静态类中,这样一旦TestComplete加载CLR桥,它就会自动连接并准备发送消息。此示例具有TeamCity服务消息功能
SendMessage
,可自动格式化消息(包括转义单引号)

在测试完成中

现在,由于客户端将在加载CLR网桥时自动连接,因此TestComplete中唯一需要的代码是:

dotNET["TCServiceMessageClient"]["TCServiceMessageClient"]["SendMessage"]("Hello TeamCity!");
附加注释


上面的代码有几个警告,即计时、重新连接等。部署的解决方案应该对网络条件有更好的错误处理。此外,可能更希望TCMessageHost应用程序实际直接使用
System.Process
对象启动TestComplete,以便它可以更可靠地等待应用程序退出。

如果您使用TestExecute,这最近变得“相对”简单

使用以下参数执行TestExecute:

/exportlog:"log\Index.html" /SilentMode /DoNotShowLog
有关TestExecute参数的完整详细信息,请检查:

使用生成级报告设置TestComplete项目:

请注意它区分大小写

在构建配置上,在常规设置选项卡中,将生成的日志文件夹作为工件导出。

构建运行后,您将能够看到TeamCity中嵌入的测试日志:


这是使用TestComplete V14和TeamCity 2019.1调用
dotNet.System.Console.WriteLine将消息发送到进程tcProcessHost.exe的标准输出,无法直接捕获。为了从TestComplete实时报告到构建控制台,您必须执行某种类型的进程间通信(IPC)。
public static class TCServiceMessageClient
{
    static BinaryWriter writer;
    static NetworkStream stream;

    static TCServiceMessageClient()
    {
        TcpClient client = new TcpClient();
        client.Connect("127.0.0.1", 9800);

        stream = client.GetStream();
        writer = new BinaryWriter(stream);
    }

    public static void SendMessage(string message)
    {
        writer.Write(string.Format("##teamcity[message text='{0}'", message.Replace("'","|'")));
    }
}
dotNET["TCServiceMessageClient"]["TCServiceMessageClient"]["SendMessage"]("Hello TeamCity!");
/exportlog:"log\Index.html" /SilentMode /DoNotShowLog