My feeling is that Behavior-Driven Development (which, as described below, is just TDD "done right") is what pushes this competitive advantage aspect. If you write down your user stories, and nothing is in those stories that says "Oh, that's cool!", you need to re-evaluate what you're doing. If the core requirements of your product doesn't do anything interesting, it's unlikely you have any competitive advantage.
I've been thinking a lot about TDD and BDD and [insert letter here]DD recently as part of ongoing research. One thing that got lost when unit testing was proposed is that it's your requirements that stick with you through levels of abstraction... the specification (ie. what you implement in code and unit test) is a by-product of having to talk to a computer to express a model that meets those requirements.
Unit testing, by itself, just validates that the model does what it says it does, but does nothing to assert whether the model actually does what it was supposed to do to meet the customer's requirements. That's what BDD ensures.
I think that the nice thing about BDD is that it reduces the gap between requirement gathering tools (use cases/scenarios, to be specific) and user acceptance or integration testing.
But it doesn't banish the problems of inconsistent or incomplete requirements. And it doesn't drive away solution complexity exlosion as you descend into the code. And it certainly isn't as useful for diagnostic debugging on changes to the code.
But it's in the user's language (-ish), so it's more likely to be funded and supported. That can only be a good thing.
I've been thinking a lot about TDD and BDD and [insert letter here]DD recently as part of ongoing research. One thing that got lost when unit testing was proposed is that it's your requirements that stick with you through levels of abstraction... the specification (ie. what you implement in code and unit test) is a by-product of having to talk to a computer to express a model that meets those requirements.
Unit testing, by itself, just validates that the model does what it says it does, but does nothing to assert whether the model actually does what it was supposed to do to meet the customer's requirements. That's what BDD ensures.