集成测试DropWizard应用程序

IAm*_*aja 6 java integration-testing jetty jersey dropwizard

我刚刚阅读了DropWizard的测试文档,并且喜欢它内置的集成测试功能.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() {
        // ???
    }
}
Run Code Online (Sandbox Code Playgroud)

我问:

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

hea*_*ach 4

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

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

{"deadlocks":{"healthy":true},"database":{"healthy":true}}
Run Code Online (Sandbox Code Playgroud)

从外部检查这一点,例如,如果运行状况检查信号不健康,则从负载均衡器中删除此 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));
        }
    });
    ...
}
Run Code Online (Sandbox Code Playgroud)

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