java - 集成测试 DropWizard 应用程序

标签 java jersey jetty integration-testing dropwizard

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

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

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

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

因此,给定以下代码片段:

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. 如何关闭服务器并确保没有抛出异常或没有任何东西阻止正常关闭?

最佳答案

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

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

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

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

b.) 在启动您的应用后进行一些资源测试。如果您收到响应,您的 DW 应用程序正在运行。 c.) 检查你的日志。搜索日志级别错误或警告。如果条目为零,您可以假设您的应用启动时没有出现异常。

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));
        }
    });
    ...
}

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

关于java - 集成测试 DropWizard 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27469880/

相关文章:

java - 在 Eclipse 中发现从 Android 的方向 API JSON 数据中提取 html_instructions 的困难

rest - Jersey 文件名编码

java - 提供静态内容 Jetty Jersey Gradle

windows - 适用于 Windows 的 Jetty 服务器

java - Eclipse for Mac (OSX) 中 "build and run"的快捷方式

Java - 音标 - 将一种格式转换为 SAMPA 格式

java - 什么时候是 java.io.IOException : Connection reset by peer thrown with Netty?

java - PUT 不允许 Jersey 路径正则表达式导致方法

java - 使用 Java Jersey 和 MongoDB 的 RESTful API

tomcat - Tomcat 上的 Cometd