I highly recommend you to check out dagster.io if you haven't. Many things stated here is built-in with dagster. E.g. your business logic is separated from the technical logic with @resources. Also, you write your resources exactly once, and all your DAGs and solids (tasks in dagster) can use these methods with a context variable. Testing is solved with Modes (dev, test, prod), and so many more things are handled well by abstraction. Dagster can even execute on Airflow if you have an existing Airflow environment. A good comparison and introduction to their concepts you find on their blog: https://dagster.io/blog/dagster-airflow
Or if you want to get hands-on, you find a my example real-estate open-source project on my Blog and GitHub: https://www.sspaeti.com/blog/data-engineering-project-in-twenty-minutes/#orchestrating-everything-together--dagster