Hi i don't have links to papers that you asked but want to add something to this :
The effectiveness of TDD depends on what product you are working on,
Through out my experience i found it highly effective in testing API services that work with a well defined contract.
If the contract is well documented , the workflow we followed was like:
- There will be a development user story with all requirements and
acceptance criteria
- Create a related Test user story from the development user story
with high level user acceptance criteria
- Start writing the test cases with dummy json responses (which we could get from well documented contract )
- Once development is done run the tests on it, fail or pass the build according to the results.
Advantages:
- You gets build feedback on the same day when you finish development
- You can save system test time by not wasting effort in testing non qualified builds
- You can use saved time through fast feedback to plan more rigorous steps
- You can completely replace manual tests with partial or fully automated tests (In case of API testing)
Limitations with UI and other complex solutions:
UI behavior changes as development progress , you cannot predict how the html DOM will be like. Hence, it will be highly complex effort to write tests without knowing the locators
Its not recommended to write tests scripts without actually testing whether it works and then wasting time fixing it once product get released. (Tho sometimes you need lesser time fixing it then actually developing from scratch. This highly unlikely as we know it takes more time debugging than writing something from scratch)
Workaround for the limitations:
Write manual tests cases in a TDD fashion
You can use BDD feature file to write manual test cases
Then automate the BDD features files by defining step definition once development is finished