### Body

Currently `start_date` is mandatory parameter.
For DAGs with `schedule=None` we can relax this requirement as no scheduling calculation needed so the `start_date` parameter isn't used.

### Committer

- [X] I acknowledge that I am a maintainer/committer of the Apache Airflow project.
"""
    Run a single task instance, and push result to Xcom for downstream tasks.
    Bypasses a lot of extra steps used in `task.run` to keep our local running as fast as
    possible.  This function is only meant for the `dag.test` function as a helper function.
    Args:
        ti: TaskInstance to run
    """
    log.info("[DAG TEST] starting task_id=%s map_index=%s", ti.task_id, ti.map_index)
    while True:
        try:
            log.info("[DAG TEST] running task %s", ti)
            ti._run_raw_task(session=session, raise_on_defer=inline_trigger)
            break
        except TaskDeferred as e:
            log.info("[DAG TEST] running trigger in line")
            event = _run_trigger(e.trigger)
            ti.next_method = e.method_name
            ti.next_kwargs = {"event": event.payload} if event else e.kwargs
            log.info("[DAG TEST] Trigger completed")
        session.merge(ti)
        session.commit()
    log.info("[DAG TEST] end task task_id=%s map_index=%s", ti.task_id, ti.map_index)
def _get_or_create_dagrun(
    dag: DAG,
    conf: dict[Any, Any] | None,
    start_date: datetime,
    execution_date: datetime,
    run_id: str,
    session: Session,