У нас сделанно так:
Проект и тесты в одном солюшене. Проект разбит на кучу либ, и от них екзешники, которые имеют не очень много функционала. Тестируем только либы.
Компиляция почти не замедляется, правда используем гуглтест, может с бустом быть медленнее.
Что бы эфективно использовать ТДД необходимо заранее продумывать интерфейсы, как только продумал интерфейс, уже можно писать.
Хотя бы так
class Summator
{
public:
int Sum(int a, int b) { throw std::expcetion("not implemented");}
}
До его реализации вполне понятно какой тест необходимо писать.
Обычно таких халявных классов не бывает.
Для одной задачи создаются несколько классов, которые зависят друг от друга.
Для того что бы их тестировать отдельно друг от друга прочитайте про моки и используйте депенденси Инжекшн.