TDD-Bench Verified: Can LLMs Generate Tests for Issues Before They Get Resolved?
This work addresses the problem of automating test generation for TDD to improve developer productivity and code robustness, though it is incremental as it builds on existing LLM and test generation methods.
The paper tackles the lack of automation for test-driven development (TDD) by introducing TDD-Bench Verified, a benchmark of 449 real-world GitHub issues, and Auto-TDD, an LLM-based method that generates tests from issue descriptions before code changes, achieving a better fail-to-pass rate and high coverage adequacy than prior work.
Test-driven development (TDD) is the practice of writing tests first and coding later, and the proponents of TDD expound its numerous benefits. For instance, given an issue on a source code repository, tests can clarify the desired behavior among stake-holders before anyone writes code for the agreed-upon fix. Although there has been a lot of work on automated test generation for the practice "write code first, test later", there has been little such automation for TDD. Ideally, tests for TDD should be fail-to-pass (i.e., fail before the issue is resolved and pass after) and have good adequacy with respect to covering the code changed during issue resolution. This paper introduces TDD-Bench Verified, a high-quality benchmark suite of 449 issues mined from real-world GitHub code repositories. The benchmark's evaluation harness runs only relevant tests in isolation for simple yet accurate coverage measurements, and the benchmark's dataset is filtered both by human judges and by execution in the harness. This paper also presents Auto-TDD, an LLM-based solution that takes as input an issue description and a codebase (prior to issue resolution) and returns as output a test that can be used to validate the changes made for resolving the issue. Our evaluation shows that Auto-TDD yields a better fail-to-pass rate than the strongest prior work while also yielding high coverage adequacy. Overall, we hope that this work helps make developers more productive at resolving issues while simultaneously leading to more robust fixes.