Simplemente crear un proyecto de prueba y escribir algunos métodos de prueba es una especie de TDD, pero en mi experiencia no es de mucha ayuda a menos que esté trabajando en una biblioteca donde hay una API conocida y las llamadas a métodos corresponden directamente a algo esperado por el usuario . Debe encontrar la lista correcta de pruebas, y para una aplicación no trivial, eso puede ser realmente difícil de hacer.
Recomiendo probar SpecFlow: sigue definiendo las pruebas muy bien separadas de la implementación y la estructura de los archivos de características lo obliga a pensar en lo que realmente está probando.
Cuando define una característica, simplemente escribe algo como
When a user is saved
Then the user should exist
Debido a que no está en un archivo de código en este momento, no está tentado a pensar en detalles de implementación como qué método se llama para crear un usuario o incluso en qué clase se implementa. Puede usar etiquetas para elegir diferentes implementaciones, así que a este nivel no importa si "el usuario está guardado" significa una llamada a CreateUser o abrir un navegador y enviar un formulario.
Una vez que haya definido las características, se generarán todas las pruebas y comenzarán a pasar a medida que implemente las definiciones de pasos y el código de aplicación real que se está probando.
Para una aplicación simple, solo puede crear los archivos de características, pero para cualquier cosa más compleja es útil reunir una especificación más completa de antemano. Para esto utilizo una aplicación de mapas mentales de iPad, pero puedes usar cualquier herramienta con la que te sientas más cómodo.
Comience con una lista de características de alto nivel como "Registro de usuario". Estos tienden a ser demasiado amplios para escribir pruebas directamente, por lo tanto, divídalos en subcaracterísticas que se puedan definir claramente y, por lo general, se asignen a una acción específica del usuario como "Guardar usuario" o "Ver usuario existente".
Cada una de estas subcaracterísticas necesitará una lista de escenarios que juntos definen por completo si la característica está funcionando o no, cosas como "Puede guardar un usuario válido" y "No puede guardar un usuario con nombre de usuario duplicado".
A medida que construya esta lista, generalmente quedará claro dónde debe ajustarse la estructura: si no puede encontrar ninguna prueba de escenario para una característica, o termina con demasiadas en una característica, entonces esa característica probablemente se define en el nivel equivocado y necesita ser dividido o cambiado.