【问题标题】: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 的定义相当模糊;如果您关注维基百科,“您为测试某事所做的一切”都可以视为单元测试。当然,按照这个观点,您可以“单元测试”在批处理框架上运行的批处理代码。
但是:大多数人认为“真正的”、“有用的”单元测试不需要需要任何外部事物的存在。这样的测试可以在构建时“本地”运行。无需服务器、文件系统、网络……
记住这一点,我认为您可以使用以下两点:
- 您可以使用 JUnit 来驱动“集成”或“功能测试”。含义:您可以定义执行“完整任务”的测试套件 - 定义批次,对它们进行处理以最终检查预期结果。如前所述,这将是确保端到端流程按预期工作的集成测试。
- 您查看“正常”JUnit unit-testing。含义:您专注于代码中与批处理框架“无关”的那些方面(换句话说:注意 POJO)并对它们进行单元测试。本地;也许使用模拟框架;无需依赖真正的批处理服务来运行您的代码。
【解决方案2】:
基于@GhostCat 的答案,您似乎在问如何在测试中完成全部工作(他的项目符号 1.)。 (当然,单独对读取器/处理器/写入器组件进行单元测试也很有用。)
您的基本选择是:
使用 Arquillian(有关 Arquillian 和 Liberty 入门的链接,请参阅 here)在服务器中运行测试,但让 Arquillian 处理将应用程序部署到服务器并收集结果的任务。
-
编写您自己的 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 端口,服务器启动开销只需几秒钟。