flink的KeyedBroadcastProcessFunction测试

背景

我们经常需要对KeyedBroadcastProcessFunction函数进行单元测试,以确保上线之前这个函数的功能是正常的,包括里面的广播状态和键值分区状态

测试KeyedBroadcastProcessFunction类

java 复制代码
    @Test
    public void testHarnessForKeyedBroadcastProcessFunction() throws Exception {
        KeyedBroadcastProcessFunction<String, String, String, String> function = new MyKeyedBroadcastProcessFunction();

        // 键值分区状态
        final ValueStateDescriptor<String> valueStateDescriptor =
                new ValueStateDescriptor<>("item", BasicTypeInfo.STRING_TYPE_INFO);
        // 广播状态
        final MapStateDescriptor<String, String> ruleStateDescriptor = new MapStateDescriptor<>("RulesBroadcastState",
                BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.STRING_TYPE_INFO);

        KeyedBroadcastOperatorTestHarness<String, String, String, String> harness =
                ProcessFunctionTestHarnesses.forKeyedBroadcastProcessFunction(function, x -> x,
                        TypeInformation.of(String.class), ruleStateDescriptor);

        harness.processBroadcastElement("0", 1);
        harness.processBroadcastElement("000", 2);
        harness.processElement("1", 10);

        // 判断键值分区状态(注意这里最好就只是某个key下面,也就是分组key直接设置为x->"固定常数值"即可)
        ValueState<String> valueState = function.getRuntimeContext().getState(valueStateDescriptor);
        Assert.assertEquals(valueState.value(), "1");

        // 判断广播状态
        BroadcastState<String, String> broadcastState = harness.getBroadcastState(ruleStateDescriptor);
        Assert.assertTrue(broadcastState.contains("0"));
        Assert.assertTrue(broadcastState.contains("000"));

        // 判断输出的列表
        Assert.assertEquals(harness.extractOutputValues(), Arrays.asList("0", "000", "1"));
    }

关键代码:

1.获取键值分区状态

java 复制代码
ValueState<String> valueState = function.getRuntimeContext().getState(valueStateDescriptor);

2.获取广播状态:

java 复制代码
BroadcastState<String, String> broadcastState = harness.getBroadcastState(ruleStateDescriptor);

3.工具类

java 复制代码
public class ProcessFunctionTestHarnesses {
    public ProcessFunctionTestHarnesses() {
    }

    public static <IN, OUT> OneInputStreamOperatorTestHarness<IN, OUT> forProcessFunction(ProcessFunction<IN, OUT> function) throws Exception {
        OneInputStreamOperatorTestHarness<IN, OUT> testHarness = new OneInputStreamOperatorTestHarness(new ProcessOperator((ProcessFunction)Preconditions.checkNotNull(function)), 1, 1, 0);
        testHarness.setup();
        testHarness.open();
        return testHarness;
    }

    public static <K, IN, OUT> KeyedOneInputStreamOperatorTestHarness<K, IN, OUT> forKeyedProcessFunction(KeyedProcessFunction<K, IN, OUT> function, KeySelector<IN, K> keySelector, TypeInformation<K> keyType) throws Exception {
        KeyedOneInputStreamOperatorTestHarness<K, IN, OUT> testHarness = new KeyedOneInputStreamOperatorTestHarness(new KeyedProcessOperator((KeyedProcessFunction)Preconditions.checkNotNull(function)), keySelector, keyType, 1, 1, 0);
        testHarness.open();
        return testHarness;
    }

    public static <IN1, IN2, OUT> TwoInputStreamOperatorTestHarness<IN1, IN2, OUT> forCoProcessFunction(CoProcessFunction<IN1, IN2, OUT> function) throws Exception {
        TwoInputStreamOperatorTestHarness<IN1, IN2, OUT> testHarness = new TwoInputStreamOperatorTestHarness(new CoProcessOperator((CoProcessFunction)Preconditions.checkNotNull(function)), 1, 1, 0);
        testHarness.open();
        return testHarness;
    }

    public static <K, IN1, IN2, OUT> KeyedTwoInputStreamOperatorTestHarness<K, IN1, IN2, OUT> forKeyedCoProcessFunction(KeyedCoProcessFunction<K, IN1, IN2, OUT> function, KeySelector<IN1, K> keySelector1, KeySelector<IN2, K> keySelector2, TypeInformation<K> keyType) throws Exception {
        KeyedTwoInputStreamOperatorTestHarness<K, IN1, IN2, OUT> testHarness = new KeyedTwoInputStreamOperatorTestHarness(new KeyedCoProcessOperator((KeyedCoProcessFunction)Preconditions.checkNotNull(function)), keySelector1, keySelector2, keyType, 1, 1, 0);
        testHarness.open();
        return testHarness;
    }

    public static <IN1, IN2, OUT> BroadcastOperatorTestHarness<IN1, IN2, OUT> forBroadcastProcessFunction(BroadcastProcessFunction<IN1, IN2, OUT> function, MapStateDescriptor<?, ?>... descriptors) throws Exception {
        BroadcastOperatorTestHarness<IN1, IN2, OUT> testHarness = new BroadcastOperatorTestHarness(new CoBroadcastWithNonKeyedOperator((BroadcastProcessFunction)Preconditions.checkNotNull(function), Arrays.asList(descriptors)), 1, 1, 0);
        testHarness.open();
        return testHarness;
    }

    public static <K, IN1, IN2, OUT> KeyedBroadcastOperatorTestHarness<K, IN1, IN2, OUT> forKeyedBroadcastProcessFunction(KeyedBroadcastProcessFunction<K, IN1, IN2, OUT> function, KeySelector<IN1, K> keySelector, TypeInformation<K> keyType, MapStateDescriptor<?, ?>... descriptors) throws Exception {
        KeyedBroadcastOperatorTestHarness<K, IN1, IN2, OUT> testHarness = new KeyedBroadcastOperatorTestHarness(new CoBroadcastWithKeyedOperator((KeyedBroadcastProcessFunction)Preconditions.checkNotNull(function), Arrays.asList(descriptors)), keySelector, keyType, 1, 1, 0);
        testHarness.open();
        return testHarness;
    }
}
相关推荐
幻灭行度3 分钟前
docker镜像导入到K8S的containerd中
java·docker·kubernetes
武昌库里写JAVA6 分钟前
Java如何快速入门?Java基础_Java入门
java·vue.js·spring boot·后端·sql
那我掉的头发算什么15 分钟前
【javaEE】多线程进阶--CAS与原子类
android·java·jvm·java-ee·intellij-idea
SteveCode34 分钟前
血赚不亏!Java 17 9 个炸裂特性,程序员看完直呼:太香了!
java
BLOB_1010011 小时前
关于懒人复制idea项目的坑
java·ide·intellij-idea
Moe4881 小时前
Spring Boot 自动配置核心:AutoConfigurationImportSelector 深度解析
java·后端·设计模式
6***x5451 小时前
Java设计模式之策略模式
java·设计模式·策略模式
章鱼哥7301 小时前
Java 策略模式 + 聚合对象:实现多模块的统计与聚合,快速扩展的实战
java·开发语言·策略模式
h***59332 小时前
SpringBoot中如何手动开启事务
java·spring boot·spring
倚肆2 小时前
Java泛型详解:尖括号<>、通配符?与类型参数T
java