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