Testing 用嵌入式卡夫卡测试Flink

Testing 用嵌入式卡夫卡测试Flink,testing,apache-kafka,integration-testing,apache-flink,flink-streaming,Testing,Apache Kafka,Integration Testing,Apache Flink,Flink Streaming,我有一个简单的Flink应用程序,它总结了在最后一分钟内具有相同id和时间戳的事件: DataStream<String> input = env .addSource(consumerProps) .uid("app"); DataStream<Event> events = input.map(record -> mapper.readValue(record, Event.class)); p

我有一个简单的Flink应用程序,它总结了在最后一分钟内具有相同id和时间戳的事件:

DataStream<String> input = env
                .addSource(consumerProps)
                .uid("app");

DataStream<Event> events = input.map(record -> mapper.readValue(record, Event.class));

pixels
        .assignTimestampsAndWatermarks(new TimestampsAndWatermarks())
        .keyBy("id")
        .timeWindow(Time.minutes(1))
        .sum("constant")
        .addSink(simpleNotificationServiceSink);


env.execute(jobName);


private static class TimestampsAndWatermarks extends BoundedOutOfOrdernessTimestampExtractor<Pixel> {
        public TimestampsAndWatermarks() {
            super(Time.seconds(90));
        }

        // timestampReadable is timestamp rounded on minutes, in format yyyyMMddhhmm
        @Override
        public long extractTimestamp(Pixel pixel) {
            return Long.parseLong(pixel.timestampReadable);
        }
    }
DataStream输入=env
.addSource(用户操作)
.uid(“app”);
datastreamevents=input.map(record->mapper.readValue(record,Event.class));
像素
.assignTimestampsAndWatermarks(新的TimestampsAndWatermarks())
.keyBy(“id”)
.时间窗口(时间.分钟(1))
.总和(“常数”)
.addSink(simpleNotificationServiceSink);
环境执行(作业名称);
私有静态类TimestampsAndWatermarks扩展了BoundedAutofordernessTimestampExtractor{
公共水印(){
超级(时间秒(90));
}
//timestampReadable是按分钟取整的时间戳,格式为yyyyMMddhhmm
@凌驾
公共长提取时间戳(像素){
返回Long.parseLong(pixel.timestampReadable);
}
}
我想实现以下场景:

  • 启动嵌入式卡夫卡

  • 向主题发布几条消息

  • 用Flink消费消息

  • 检查Flink产生的输出的正确性

  • Flink是否提供了使用嵌入式Kafka测试作业的实用程序?如果是,建议的方法是什么


    谢谢。

    有一条JUnit规则可以用来创建嵌入式卡夫卡——请参阅(请参阅)

    要使测试干净地终止,请尝试以下操作:

    公共类TestDeserializer扩展了KafkadeSerializer{
    公共最终静态字符串END\u APP\u MARKER=“END\u APP\u MARKER”//测试作为最后一条记录发送
    @凌驾
    公共布尔值isEndOfStream(ParseResult nextElement){
    if(nextElement.getParseError()==null)
    返回false;
    if(END_APP_MARKER.equals(nextElement.getParseError().getRawData()))
    返回true;
    返回false;
    }
    }
    
    我推荐(测试容器)[因为这也可以用于其他资源。我通常将其与创建主题和添加/读取数据相结合。有人能给我举一个例子,说明在测试中使用testcontainers依赖卡夫卡吗?@salvalcantara如果你搜索Flink源代码,你会发现testcontainers已经在那里使用了一点。
    https://github.com/search?q=testcontainers+flink+kafka&type=code
    有很多成功的例子,你可能会在里面找到一些有用的东西。谢谢David,这些都是很好的例子!