I’ve learned a lot of things I didn’t know before.
Thank you so much for all your help — I really appreciate it.
I’ll get started on this right away!

2025년 7월 5일 (토) 오후 9:18, Jarek Potiuk <ja...@potiuk.com>님이 작성:

> > Haha ... I'm curious — which part sounded like ChatGPT style?
> English isn't my first language, so I did get a little help from it.
>
> That whole paragraph :) .
>
> >> Sure! Since you asked for how the test *should* be written, I took the
> opportunity to clean it up using a more pytest-native style while also
> fixing the mock order issue.
>
> "Sure! Since you asked ..." sounds like an AI bot.
>
> > That got me thinking — what do you think about adding a guideline
> document
> for writing tests, similar to how we have a coding style guide?
>
> Absolutely  - we already have some "seed' of it "Writing tests" chapter in
> contributing guideline, but we could definitely make it more detailed.
>
>
> https://github.com/apache/airflow/blob/main/contributing-docs/testing/unit_tests.rst#writing-unit-tests
>
> And - speaking of AI - this is becoming more and more important to describe
> any common rules we have and context - so that using Agentic AI yields
> better results. Kaxil already added
> https://github.com/apache/airflow/blob/main/AGENTS.md which describes
> context for coding agents lile Codex - and we could improve it and link
> more docs from our repo if they get more of our agreed "conventions" - then
> Agents would get it as context and their generated code would be consistent
> with what we describe there.
>
> In a way - I think having a good documentation on processes, tools and
> conventions was always something I've been after, but with the Agentic
> workflows it might significantly boost the quality of generated code if we
> have more of those conventions and guidelines described.
>
> So .... ABSOLUTELY ... the more we describe in there, the better. And we
> have no more excuse that "anyhow no-one reads it" - because the coding
> agents WILL be reading it and acting accordingly. So I think this is a very
> good investment to make.
>
> J.
>
>
>
>
>
> On Sat, Jul 5, 2025 at 2:07 PM Kyungjun Lee <kyungjunlee...@gmail.com>
> wrote:
>
> > Haha ... I'm curious — which part sounded like ChatGPT style?
> > English isn't my first language, so I did get a little help from it.
> >
> > But thank you — I actually learned something new from your comment!
> > That got me thinking — what do you think about adding a guideline
> document
> > for writing tests, similar to how we have a coding style guide? It might
> > help ensure consistency across the Airflow codebase when it comes to
> > testing styles as well.
> >
> > 2025년 7월 5일 (토) 오후 8:52, Jarek Potiuk <ja...@potiuk.com>님이 작성:
> >
> > > But of course - i'd love to hear what others think - it's not a "very
> > > strong" opinion.
> > >
> > > On Sat, Jul 5, 2025 at 1:48 PM Jarek Potiuk <ja...@potiuk.com> wrote:
> > >
> > > > Cool. That's what I wanted to see.
> > > >
> > > > By the way - not that there's anything wrong - but was the answer
> > written
> > > > by AI initially ? The first paragraph looks suspiciously like Chat
> GPT
> > > > answer :D ?
> > > >
> > > > Comment from my side: I personally prefer the original style. It's
> more
> > > > concise and it is easier to read - you see as if the call was
> actually
> > > > written down. Also this is quite a bit too many assertions in the
> > second
> > > > case and it takes a lot of mental effort to understand what actually
> is
> > > > being asserted.
> > > >
> > > > There is a "school" of writing unit tests that every test should have
> > ONE
> > > > assertion only. Always. I think it is a bit extreme, and I do not
> > follow
> > > it
> > > > myself but I think it is also a kind of good direction to have -> the
> > > fewer
> > > > assertions you have in your test, the better (I think).
> > > >
> > > > I think tests should be mostly optimized for easiness of reading and
> > > > understanding what is being tested - and it's just not that easy in
> the
> > > > second case.
> > > >
> > > > J.
> > > >
> > > >
> > > >
> > > > On Sat, Jul 5, 2025 at 1:39 PM Kyungjun Lee <
> kyungjunlee...@gmail.com>
> > > > wrote:
> > > >
> > > >> Sure! Since you asked for how the test *should* be written, I took
> the
> > > >> opportunity to clean it up using a more pytest-native style while
> also
> > > >> fixing the mock order issue.
> > > >>
> > > >> Here’s the updated test:
> > > >>
> > > >> ```python
> > > >>
> > > >> @pytest.mark.parametrize(
> > > >>     argnames="conn_id, account_id",
> > > >>     argvalues=[(ACCOUNT_ID_CONN, None), (NO_ACCOUNT_ID_CONN,
> > > ACCOUNT_ID)],
> > > >>     ids=["default_account", "explicit_account"],
> > > >> )
> > > >> @patch.object(DbtCloudHook, "run")
> > > >> @patch.object(DbtCloudHook, "_paginate")
> > > >> def test_get_account(self, mock_paginate, mock_http_run, conn_id,
> > > >> account_id):
> > > >>     hook = DbtCloudHook(conn_id)
> > > >>     hook.get_account(account_id=account_id)
> > > >>
> > > >>     assert hook.method == "GET"
> > > >>
> > > >>     expected_account_id = account_id or DEFAULT_ACCOUNT_ID
> > > >>
> > > >>     assert mock_http_run.call_count == 1
> > > >>     assert mock_http_run.call_args.args == ()
> > > >>     assert mock_http_run.call_args.kwargs == {
> > > >>         "endpoint": f"api/v2/accounts/{expected_account_id}/",
> > > >>         "data": None,
> > > >>         "extra_options": None,
> > > >>     }
> > > >>
> > > >>     assert mock_paginate.call_count == 0
> > > >>
> > > >> ```
> > > >> Why I chose this style:
> > > >>
> > > >>    -
> > > >>
> > > >>    *Mock verification using assert*: Instead of
> > > >>    mock.assert_called_once_with(...), I used call_count and
> call_args.
> > > >> This
> > > >>    approach aligns better with pytest’s idioms and produces cleaner,
> > > more
> > > >>    readable error messages when assertions fail.
> > > >>    -
> > > >>
> > > >>    *Explicit verification*: Using call_args.args and
> call_args.kwargs
> > > >> makes
> > > >>    the test behavior very explicit, which helps with debugging and
> > > >>    understanding the exact calls made.
> > > >>    -
> > > >>
> > > >>    *Decorator order matching argument order*: As @patch decorators
> > apply
> > > >>    from the bottom up, the argument order has been corrected to
> match
> > (
> > > >>    mock_paginate first, then mock_http_run).
> > > >>
> > > >> Let me know if you'd like to follow a slightly different convention
> —
> > > >> happy
> > > >> to adjust!
> > > >>
> > > >> I was lucky to have the chance to explain this while fixing a
> related
> > > bug.
> > > >> You can refer to the changes in this PR:
> > > >> https://github.com/apache/airflow/pull/52905
> > > >>
> > > >>
> > > >>
> > > >> 2025년 7월 5일 (토) 오후 8:09, Jarek Potiuk <ja...@potiuk.com>님이 작성:
> > > >>
> > > >> > Just post how you think the test should be written :)
> > > >> >
> > > >> > On Sat, Jul 5, 2025 at 1:08 PM Jarek Potiuk <ja...@potiuk.com>
> > wrote:
> > > >> >
> > > >> > > I already mentioned it in slack - but how would you propose to
> > > rewrite
> > > >> > the
> > > >> > > "mixed" case to be more consistent ?
> > > >> > >
> > > >> > > On Sat, Jul 5, 2025 at 12:47 PM Kyungjun Lee <
> > > >> kyungjunlee...@gmail.com>
> > > >> > > wrote:
> > > >> > >
> > > >> > >> Hi all,
> > > >> > >>
> > > >> > >> While reviewing and contributing to Airflow tests, I’ve noticed
> > an
> > > >> > >> inconsistency in how assertions are written. Some tests use
> > > >> > >> `unittest`-style assertions like
> `mock.assert_called_once_with`,
> > > >> while
> > > >> > >> others use plain `assert` statements in the `pytest` style.
> > > >> > >>
> > > >> > >> Here's an example of a test using the mixed style:
> > > >> > >>
> > > >> > >> ```python
> > > >> > >> @pytest.mark.parametrize(
> > > >> > >>     argnames="conn_id, account_id",
> > > >> > >>     argvalues=[(ACCOUNT_ID_CONN, None), (NO_ACCOUNT_ID_CONN,
> > > >> > ACCOUNT_ID)],
> > > >> > >>     ids=["default_account", "explicit_account"],
> > > >> > >> )
> > > >> > >> @patch.object(DbtCloudHook, "run")
> > > >> > >> @patch.object(DbtCloudHook, "_paginate")
> > > >> > >> def test_get_account(self, mock_http_run, mock_paginate,
> conn_id,
> > > >> > >> account_id):
> > > >> > >>     hook = DbtCloudHook(conn_id)
> > > >> > >>     hook.get_account(account_id=account_id)
> > > >> > >>
> > > >> > >>     assert hook.method == "GET"
> > > >> > >>
> > > >> > >>     _account_id = account_id or DEFAULT_ACCOUNT_ID
> > > >> > >>     hook.run.assert_called_once_with(
> > > >> > >>         endpoint=f"api/v2/accounts/{_account_id}/", data=None,
> > > >> > >> extra_options=None
> > > >> > >>     )
> > > >> > >>     hook._paginate.assert_not_called()
> > > >> > >> ```
> > > >> > >>
> > > >> > >> In IDEs and type-checkers (like PyCharm or MyPy), this
> sometimes
> > > >> causes
> > > >> > >> weak warnings
> > > >> > >>
> > > >> > >> ```
> > > >> > >>
> > > >> > >> Cannot find reference 'assert_called_once_with' in 'function'
> > > >> > >>
> > > >> > >> ```
> > > >> > >>
> > > >> > >> This could confuse newcomers or contributors unfamiliar with
> > > mocking
> > > >> > >> behavior or type limitations in dynamic typing.
> > > >> > >>
> > > >> > >> To improve clarity and accessibility for
> contributors—especially
> > > >> those
> > > >> > new
> > > >> > >> to the project—I’d like to propose *moving toward consistent
> use
> > of
> > > >> > plain
> > > >> > >> assert statements* for test validations wherever possible.
> > > >> > >>
> > > >> > >> *Proposed Benefits*:
> > > >> > >>
> > > >> > >>    -
> > > >> > >>
> > > >> > >>    Easier onboarding for first-time contributors
> > > >> > >>    -
> > > >> > >>
> > > >> > >>    Better IDE support and fewer confusing warnings
> > > >> > >>    -
> > > >> > >>
> > > >> > >>    More consistent and readable test style across the project
> > > >> > >>
> > > >> > >> I'd love to hear your thoughts on whether this direction makes
> > > sense
> > > >> for
> > > >> > >> the project. If agreed, I’d also be happy to help align
> existing
> > > >> tests
> > > >> > >> gradually.
> > > >> > >>
> > > >> > >> Thanks!
> > > >> > >> Kyungjun Lee
> > > >> > >>
> > > >> > >
> > > >> >
> > > >>
> > > >
> > >
> >
>

Reply via email to