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.nifigroupId>
    <artifactId>nifi-mockartifactId>
    <version>${nifi.version}version>
    <scope>testscope>
dependency>

这里我们采用nifi-mock以及一般都会带上的junit依赖来进行单元测试,同样的,在之后如果有机会的话,我也会将我是用Mockito和JUnit进行单元测试的方法分享给大家(当然原文作者挖的这个坑并没有填上)。

在我们的测试中,有几个org.apache.nifi.utils包是需要被import的,比如TestRunnerTestRunnersMockFlowFile这三个类。

当然我们也需要在测试方法上添加@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 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的测试。(然而好像并没有之后的教程了)

你可能感兴趣的:(nifi,java学习)