2

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

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

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

4

2 回答 2

2

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

您的基本选择是:

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

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


要记住的另一种技术是启动 bean。您可以简单地通过使用启动 bean 启动服务器来运行您的作业,例如:

@Startup
@Singleton
public class StartupBean {

    JobOperator jobOp = BatchRuntime.getJobOperator();

    // Drive job(s) on startup.
    jobOp.start(...);        

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

于 2016-09-16T14:47:18.380 回答
2

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

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

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

牢记这一点,我认为您可以使用两件事:

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