If we do it it has a nice "feature" - we would not have to add "tests"
folders at all to be added to PYTHONPATH (we do it in "setup_idea.py" now
for IntelliJ and "setup_vscode.py' I think. But if each tests is a
standalone "test script" that does not have to even know what "package" it
is in - there would not be a need to add "tests" to PYTHONPATH at all.

J,


On Mon, Jul 28, 2025 at 3:12 PM Jarek Potiuk <ja...@potiuk.com> wrote:

> That is an interesting alternative and I quite like it.
>
> We tried to use importlib before and we failed (but we did not try "hard")
> - Andrey tried it one day and it generated a lot of errors - but we've
> changed a LOT since the (including separating of common test classes to
> "devel_common".
>
> It might be worth doing a POC for that - this adds very nice isolation
> where all tests are generally fully "standalone". I might attempt to make a
> POC on that.
>
> I would not asy "only fixtures" is the right approach - but I think it
> should generally apply to trying to import common code between "tests".
> There is a bit of imports that are pretty "valid" in some way and easier to
> use than fixtures I think  - i.e. "devel-common" classes, but they are not
> "tests" classes - they are regular "src" classes in "tests_common" package
> in "apache-airflow-devel-common" distribution, so this is pretty good idea
> to import them.
>
> But I do agree that importing one test from other classes is "fishy" and
> if importlib might help us with this, then it is an easy way to enforce it.
> I will try it first. That's a very good idea :)
>
> J.
>
> On Mon, Jul 28, 2025 at 10:24 AM Ash Berlin-Taylor <a...@apache.org> wrote:
>
>> Did you look at changing the pytest import option instead?
>> https://docs.pytest.org/en/stable/explanation/pythonpath.html - and
>> specifically the `importlib` option
>>
>> To quote their documentation:
>>
>> > importlib: this mode uses more fine control mechanisms provided by
>> importlib <
>> https://docs.python.org/3/library/importlib.html#module-importlib> to
>> import test modules, without changing sys.path <
>> https://docs.python.org/3/library/sys.html#sys.path>.
>> >
>> > Advantages of this mode:
>> >
>> > pytest will not change sys.path <
>> https://docs.python.org/3/library/sys.html#sys.path> at all.
>> >
>> > Test module names do not need to be unique – pytest will generate a
>> unique name automatically based on the rootdir.
>> >
>> > Disadvantages:
>> >
>> > Test modules can’t import each other.
>> >
>> > Testing utility modules in the tests directories (for example a
>> tests.helpers module containing test-related functions/classes) are not
>> importable. The recommendation in this case it to place testing utility
>> modules together with the application/library code, for example
>> app.testing.helpers.
>> >
>> > Important: by “test utility modules”, we mean functions/classes which
>> are imported by other tests directly; this does not include fixtures, which
>> should be placed in conftest.py files, along with the test modules, and are
>> discovered automatically by pytest.
>> >
>>
>> I think with pytest fixtures we almost shouldn’t need to import tests
>> directly at all, so if they are a package or not should not be an issue.
>> Doing this (or working towards) it means we don’t need to worry about the
>> name at all, and we already have the `tests_common` etc as a place to put
>> helpers.
>>
>> That way we don’t need any special rules or naming convention or
>> otherwise “duplicate” folder names.
>>
>> I.e. instead of adding a name to make things unique, we forbid imports of
>> helper functions and make them use `pytest` fixtures instead.
>>
>> Thoughts?
>>
>> > On 27 Jul 2025, at 17:55, Jens Scheffler <j_scheff...@gmx.de.INVALID>
>> wrote:
>> >
>> > Hi Jarek,
>> >
>> > I like the general idea of the structure as you propose.
>> >
>> > I would not "swap" as you described afterwards but propose to use the
>> first proposal you made.
>> >
>> > For docker and k8s tests I think it would be better to keep them
>> outside of "airflow-core" as they have a rather integrative/system scope
>> and are only indirectly related to core. For the moment I'd keep then and
>> once we re-structure the packages still we can align later.
>> >
>> > Jens
>> >
>> > On 25.07.25 11:57, Amogh Desai wrote:
>> >> Hi Jarek,
>> >>
>> >>> So maybe it's a good time to improve it and come up with a convention
>> that
>> >> we can apply also to shared folders? Such change will be very little
>> >> disruptive and can be largely automated and applied in a single PR
>> >>
>> >> Yeah, I think it's a good time and idea to get such a thing done.
>> >>
>> >> *> from unit.amazon import s3_operator_test*
>> >> I never paid close attention to such import patterns and I do not like
>> >> them. Its very
>> >> confusing and ambiguous, and it's very hard to tell "what package is
>> this"
>> >> to any of those
>> >> imports.
>> >>
>> >> While writing the Task SDK integration tests I did keep a lot of those
>> >> things in mind and if you
>> >> see the internal imports I have, they are of the pattern:
>> >> *from task_sdk_tests.constants import AIRFLOW_ROOT_PATH *which is far
>> less
>> >> ambiguous and
>> >> confusing.
>> >>
>> >>> Note that this does not yet tackle the other "special" test types we
>> have
>> >> -> kubernetes-tests, docker-tests, task-sdk-tests (right now being
>> merged
>> >> by Amogh), especially the last one seem to be clashing with
>> >> `task_sdk_tests`. But I think (and this would be separate discussion) -
>> >> this also adds an opportunity (next step) to move those "special" test
>> >> types we have. Eventually we could move those tests to be "yet another
>> test
>> >> type" under "tests":
>> >>
>> >> Agreed, we can consider moving those to the right places where
>> applicable,
>> >> like:
>> >> *task_sdk_tests/*
>> >>
>> >> *├── unit/└── integration/      # Moved from task-sdk-tests/*
>> >>
>> >> We can start small here and build up to fix the issues one package at a
>> >> time, and if
>> >> we can come up with a good AI prompt, we can get some work multiplexed
>> by
>> >> the community
>> >> too.
>> >>
>> >>
>> >> Thanks & Regards,
>> >> Amogh Desai
>> >>
>> >>
>> >> On Thu, Jul 24, 2025 at 8:38 PM Jarek Potiuk <ja...@potiuk.com> wrote:
>> >>
>> >>> Hello here,
>> >>>
>> >>> Since we have now started even more isolation and separation of the
>> code
>> >>> and libraries, I think it might be a good time to maybe improve a bit
>> the
>> >>> way our tests "package" hierarchy is done - in providers and
>> elsewhere.
>> >>>
>> >>> This question came up when i started to add pre-commit checks after
>> our
>> >>> "shared code" PR have been merged - in
>> >>> https://github.com/apache/airflow/pull/53697
>> >>>
>> >>> One problem with having tests in monorepo, is that if all "tests"
>> folders
>> >>> are added to PYTHONPATH, we cannot really put tests in the "top"
>> level of
>> >>> the tests folder (that is pretty natural whe you do not have multiple
>> of
>> >>> "tests" folders. There are two reasons for that:
>> >>>
>> >>> * it's likely module names or package names will have the same names
>> in
>> >>> separate distributions
>> >>> * quite often - if we add tests in a sub-package of tests directly
>> they
>> >>> might clash with the same names - for example from stdlib or another
>> >>> package we installed. Good examples of it (and something that
>> happened in
>> >>> the past were `tests/smtp/test_*` and `tests/kubernetes/test_*`.
>> Depending
>> >>> on how your IDE and env was configured you could have ended up in
>> "import
>> >>> kubernetes" not behaving as you expected.
>> >>>
>> >>> So far in providers we have the
>> "{unit/system/integration}/<PROVIDER>/"
>> >>> convention that solved the issue. But even me as author of it, I must
>> admit
>> >>> `from unit.amazon` when you want to cross-import between different
>> amazon
>> >>> or different providers looks rather stupid and baffling. Even
>> recently Ash
>> >>> commented in one PR "that must be wrong" - and yeah, it does look
>> wrong....
>> >>>
>> >>> So maybe it's a good time to improve it and come up with a convention
>> that
>> >>> we can apply also to shared folders? Such change will be very little
>> >>> disruptive and can be largely automated and applied in a single PR -
>> and
>> >>> modern git and IDE integration will follow such changes nicely - so
>> that
>> >>> you can see history of changes and it resolves most of conflicts
>> >>> automatically - so it could be done with very little disruption (only
>> >>> currently opened PRs will have to be rebased).
>> >>>
>> >>> My proposal would be to add a "parent" folder in the "tests"
>> directory to
>> >>> indicate where the test is coming from. That might sound like a
>> >>> duplication, but I think it's a natural consequence of having code in
>> >>> monorepo, and a nice way to improve the organisation of tests. Also
>> it has
>> >>> an immediate notion or where the imports come from.
>> >>>
>> >>> airflow-core\
>> >>>              src\
>> >>>                  airflow\
>> >>>              tests\
>> >>>                    airflow_core_tests\
>> >>>                                       unit\
>> >>>                                       system\
>> >>>                                       integration\
>> >>> airflow-task-sdk\
>> >>>                  src\
>> >>>                      airflow\
>> >>>                              sdk
>> >>>                  tests\
>> >>>                        task_sdk_tests\
>> >>>                                      # here all tests are unit so no
>> need
>> >>> for sub-packages
>> >>>
>> >>> providers/amazon/tests\
>> >>>                        provider_tests\
>> >>>                                       unit\
>> >>>                                            amazon
>> >>>                                       integration\
>> >>>                                                  amazon
>> >>>
>> >>>
>> >>> providers/cncf/kubernetes/tests\
>> >>>                                 provider_tests\
>> >>>                                               unit\
>> >>>                                                   cncf\kubernetes\
>> >>>                                               integration\
>> >>>
>>  cncf\kubernetes\
>> >>>
>> >>>
>> >>> I also considered swapping "unit" / "provider"
>> (provider_tests\amazon\unit)
>> >>> - but that would make it a bit more complex when we choose type of
>> tests to
>> >>> run or examples to have and I think it's somewhat better to have the
>> >>> unit/system/integration distinction right after provider_tests because
>> >>> essentially those test types are VERY different.
>> >>>
>> >>> Again - that sounds like a lot of duplication in the path, but I
>> think it's
>> >>> worth it (and our pre-commits already make sure that there are no
>> typos and
>> >>> keep it in order and they can be updated to keep this new structure).
>> >>>
>> >>> The main benefit of it hat when you import (wherever) between
>> different
>> >>> distributions - the imports will **look** better and be more obvious:
>> >>>
>> >>> from provider_tests.unit.amazon import some_amazon_test_code
>> >>> from task_sdk_tests import apis
>> >>>
>> >>> Note that this does not yet tackle the other "special" test types we
>> have
>> >>> -> kubernetes-tests, docker-tests, task-sdk-tests (right now being
>> merged
>> >>> by Amogh), especially the last one seem to be clashing with
>> >>> `task_sdk_tests`. But I think (and this would be separate discussion)
>> -
>> >>> this also adds an opportunity (next step) to move those "special" test
>> >>> types we have. Eventually we could move those tests to be "yet
>> another test
>> >>> type" under "tests":
>> >>>
>> >>> airflow_core_tests\
>> >>>                    unit
>> >>>                    system
>> >>>                    integration
>> >>>                    docker
>> >>>                    kubernetes
>> >>>
>> >>> task_sdk_tests\
>> >>>               unit
>> >>>               integration
>> >>>
>> >>> But I would approach it as the next step after we reorganize imports
>> for
>> >>> the "regular" tests we have.
>> >>>
>> >>> WDYT? Good idea? Other proposals?
>> >>>
>> >>> J.
>> >>>
>> >
>> > ---------------------------------------------------------------------
>> > To unsubscribe, e-mail: dev-unsubscr...@airflow.apache.org
>> > For additional commands, e-mail: dev-h...@airflow.apache.org
>> >
>>
>>

Reply via email to