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> 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> 写道:
>
> 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
>
> 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> 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>
>> 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>
>>> 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> 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> wrote:
>>>>>
>>>>>> (This question is cross-posted on StackOverflow
>>>>>> 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
>>>>>> ======================================================================================
>>>>>> 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
>>>>>> =========================================================================================
>>>>>> 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.
>>>>>>
>>>>>> Best,
>>>>>> Yik San
>>>>>>
>>>>>
>

Reply via email to