It’s a good advice. I have created ticket 
https://issues.apache.org/jira/browse/FLINK-21938 
<https://issues.apache.org/jira/browse/FLINK-21938> to track this.

> 2021年3月24日 上午10:24,Yik San Chan <evan.chanyik...@gmail.com> 写道:
> 
> Hi Dian,
> 
> As you said, users can, but I got the impression that using ._func to access 
> the original Python function is not recommended, therefore not documented. 
> While in Flink, unit testing a Scala/Java UDF is clearly documented and 
> encouraged.
> 
> Do I misread something?
> 
> Best,
> Yik San
> 
> On Wed, Mar 24, 2021 at 10:21 AM Dian Fu <dian0511...@gmail.com 
> <mailto:dian0511...@gmail.com>> wrote:
> As I replied in previous email, it doesn’t block users to write tests for 
> PyFlink UDFs. Users could use ._func to access the original Python function 
> if they want.
> 
> Regards,
> Dian
> 
>> 2021年3月23日 下午2:39,Yik San Chan <evan.chanyik...@gmail.com 
>> <mailto:evan.chanyik...@gmail.com>> 写道:
>> 
>> Hi Dian,
>> 
>> However users do want to unit test their UDFs, as supported in 
>> https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/testing.html#testing-user-defined-functions
>>  
>> <https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/testing.html#testing-user-defined-functions>
>> 
>> Even though the examples are for Flink, I believe PyFlink should ideally be 
>> no difference.
>> 
>> What do you think?
>> 
>> Best,
>> Yik San
>> 
>> On Tue, Mar 23, 2021 at 2:19 PM Dian Fu <dian0511...@gmail.com 
>> <mailto:dian0511...@gmail.com>> wrote:
>> Hi Yik San,
>> 
>> This field isn't expected to be exposed to users and so I'm not convinced 
>> that we should add such an interface/method in Flink.
>> 
>> Regards,
>> Dian
>> 
>> On Tue, Mar 23, 2021 at 2:04 PM Yik San Chan <evan.chanyik...@gmail.com 
>> <mailto:evan.chanyik...@gmail.com>> wrote:
>> Hi Dian,
>> 
>> The ._func method seems to be internal only. Maybe we can add some 
>> public-facing method to make it more intuitive for use in unit test? What do 
>> you think?
>> 
>> Best,
>> Yik San
>> 
>> On Tue, Mar 23, 2021 at 2:02 PM Yik San Chan <evan.chanyik...@gmail.com 
>> <mailto:evan.chanyik...@gmail.com>> wrote:
>> Hi Dian,
>> 
>> Thanks! It solves my problem.
>> 
>> Best,
>> Yik San
>> 
>> On Tue, Mar 23, 2021 at 1:29 PM Dian Fu <dian0511...@gmail.com 
>> <mailto:dian0511...@gmail.com>> wrote:
>> H Yik San,
>> 
>> As the udf `add` is decorated with `@udf` decorator, it is no longer a 
>> simple Python function if you reference `add`. If you execute 
>> `print(type(add(1, 1)))`, you will see the output is something like "<class 
>> 'pyflink.table.expression.Expression'>".
>> 
>> You could try the following code: assert add._func(1, 1) == 3
>> 
>> add._func returns the original Python function.
>> 
>> Regards,
>> Dian
>> 
>> On Tue, Mar 23, 2021 at 10:56 AM Yik San Chan <evan.chanyik...@gmail.com 
>> <mailto:evan.chanyik...@gmail.com>> wrote:
>> (This question is cross-posted on StackOverflow 
>> https://stackoverflow.com/questions/66756612/failed-to-unit-test-pyflink-udf 
>> <https://stackoverflow.com/questions/66756612/failed-to-unit-test-pyflink-udf>)
>> 
>> I am using PyFlink and I want to unit test my UDF written in Python.
>> 
>> To test the simple udf below:
>> 
>> ```python
>> # tasks/helloworld/udf.py
>> from pyflink.table import DataTypes
>> from pyflink.table.udf import udf
>> 
>> @udf(input_types=[DataTypes.INT(), DataTypes.INT()], 
>> result_type=DataTypes.BIGINT())
>> def add(i, j):
>>     return i + j
>> ```
>> 
>> I create a test file that should fail:
>> ```python
>> from tasks.helloworld.udf import add
>> 
>> def test_add():
>>     assert add(1,1) == 3
>> ```
>> 
>> Sadly, it passes if I run `pytest`:
>> ```
>> > pytest
>> ===========================================================================================
>>  test session starts 
>> ============================================================================================
>> platform darwin -- Python 3.7.10, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
>> rootdir: /Users/chenyisheng/source/yiksanchan/pytest-flink
>> collected 1 item
>> 
>> tests/test_helloworld.py .                                                   
>>                                                                              
>>                                            [100%]
>> 
>> =============================================================================================
>>  warnings summary 
>> =============================================================================================
>> ../../../../../usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/py4j/java_collections.py:13
>> ../../../../../usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/py4j/java_collections.py:13
>> ../../../../../usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/py4j/java_collections.py:13
>> ../../../../../usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/py4j/java_collections.py:13
>> ../../../../../usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/py4j/java_collections.py:13
>>   
>> /usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/py4j/java_collections.py:13:
>>  DeprecationWarning: Using or importing the ABCs from 'collections' instead 
>> of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will 
>> stop working
>>     from collections import (
>> 
>> ../../../../../usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/pyflink/table/udf.py:291
>>   
>> /usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/pyflink/table/udf.py:291:
>>  DeprecationWarning: Using or importing the ABCs from 'collections' instead 
>> of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will 
>> stop working
>>     if not isinstance(input_types, collections.Iterable) \
>> 
>> -- Docs: https://docs.pytest.org/en/stable/warnings.html 
>> <https://docs.pytest.org/en/stable/warnings.html>
>> ======================================================================================
>>  1 passed, 6 warnings in 0.98s 
>> =======================================================================================
>> ```
>> 
>> However, the test will fail as expected if I remove the 
>> `@udf(input_types=[...], result_type=...)` annotation:
>> ```
>> > pytest
>> ===========================================================================================
>>  test session starts 
>> ============================================================================================
>> platform darwin -- Python 3.7.10, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
>> rootdir: /Users/chenyisheng/source/yiksanchan/pytest-flink
>> collected 1 item
>> 
>> tests/test_helloworld.py F                                                   
>>                                                                              
>>                                            [100%]
>> 
>> =================================================================================================
>>  FAILURES 
>> =================================================================================================
>> _________________________________________________________________________________________________
>>  test_add 
>> _________________________________________________________________________________________________
>> 
>>     def test_add():
>> >       assert add(1,1) == 3
>> E       assert 2 == 3
>> E        +  where 2 = add(1, 1)
>> 
>> tests/test_helloworld.py:4: AssertionError
>> =============================================================================================
>>  warnings summary 
>> =============================================================================================
>> ../../../../../usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/py4j/java_collections.py:13
>> ../../../../../usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/py4j/java_collections.py:13
>> ../../../../../usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/py4j/java_collections.py:13
>> ../../../../../usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/py4j/java_collections.py:13
>> ../../../../../usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/py4j/java_collections.py:13
>>   
>> /usr/local/anaconda3/envs/pyflink-quickstart/lib/python3.7/site-packages/py4j/java_collections.py:13:
>>  DeprecationWarning: Using or importing the ABCs from 'collections' instead 
>> of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will 
>> stop working
>>     from collections import (
>> 
>> -- Docs: https://docs.pytest.org/en/stable/warnings.html 
>> <https://docs.pytest.org/en/stable/warnings.html>
>> =========================================================================================
>>  short test summary info 
>> ==========================================================================================
>> FAILED tests/test_helloworld.py::test_add - assert 2 == 3
>> ======================================================================================
>>  1 failed, 5 warnings in 0.17s 
>> =======================================================================================
>> ```
>> 
>> The full example can be found 
>> https://github.com/YikSanChan/how-to-pytest-flink 
>> <https://github.com/YikSanChan/how-to-pytest-flink>.
>> 
>> Best,
>> Yik San
> 

Reply via email to