【问题标题】:How to automate build, deploy and test java web application?如何自动化构建、部署和测试 Java Web 应用程序?
【发布时间】:2010-10-12 15:17:56
【问题描述】:

现在我有一个 web java 项目,它可以自动构建并部署到 JBoss,只需将 ear 存档复制到服务器目录(全部使用 Ant)。

我需要的是一种机制,不仅可以自动部署应用程序,还可以验证应用程序是否成功部署并在其上运行 HttpUnit 测试。

问题是如何自动监控部署过程以等待部署完成的那一刻,并且只有在运行测试之后。因此,我想“一键”构建、部署、运行测试(我为此使用 Cruise Control)。

对于解决问题的任何建议,我将不胜感激。

【问题讨论】:

    标签: ant jboss build-automation automated-tests


    【解决方案1】:

    这里需要启动容器并从构建脚本部署应用程序,然后根据部署的应用程序运行测试。这是集成测试、端到端/功能测试、ui 测试的典型需求。

    问题是我们不能只是“一劳永逸”启动容器并运行测试任务/目标。我们需要等待应用程序部署完成才能运行测试,这需要一些时间。为了确保我们可以在一切准备就绪时运行测试,构建必须启动容器并以阻塞方式部署应用程序。

    正是Cargo 的意义所在。 Cargo 是一个用于启动/停止容器和部署应用程序的 Java API。它提供了上述逻辑,可以从 Java、Ant 或 Maven 中使用。

    如果您使用的是 Maven,则构建生命周期已经为您提供了“集成测试”阶段的内容。此阶段通常用于...集成测试,并由“预集成测试”和“后集成测试”阶段包装。这是您插入货物开始/停止目标的地方。如果你使用 Ant,你可以使用 cargo 的 ant 任务。

    Mavan Jetty Plugin Configuration Guide 中描述了另一个基于 maven 的选项。这个想法和上面完全一样,只是你在“预集成测试”期间使用码头插件而不是货物来启动码头,并在“集成后测试”期间停止它。

    【讨论】:

    • Cargo 0.9 无法可靠地确定 Tomcat 是否正在运行以及应用程序是否正确部署。我恢复使用我自己的脚本,它可以杀死 Tomcat,清理 webapps 目录中的任何剩余物,等等。
    • 真的吗?这是一个已知问题吗?这当然可能是一个错误,但我从未遇到过 Cargo 和 Tomcat 的这个问题。无论如何,一个错误不会改变 Cargo 的目标。
    • 很遗憾 Cargo 目前不支持热部署 over ant task,但这是我自己添加此支持的原因。
    • 我不确定你所说的 hot deployment over ant task 是什么意思。根据cargo.codehaus.org/Ant+support,可以使用 Cargo 的 Ant 任务进行部署。
    【解决方案2】:

    创建一个基础测试类,所有其他测试都从该类派生。它必须是抽象的,因此自动单元测试收集器不会尝试运行它。

    在该类中,将此代码添加到 setUp():

    if (checkIsDeployed) {
        ... run code to verify your app is ready for testing and wait until it is ...
        checkIsDeployed = true;
    }
    

    checkIsDeployed 必须是静态的。

    【讨论】:

    • 所以验证部署状态的唯一方法是“ping”我的应用程序,如果没有答案,请等待并再次 ping 一段时间?
    • 是的;没有办法让你的容器发送一个 webapp 准备好的事件。实际上,您的应用程序永远不会“准备好”,因为容器会尝试尽可能地延迟加载。这就是我从不使用 mockrunner 内联部署和运行所有测试的原因。
    • 您可以让一个工具为您完成这项工作,并在完成后运行您的测试。请参阅我在 Cargo 上的回答。
    【解决方案3】:

    另一种选择是使用JBoss Server Ant Tasks

    这些任务的好处是它们会阻塞直到 JBoss 完全启动,所以不需要轮询。如果 JBoss 未能在所需的超时时间内启动,它们也会失败,并且如果由于某些错误而无法关闭 JBoss,它们将尝试在 JVM 关闭时关闭 JBoss。我相信这些任务用于 JBoss 测试套件。

    我也听说过 Cargo 的好消息。它的好处是您的构建脚本不是 JBoss 特定的。据我所知,我认为 JBoss Cargo 插件是由一些 JBoss 人员维护的。

    【讨论】:

      【解决方案4】:

      您可以考虑使用 hudson 构建引擎:https://hudson.dev.java.net/ 来帮助您在特定时间触发事件。

      我知道可以使用 hudson 来运行单元测试,并且可以通过调用 ant 来实现自动部署。

      卡尔

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-03
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多