Практика
Требуется время, чтобы научиться писать достойные юнит-тесты. В сложном проекте (больше похожем на проект) нет ничего странного.
Рекомендуемая книга xUnit Test Patterns уже хороша, и я слышал хорошие отзывы о книге, которую вы сейчас читаете.
Что касается общих советов, то это зависит от того, что было сложным в ваших тестах. Если они часто ломаются, это могут быть не юнит-тесты, а тем более интеграционные тесты. Если их было трудно настроить, SUT (тестируемая система) может показывать признаки того, что является слишком сложным, и потребуется дальнейшая модульность. Список можно продолжить.
Некоторые советы, которым я живу, следуют правилу AAA .
Упорядочить, действовать и утверждать. Каждый тест должен следовать этой формуле. Это делает тест читаемым, и его легко поддерживать, если и когда он ломается.
Дизайн все еще важен
Я практикую TDD, но перед написанием любого кода я беру доску и набрасываю. В то время как TDD позволяет вашему коду развиваться, некоторые предварительные разработки всегда приносят пользу. Тогда, по крайней мере, у вас есть отправная точка, отсюда ваш код может управляться написанными вами тестами.
Если я выполняю какую-то сложную задачу, я делаю прототип. Забудьте про TDD, забудьте о лучших практиках, просто выпишите немного кода. Очевидно, что это не рабочий код, но он обеспечивает отправную точку. Из этого прототипа я думаю о реальной системе и о том, какие тесты мне нужны.
Ознакомьтесь с Блогом тестирования Google - это был поворотный момент для меня при запуске TDD. Статьи Миско (особенно сайт Guide to Testable code) превосходны и должны указывать вам правильное направление.