【问题标题】:Integration Testing DropWizard Apps集成测试 DropWizard 应用程序
【发布时间】:2015-02-12 17:06:36
【问题描述】:

我刚刚阅读了 DropWizard 的测试文档,并且爱上了它内置的 Integrated Testing capabilities。 TL;DR:它允许您的 JUnit 测试启动 Jetty 的内存实例,并基本上为您的 API 端点(资源方法)提供服务,因为它们将在野外存在。这使您可以使用客户端(针对localhost)实际访问您的 API 端点,并查看它们的操作/执行方式。太棒了!

我想知道是否可以使用这个DropWizardAppRule(或类似的东西)来启动/关闭我的 DropWizard 应用程序并验证没有抛出异常(烟雾测试);和

冒烟测试会很有用,因为可能有一些与初始化相关的异常会阻止应用启动(错误的配置文件等),很高兴知道这一点提前。同样,关闭时的冒烟测试也很有帮助,因为我们可能有一些东西没有正常关闭/拆除,并且可能有一个不会死的挂起线程,等等。

对正在运行的内存服务器进行压力测试并查看它在哪里推送(可能抛出 OOME?)也会很好。

所以,给定以下代码sn-p:

public class IntegrationTest {
    @ClassRule
    public static final DropwizardAppRule<TestConfiguration> RULE =
        new DropwizardAppRule<TestConfiguration>(MyApp.class, resourceFilePath("my-app-config.yaml"));

    @Test
    public void shouldStartWithNoExceptions() {
        // ???
    }

    @Test
    public void stressTest10kUsers() {
        // What exceptions could I check for to see if the server pushed over after
        // 10,000 random endpoints were hit?
    }

    @Test
    public void shouldShutdownGracefully() {
        // ???
    }
}

我问:

  1. 如何在不抛出异常的情况下测试服务器启动?
  2. 如何测试服务器是否仍在响应并且没有死机(由于压力测试)?
  3. 如何关闭服务器并确保没有引发异常或没有任何东西妨碍正常关闭?

【问题讨论】:

    标签: java jersey jetty integration-testing dropwizard


    【解决方案1】:

    1.) 我认为您的意思是异常,它会杀死 DW 应用程序,因为有一些想要的异常,例如 WebAppExceptions。所以你只需要检查你的应用程序是否正在运行。如果出现重大问题,您的 DW 应用程序将无法启动,因此无法响应请求。

    这里有一些额外的想法: a.) 如果你想测试外部依赖,在 jenkins 或本地机器上测试不是一个好主意。为了在 LIVE 环境中测试您的应用程序,您可以创建 HealthChecks 并通过 curl 或 http 客户端工具对其进行检查。你应该得到一些像这样的json:

    {"deadlocks":{"healthy":true},"database":{"healthy":true}}
    

    从外部检查这个,例如,如果健康检查信号不健康,则从负载均衡器中删除这个 DW 实例。为所有重要的事情添加一个 Healthcheck,这样您就可以确定您的应用是否健康。

    b.) 在启动您的应用程序后进行一些资源测试。如果您收到响应,您的 DW 应用程序正在运行。 c.) 检查您的日志。搜索日志级别 ERROR 或 WARN。如果条目数为零,您可以假设您的应用无异常启动。

    2.) 只需对您的资源发出 HTTP 请求;-) 响应意味着您的应用正在运行。

    3.) 我使用 ShutdownHooks。在那里我检查了所有重要的事情,例如数据库连接是否关闭...... 通常可以优雅地关闭您的应用程序。

    您可以将截取的代码添加到您的服务构造函数中。

    public YourService(){
        ...
        // In case vm shutdown
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run()
            {
                // what should be closed if forced shudown
                // ....
    
                LOG.info(String.format("--- End of ShutDownHook (%s) ---", APPLICATION_NAME));
            }
        });
        ...
    }
    

    如果这不是想要的答案,请提供更多信息。

    【讨论】:

    • 感谢@heapach (+1) - 我很感谢您的帮助,但您错过了我的问题的核心要点:DropWizard 提供此类用于启动服务器的内存中实例用于自动化测试目的,即在 JUnit 测试中。这就是我想要完成的,不是想办法监控生产环境。
    • 您想知道如何在 junit 中启动您的完整应用程序吗?
    • 是的@heapach,这完全正确(!),它正是 DropWizard 的DropWizardAppRule 声称要做的。这样做的目的是使用 JUnit 作为自动化测试工具,以针对全口径运行的服务进行实际的集成测试。尽管我感谢您在这里对我的问题的帮助/兴趣,但您缺乏代表使我相信您可能是 StackOverflow 的新手。您应该阅读 DropWizard 及其集成测试 API,以便更好地理解我的问题背后的背景。
    • 我会给出与@heapach 相同的答案。您无法捕获直接从集成/冒烟测试角度抛出的异常。因为它对你来说是一个黑匣子,你只能从外面检查它。 DropwizardAppRule 仅用于为您自动化测试之间的生命周期。
    猜你喜欢
    • 2017-12-19
    • 1970-01-01
    • 2016-07-27
    • 2020-12-13
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    相关资源
    最近更新 更多