2

以前有关此主题的帖子很有帮助(请参阅如何将 TestExecute/TestComplete 结果导出到 teamcity?

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

TeamCity 帮助主题(http://confluence.jetbrains.com/display/TCD65/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-ServiceMessages)说,消息“应该打印到构建的标准输出流中”。我想弄清楚的是,我可以直接从 TestComplete 脚本访问该流吗?

我希望它会像这样简单:dotNET.System.Console.WriteLine_11("##teamCity[testSuiteStarted name='Foo']");

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

4

3 回答 3

1

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

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

在 TeamCity 中

在 TeamCity 构建步骤中,您希望在不暂停构建脚本的情况下启动 TestComplete 或 TestExecute 进程,然后启动将接收来自 TestComplete 的消息的自定义控制台应用程序。

start TestComplete.exe [arg1] [arg2] ...
TCConsoleHost.exe

控制台主机应用程序

控制台主机程序将启动一个TcpListener,一旦客户端连接,它将从结果NetworkStream对象中读取消息并将它们打印到控制台。该程序将继续执行,直到从流中读取错误(即 TestComplete 已退出)。

class Program
{
    static void Main(string[] args)
    {
        TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 9800);
        listener.Start();
        TcpClient client = listener.AcceptTcpClient();
        NetworkStream stream = client.GetStream();
        BinaryReader reader = new BinaryReader(stream);

        while (true)
        {
            try
            {
                string message = reader.ReadString();
                Console.WriteLine(message);
            }
            catch
            {
                break;
            }
        }
    }
}

消息客户端类

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

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("'","|'")));
    }
}

在测试完成中

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

dotNET["TCServiceMessageClient"]["TCServiceMessageClient"]["SendMessage"]("Hello TeamCity!");

补充说明

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

于 2013-12-21T23:43:31.393 回答
0

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

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

start /wait TestExecute "{TestCaseID}.pjs" /r /e /p:"{TestCaseID}" /silentmode /forceconversion

然后我们检查 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} 变量的来源。这些特定于我们的实施,但您可能需要不同的指标。

希望这可以帮助!

于 2013-12-19T14:59:48.443 回答
0

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

使用以下参数执行 TestExecute:

/exportlog:"log\Index.html" /SilentMode /DoNotShowLog

有关 TestExecute 参数检查的完整概要:https: //support.smartbear.com/testexecute/docs/running/automating/command-line/command-line.html

使用构建级别报告设置您的 TestComplete 项目:

项目页面上报告选项卡的位置

请注意它是区分大小写的

在您的构建配置中,在常规设置选项卡中,将生成的日志文件夹导出为工件。 在此处输入图像描述

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

示例嵌入式项目

这是使用 TestComplete V14 和 TeamCity 2019.1

于 2019-06-06T09:28:32.477 回答