You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@flink.apache.org by "buptljy (JIRA)" <ji...@apache.org> on 2018/04/06 16:30:00 UTC
[jira] [Commented] (FLINK-7554) Add a testing RuntimeContext to
test utilities
[ https://issues.apache.org/jira/browse/FLINK-7554?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16428541#comment-16428541 ]
buptljy commented on FLINK-7554:
--------------------------------
[~twalthr] I find that it seems to be a bit harder for testing streaming functions like "CoProcessFunction", in which has a Context, because I can't create a Context directly. My idea is to create a testingfunction for it, like:
{code:java}
public class TestingCoProcessFunction extends CoProcessFunction<Object, Object, Object> {
private TestingRuntimeContext ctx;
private Context context = new Context() {
@Override
public Long timestamp() {
return -1L;
}
@Override
public TimerService timerService() {
return new TestingTimerService();
}
@Override
public <X> void output(OutputTag<X> outputTag, X value) {
ctx.addSideOutput(outputTag, value);
}
};
public TestingCoProcessFunction(TestingRuntimeContext ctx) {
this.ctx = ctx;
}
public Context getContext() {
return context;
}
@Override
public void processElement1(Object value, Context ctx, Collector<Object> out) throws Exception {}
@Override
public void processElement2(Object value, Context ctx, Collector<Object> out) throws Exception {}
}
{code}
And the test will be like this:
{code:java}
@Test
public void testEnrichmentFunction() throws Exception {
TestingRuntimeContext ctx = new TestingRuntimeContext(true);
EnrichmentFunction func = new EnrichmentFunction();
func.setRuntimeContext(ctx);
CoProcessFunction.Context context = new TestingCoProcessFunction(ctx).getContext();
ValueStateDescriptor<TaxiRide> rideStateDesc = new ValueStateDescriptor<>("saved ride", TaxiRide.class);
ValueStateDescriptor<TaxiFare> fareStateDesc = new ValueStateDescriptor<>("saved fare", TaxiFare.class);
ctx.setState(rideStateDesc, new TestingValueState<TaxiRide>(null));
ctx.setState(fareStateDesc, new TestingValueState<TaxiFare>(null));
func.open(new Configuration());
TaxiRide ride1 = new TaxiRide(1);
func.processElement1(ride1, context, ctx.getCollector());
Assert.assertEquals(ctx.getState(rideStateDesc).value(), ride1);
}
{code}
And in this way, I will create many testingfunctions for "BroadcastProcessFunction", "CoProcessFunction", etc. I can do this but I wonder if you have any better ideas ?
> Add a testing RuntimeContext to test utilities
> ----------------------------------------------
>
> Key: FLINK-7554
> URL: https://issues.apache.org/jira/browse/FLINK-7554
> Project: Flink
> Issue Type: New Feature
> Components: Tests
> Reporter: Timo Walther
> Assignee: buptljy
> Priority: Major
> Labels: starter
>
> When unit testing user-defined functions it would be useful to have an official testing {{RuntimeContext}} that uses Java collections for storing state, metrics, etc.
> After executing the business logic, the user could then verify how the state of the UDF changed or which metrics have been collected.
> This issue includes documentation for the "Testing" section.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)