Desarrollo basado en pruebas-Cómo escribir una prueba antes de que no exista ningún código de implementación


Estoy aprendiendo TDD pero luchando para adoptarlo, ya que no es sencillo.

La pregunta que no puedo responder es " ¿Cómo escribir una prueba antes de que exista algún código de implementación?".

Si nuestra clase de destino / método de destino / tipo de parámetro de destino / tipo de retorno de destino no existe,

  • A qué nos referimos al escribir código en la prueba. ¿Cómo empezamos a escribir la prueba?
  • ¿Cómo falló la prueba si todo lo que podríamos escribir es solo el nombre del método de prueba antes del código de implementación real?

Todo el mundo dice POR QUÉ pero no CÓMO

He hecho todo lo posible para encontrar recursos que elaboran pruebas de escritura antes del código de producción, pero, suponiendo que me perdí buenos recursos, la mayoría de ellos están llenos de clichés explicar por qué la TTD es importante que centrarse en las prácticas para adoptarla.

Un ejemplo de caso de uso.

Supongamos que estamos desarrollando un software para una Universidad y nuestro caso de uso es inscripción al curso.

Para mantenerlo simple, limitemos esta discusión a

  • escenario:"Un estudiante puede inscribirse en un máximo de 3 cursos por semestre"
  • testing service layer y dao layer.

Pseudocódigo

ENROLL(studentId, courseId)
    //check if student enrolled in less than 3 courses in the same semester as given courseId belongs in.
    //if yes, enroll him/her.
    //if not, return an error.

La implementación real de lo anterior podría abarcar un par de clases que involucran servicios, daos, etc.

Por favor, ¿podría explicar cómo probarlo-desarrollado paso a paso? Si usted fuera a implementar esto usando TDD, cómo lo hiciste paso a paso.

Espero que esto pueda ayudar a muchas luchas como yo en el futuro.

Author: Carl Manaster, 2013-12-25

4 answers

Crear la clase EnrollingServiceTest en src/test / java en el mismo paquete que EnrollingService

class EnrollingServiceTest {
    private EnrollingService enrollingService;

    @Before 
    public void init() {
           enrollingService = new EnrollingService();
    }

    @Test
    public void testEnroll() {
           boolean result = enrollingService.enroll(1l, 1l);
           assertTrue(result);
    ...

IDE (asumo que está usando IDE) muestra errores - EnrollingService no existe .

Punto cursor en EnrollService-IDE ofrecerá crear una clase-dejar que se cree en src/main / java

Ahora el IDE dice que falta el método enroll(long, long) - deja que el IDE lo cree por ti.

Ahora el IDE no muestra errores. Ejecutar la prueba-falla. Ir a inscribirse y comenzar implementación de la lógica

Y así sucesivamente...

 43
Author: Evgeniy Dorofeev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-24 15:41:58

Esto se hará más claro cuando se centre en el comportamiento esperado del código en lugar de la implementación del código. Así que dado el escenario que describiste, puedes llegar a la conclusión de que tendrás que escribir el método enroll() en alguna clase. A continuación, puede considerar cómo va a probar esta clase.

Comienzas considerando las condiciones de la clase y lo que se espera de ella. Tal vez puedas identificar ciertos invariantes de la clase. En ese caso para probar la clase consideras las formas en que ese invariante puede ser violado.

Así que tomando la declaración: un estudiante puede registrarse para un máximo de 3 cursos por semestre, usted considera las formas en que esto puede ocurrir.

  1. El estudiante está registrado para 0 cursos para el semestre dado, intento de registrarse para un curso, resultado: registro exitoso; el estudiante ahora está registrado para 1 curso para el semestre dado.
  2. El estudiante está registrado para 1 curso para un semestre determinado, intente registrarse para un curso, resultado: registro exitoso; el estudiante ahora está registrado para 2 cursos para el semestre dado.
  3. El estudiante está registrado para 3 cursos para el semestre dado, intento de registrarse para un curso, resultado: Fail (tal vez se lanza la excepción?)
  4. etc etc

Luego escribes estas pruebas. Cada uno de ellos puede ser un método de prueba. Por lo tanto, el método de prueba aseguraría que los objetos se crean y el entorno se configura como se espera. Luego llame al método y compare el resultado con el resultado esperado. Si lo que esperas que suceda realmente sucede, entonces la prueba pasó.

Ahora, inicialmente, como aún no escribiste el método, las pruebas no pasarían realmente. Pero a medida que comience a escribir código, sus pruebas comenzarán a pasar y, finalmente, el 100% de sus pruebas pasarán, momento en el que estará satisfecho de que su código cumple con los requisitos.

 4
Author: Vincent Ramdhanie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-25 03:42:40
public void shouldNotEnrollInMoreThanFourClassesInASemester() {
  Enroller enroller = new Enroller();
  Student student = new Student();
  Semester one = new Semester();
  Semester two = new Semester();
  Course geology = new Course(one);
  Course architecture = new Course(one);
  Course calculus = new Course(one);
  Course sociology = new Course(one);
  Course geometry = new Course(two);

  assertOk(enroller.enroll(student, geology));
  assertOk(enroller.enroll(student, architecture));
  assertOk(enroller.enroll(student, calculus));
  assertNotOk(enroller.enroll(student, sociology));
  assertOk(enroller.enroll(student, geometry));
}
 3
Author: Carl Manaster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-25 03:36:47

En su escenario, debe probar cada capa por separado, por lo que debe burlarse del dao al probar la capa de servicio.

La primera vez que escribes la prueba no se compilará, lo que significa que falla, pero eso está bien ya que las clases no existen.

En su ejemplo, ¿qué capa debe aplicar para registrarse como máximo en 3 cursos? Eso afectará la forma en que se realiza la prueba.

Escribir primero la prueba te ayudará a resolver este tipo de preguntas.

Como se mencionó, esto es demasiado abierto para una respuesta definitiva, pero si usted comienza a escribir su prueba a continuación, publicar como una actualización que podría ayudar.

Por lo tanto, escriba su prueba dao y luego escriba las clases y métodos para que se compile, pero aún debe fallar hasta que yiu termine la implementación. Probablemente querrá probar los registros de clase 2,3,4 y asegurarse de que cada uno falla apropiadamente, luego termine la implementación.

 1
Author: James Black,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-25 03:41:33