352单元测试Java批处理代码



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

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

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

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

从概念上看,单元测试的定义是相当模糊的;如果你遵循维基百科,"你为测试所做的一切"都可以被视为单元测试。当然,按照这个透视图,您可以"单元测试"运行在批处理框架上的批处理代码。

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

记住这一点,我认为你可以做两件事:

  1. 您可以使用JUnit来驱动"集成"或"功能测试"。意思是:你可以定义做"全部事情"的测试套件——定义批次,处理它们以检查最终的预期结果。如前所述,这将是确保端到端流按预期工作的集成测试。
  2. 您查看"正常"的JUnit单元测试。意思是:您关注代码中与批处理框架"不相关"的那些方面(换句话说:注意pojo)并对它们进行单元测试。在本地;也许有嘲弄框架;而不依赖于运行代码的批处理服务。

基于@GhostCat的回答,似乎你在问如何在测试中驱动完整的工作(他的子弹1.)。(当然,单独对阅读器/处理器/写入器组件进行单元测试也是有用的。)

你的基本选项是:

  1. 使用Arquillian(参见这里的Arquillian和Liberty入门链接)在服务器上运行测试,但要让Arquillian处理将应用部署到服务器和收集结果的任务。

  2. 编写自己的servlet驾驭器,通过JobOperator接口驱动作业。从@aguibert对这个问题的回答开始。请注意,您可能希望编写自己的简单例程,以轮询jobeexecution的"完成"状态之一(COMPLETED、FAILED或STOPPED),除非您的作业有其他方法让提交者知道。


另一个要记住的技术是启动bean。您可以通过使用如下的启动bean启动服务器来运行作业:

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

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

相关内容

  • 没有找到相关文章

最新更新