【问题标题】:JSR:352 Unit testing Java Batch Code?JSR:352 单元测试 Java 批处理代码?
【发布时间】:2017-01-22 14:16:19
【问题描述】:

我们可以使用 JUnit 来测试 java 批处理作业吗?由于 Junit 在本地运行而 java 批处理作业在服务器上运行,我不确定如何从 JUnit 测试用例中启动作业(我尝试使用 JobOperator 类)。

如果 JUnit 不是合适的工具,我们如何对 java 批处理代码进行单元测试。

我正在使用 IBM 在 WAS Liberty 上运行的 JSR 352 实现

【问题讨论】:

    标签: junit jsr352 java-batch


    【解决方案1】:

    JUnit 首先是一个自动化测试监视器框架。含义:你可以用它来驱动各种@Test 方法。

    从概念上讲,unit tests 的定义相当模糊;如果您关注维基百科,“您为测试某事所做的一切”都可以视为单元测试。当然,按照这个观点,您可以“单元测试”在批处理框架上运行的批处理代码。

    但是:大多数人认为“真正的”、“有用的”单元测试不需要需要任何外部事物的存在。这样的测试可以在构建时“本地”运行。无需服务器、文件系统、网络……

    记住这一点,我认为您可以使用以下两点:

    1. 您可以使用 JUnit 来驱动“集成”或“功能测试”。含义:您可以定义执行“完整任务”的测试套件 - 定义批次,对它们进行处理以最终检查预期结果。如前所述,这将是确保端到端流程按预期工作的集成测试。
    2. 您查看“正常”JUnit unit-testing。含义:您专注于代码中与批处理框架“无关”的那些方面(换句话说:注意 POJO)并对它们进行单元测试。本地;也许使用模拟框架;无需依赖真正的批处理服务来运行您的代码。

    【讨论】:

      【解决方案2】:

      基于@GhostCat 的答案,您似乎在问如何在测试中完成全部工作(他的项目符号 1.)。 (当然,单独对读取器/处理器/写入器组件进行单元测试也很有用。)

      您的基本选择是:

      1. 使用 Arquillian(有关 Arquillian 和 Liberty 入门的链接,请参阅 here)在服务器中运行测试,但让 Arquillian 处理将应用程序部署到服务器并收集结果的任务。

      2. 编写您自己的 servlet 工具,通过 JobOperator 界面驱动您的工作。请参阅@aguibert 对this question 的回答作为起点。请注意,您可能需要编写自己的简单例程来轮询 JobExecution 以获取“已完成”状态之一(COMPLETED、FAILED 或 STOPPED),除非您的作业有其他方法可以让提交者知道。

        李>

      另一个需要牢记的技术是启动 bean。您只需使用以下启动 bean 启动服务器即可运行您的作业:

      @Startup
      @Singleton
      public class StartupBean {
      
          JobOperator jobOp = BatchRuntime.getJobOperator();
      
          // Drive job(s) on startup.
          jobOp.start(...);        
      

      如果您有一种独立于使用 JobOperator 接口(为此您需要在服务器中)检查作业结果的方法,这将很有用。您的测试可以简单地轮询和检查作业结果。您甚至不必打开 HTTP 端口,服务器启动开销只需几秒钟。

      【讨论】:

        猜你喜欢
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多