欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Nifi初探 - 如何测试Nifi Processor

程序员文章站 2022-07-06 16:27:14
...
之前的博客简单讲了一下如何去定义一个简单的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的,比如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<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的测试。(然而好像并没有之后的教程了)