Nifi初探 - 如何测试Nifi Processor
之前的博客简单讲了一下如何去定义一个简单的Json处理Processor,这一次是在无数次测试中总算厌烦了把打包好的Nar包上传到lib中,然后重启服务器,然后再测试功能,测试的时候还很难看到日志...
同样搬运自 - > nifi.rock
对自定义开发的Processor进行Unit Test
开始
Apache Nifi框架的单元测试是基于Junit的test runners的,在他们的代码中有一些实例,现在根据我们自己的项目进行单元测试,应该会更感同身受一点。
在这一阶段,我们会将单元测试功能加入我们之前创建的JsonProcessor中。
准备工作
我们需要将之前的工程git下来,如果你没看我之前的文章,可以在这里 找到并git下来。
我们的Processor Java代码位于sha0w.pub.jsonNifi.processors这个包下,同样的,测试文件就应该在test\java目录对应的位置下。
然后我们需要在maven中添加nifi对应的依赖
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-mock</artifactId>
<version>${nifi.version}</version>
<scope>test</scope>
</dependency>
这里我们采用nifi-mock以及一般都会带上的junit依赖来进行单元测试,同样的,在之后如果有机会的话,我也会将我是用Mockito和JUnit进行单元测试的方法分享给大家(当然原文作者挖的这个坑并没有填上)。
在我们的测试中,有几个org.apache.nifi.utils包是需要被import的,比如TestRunner
、TestRunners
、MockFlowFile
这三个类。
当然我们也需要在测试方法上添加@Test
标签,在添加了这个JUnit 标签后,你就可以在方法中去初始化Nifi提供的TestRunner等组件了。
我们需要去创建一个TestRunner类,然后把我们的Processor传给它,接着对其的PropertiesDescription
进行传值,然后为了测试我们的JsonProcessor,我们使用一个ByteArrayInputStream当作传递的Flow File,同样的,你也可以使用一个本地的json文件作为资源文件。
当一个test runner创建时,使用runner.setProperties(PropertyDescriptor)
以及runner.enqueue(content)
进行值赋予。然后使用一些断言进行单元测试,测试结果情况。
Nifi简化了使用断言进行FlowFile
测试的复杂度,你可以通过Transfered
方法传递的Relationship
以及获取FlowFile
等进行断言测试,具体的代码如下:
@org.junit.Test
public void testOnTrigger() throws IOException {
// Content to be mock a json file
InputStream content = new ByteArrayInputStream("{\"hello\":\"nifi rocks\"}".getBytes());
// Generate a test runner to mock a processor in a flow
TestRunner runner = TestRunners.newTestRunner(new JsonProcessor());
// Add properites
runner.setProperty(JsonProcessor.JSON_PATH, "$.hello");
// Add the content to the runner
runner.enqueue(content);
// Run the enqueued content, it also takes an int = number of contents queued
runner.run(1);
// All results were processed with out failure
runner.assertQueueEmpty();
// If you need to read or do aditional tests on results you can access the content
List<MockFlowFile> results = runner.getFlowFilesForRelationship(JsonProcessor.SUCCESS);
assertTrue("1 match", results.size() == 1);
MockFlowFile result = results.get(0);
String resultValue = new String(runner.getContentAsByteArray(result));
System.out.println("Match: " + IOUtils.toString(runner.getContentAsByteArray(result)));
// Test attributes and content
result.assertAttributeEquals(JsonProcessor.MATCH_ATTR, "nifi rocks");
result.assertContentEquals("nifi rocks");
}
这部分就是测试onTrigger
方法的@test
方法。
之后有机会将会简介如何不使用Nifi自带的TestRunner,使用Mockito以及JUnit进行对Nifi的测试。(然而好像并没有之后的教程了)
下一篇: 扩充String类型的函数功能