c# - tutorial - Pruebas unitarias automatizadas: ¿por qué? ¿Qué? ¿cual?
pruebas unitarias con xunit (6)
El motivo de las pruebas unitarias automatizadas es simple: porque a medida que su código crece, llevará más tiempo realizar pruebas manuales, lo que significa que es cada vez menos probable que lo haga.
Al automatizar las pruebas, las hace más fáciles de ejecutar, por lo que se ejecutarán.
Soy un desarrollador de C # winforms con una experiencia de alrededor de un año. La única prueba de unidad que he estado haciendo hasta ahora ha sido manual. He estado pensando en seguir por algún tiempo:
- ¿Por qué necesitamos tener pruebas unitarias automatizadas? ¿Qué tan efectivo es?
- Si quiero comenzar a hacer pruebas unitarias automáticas. ¿De dónde debería empezar? (he oído hablar de nunit)
- ¿Debo tener algo en cuenta al diseñar mis clases para facilitar las pruebas unitarias automatizadas?
- ¿Tiene C # una compatibilidad incorporada para las pruebas unitarias automatizadas?
- ¿Podemos también probar GUI con pruebas unitarias automatizadas o solo es lógica de negocios?
- He oído hablar de marcos de burla. ¿Son también para pruebas unitarias?
Punto 1) Le da una visión general continua de qué funciona y qué no. Tan pronto como cambie una función simple tendrá el resultado si este cambio rompe algo. Además, más adelante puede refactorizar toda su aplicación y, en lo que respecta a la prueba de unidad, todo se vuelve verde, todo funciona bien. Solo este punto es muy importante. ¿O alguna vez has hecho un proyecto que nunca tuvo que ser refactorizado?
Punto 2) NUnit es un buen lugar para comenzar, pero hay varios otros marcos de pruebas unitarias. También sugiero echarle un vistazo a CruiseControl u otras herramientas de integración continua que le quitan mucho trabajo al desarrollador.
Punto 3) Bueno, seguro hay personas que pueden decirle horas y horas qué hacer y qué no. En cuanto a que mi experiencia en pruebas unitarias está limitada a su uso para dispositivos integrados, tenemos otras dificultades.
Punto 4) C # es un lenguaje de programación, no un marco de prueba. .Net tiene al menos un atributo que puede ayudar durante las pruebas unitarias, es decir, el atributo InternalsVisibleTo-Attribute para hacer que sus clases y métodos internos sean públicos para un tipo específico.
Punto 5) Si tienes una aplicación bien diseñada, no tienes que probar tu GUI. Piensa en esto: tu GUI no tiene código. Cada botón que un usuario puede presionar se asigna al controlador. Cada entrada que un usuario puede proporcionar se entrega al controlador. Entonces, ¿qué tienes que probar en tu GUI? Todo lo que tiene que hacer es hacer que su controlador sea probado y funcione bien. Y con esta MVVM / MVC / WhatElseArchitecture, tiene, por un lado, una aplicación bien diseñada y, por otro lado, una aplicación que es fácil de probar.
- ¿Por qué necesitamos tener pruebas unitarias automatizadas? ¿Qué tan efectivo es?
Muy.
Si quiero comenzar a hacer pruebas unitarias automáticas. ¿De dónde debería empezar? (he oído hablar de nunit) Comience con nunit - es muy fácil
¿Debo tener algo en cuenta al diseñar mis clases para facilitar las pruebas unitarias automatizadas? Si obtienes una buena prueba de unidad, querrás hacerlo.
¿Tiene C # una compatibilidad incorporada para las pruebas unitarias automatizadas? No, pero Visual Studio sí, pero no recomiendo usarlo
¿Podemos también probar GUI con pruebas unitarias automatizadas o solo es lógica de negocios? Todo se puede automatizar, solo es cuestión de lo difícil que es hacer.
He oído hablar de marcos de burla. ¿Son también para pruebas unitarias? Sí.
Why do we need to have automated unit testing? How effective is it?
Tu no Depende de usted decidir si quiere o no. Solo será tan efectivo como lo hagas. ¡Debería optar por la automatización solo si va a repetir el ciclo de prueba por un fragmento de código más de 3 veces! Si quiero comenzar a hacer pruebas unitarias automáticas. ¿De dónde debería empezar? (he oído hablar de nunit)
Lo que sea que se sienta cómodo, conviértalo en su punto de partida y luego explore y utilícelo a su favor. ¿Podemos también probar GUI con pruebas unitarias automatizadas o solo es lógica de negocios?
Puedes pero no deberías. La GUI se prueba mejor manualmente. Los ojos captarán más errores en la interfaz de lo que lo hará una máquina. He oído hablar de marcos de burla. ¿Son también para pruebas unitarias?
Sí, la mayoría de los frameworks como TestNG, Junit, etc. son para pruebas unitarias.
- ¿Por qué necesitamos tener pruebas unitarias automatizadas? ¿Qué tan efectivo es?
Para aislar partes de un programa y mostrar que son "correctas". Son un contrato si se quiere saber cómo se supone que se ejecutará el código. Con esto a mano pueden decirle rápidamente y a menudo si el código está actuando correctamente.
Las pruebas unitarias permiten a los programadores cambiar el código más fácilmente, con más confianza y menos efectos secundarios. Promueve / habilita la refactorización de código que sin pruebas unitarias puede ser peligroso. Con todo esto en mente, creo que las pruebas unitarias mejorarán su código.
Los encuentro efectivos pero admitiré que esto es parte de la curva de aprendizaje. Hasta que te vuelves realmente bueno en eso (y sigo siendo un principiante en mi mente) a menudo te perderás las cosas, pero he descubierto que todavía es mucho mejor que las pruebas manuales que he hecho por mucho tiempo. Encontré un beneficio casi instantáneo en las pruebas unitarias. En mi primer proyecto con él, descubrí que estaba ahorrando una gran cantidad de tiempo, ya que no tuve que hacer pruebas manuales casi tanto y, en realidad, fui gratamente sorprendido más de una vez cuando el código que estaba trabajando en las pruebas causadas falló en otro lugar. Ni siquiera hubiera pensado volver a probar manualmente.
- Si quiero comenzar a hacer pruebas unitarias automáticas. ¿De dónde debería empezar? (he oído hablar de nunit)
Nunit es bueno, MbUnit es bueno. Para comenzar, lea y haga los ejercicios en las lecturas. Sitios web y blogs sobre pruebas unitarias, desarrollo basado en pruebas (TDD) y refactorización. Object Mentor tiene una buena serie en TDD. Luego, en algún momento, elige un código que tengas y pruébalo.
Libros que sugiero: Desarrollo impulsado por prueba, por ejemplo, Desarrollo impulsado por prueba, Una guía práctica, El arte de las pruebas unitarias, Refactorización (Martin Fowler), Libro de trabajo de refactorización, Refactorización de patrones, Código limpio y estoy seguro de que hay otros.
Tengo libros de refactorización en la lista porque he encontrado las técnicas para refactorizar el trabajo de la mano con las pruebas unitarias.
- ¿Debo tener algo en cuenta al diseñar mis clases para facilitar las pruebas unitarias automatizadas?
Muchos de los libros que mencioné discutirán esto. La respuesta es sí y no. A menudo, una clase mejor diseñada que tiene menos dependencias es más fácil de probar. Esto es solo un buen diseño, pero resulta más fácil hacer las pruebas. Hay un poco de debate sobre si deberías cambiar el código solo para hacerlo más comprobable. Me inclino hacia ti debería. En este punto para mí, mi código en el pasado no incorporó muchas ideas de "buen diseño", así que para mí embarcarme en este viaje TDD es aumentar mi conocimiento y nivel de buen diseño en mi código, lo que en parte se debe a querer hacer TDD.
- ¿Tiene C # una compatibilidad incorporada para las pruebas unitarias automatizadas?
Si tiene VS 2008 Pro, sí o sistema de equipo, pero naturalmente, supongo que no.
- ¿Podemos también probar GUI con pruebas unitarias automatizadas o solo es lógica de negocios?
Sí, hay varias herramientas por ahí. Watin es uno que viene a la mente.
- He oído hablar de marcos de burla. ¿Son también para pruebas unitarias?
Sí. Permiten simular / probar objetos muy complejos que no puede probar fácilmente en una unidad.
En mi viaje por el camino de TDD, ignoré deliberadamente la burla al principio. Para mí, quería entender mejor por qué se necesitan y cómo se utilizarían al vivir sin él y ver por mí mismo cómo codifiqué dónde me quedaría atascado con las técnicas tradicionales de TDD.
Otro libro que he encontrado de gran utilidad, aunque me duele leer es Trabajar eficazmente con Legacy Code. Realmente te muestra cómo el código aparentemente inocente para los desentrenados puede hacer la vida realmente difícil en la línea.
¿Por qué necesitamos tener pruebas unitarias automatizadas? ¿Qué tan efectivo es?
Las pruebas unitarias automatizadas son muy valiosas ante todo porque son automatizables (normalmente, solo lo consideramos una "prueba unitaria" cuando es automatizable). A medida que crece el tamaño de una aplicación, probar manualmente toda la aplicación puede tomar horas o incluso semanas. Incluso probar solo una pequeña parte de una aplicación lleva tiempo y es propensa a errores. A menos que sea autista, no podrá centrarse en realizar cada prueba manual al 100% correctamente si tiene que hacerlo una y otra vez.
En el desarrollo Agile, operamos con el concepto de Retroalimentación Rápida: cuanto antes pueda obtener retroalimentación sobre lo que hizo estuvo bien o mal, más efectivo puede ser. Todos cometemos errores, pero es mucho menos costoso descubrir y corregir un error treinta segundos después de haber sido fabricado, que varios días o semanas después. Es por eso que las pruebas automatizadas son tan importantes.
Si bien puede realizar pruebas automatizadas en muchos niveles, las pruebas unitarias son el tipo más eficiente para implementar. Puede ser la disciplina de prueba más difícil de entender y dominar, pero es mucho más sólida que cualquier otro tipo de prueba.
Si quiero comenzar a hacer pruebas unitarias automáticas. ¿De dónde debería empezar? (he oído hablar de nunit)
Antes que nada, debes aprender algunos conceptos básicos de pruebas de unidades. El libro de Roy Osherove The Art of Unit Testing es una buena introducción.
Cuando se trata de frameworks, NUnit ha existido por mucho tiempo, pero tiene algunos problemas inherentes.
Si ya tiene Visual Studio Professional o Team System, hay un marco integrado de pruebas de unidades comúnmente conocido como MSTest. A la mayoría de las personas no les gusta este marco, pero personalmente, me parece bastante adecuado. La integración IDE funciona bien, pero la API podría ser mejor.
Si está buscando un marco de pruebas de unidades de código abierto, gratuito, recomendaría xUnit.net , que es un marco mucho más moderno.
¿Debo tener algo en cuenta al diseñar mis clases para facilitar las pruebas unitarias automatizadas?
Sí, cada clase debería poder usarse en forma aislada. Esto puede ser muy difícil de hacer por diseño inicial, o si está tratando de actualizar las pruebas de la unidad en el código existente, pero debería ser más o menos natural si adopta el Desarrollo controlado por prueba (TDD).
¿Tiene C # una compatibilidad incorporada para las pruebas unitarias automatizadas?
No, C # es solo un lenguaje, pero como mencioné anteriormente, ciertas versiones de Visual Studio tienen MSTest.
¿Podemos también probar GUI con pruebas unitarias automatizadas o solo es lógica de negocios?
La GUI de prueba unitaria tiende a ser muy frágil (es decir, el mantenimiento de la prueba es muy alto), por lo que generalmente no es una buena idea.
Sin embargo, hay muchos patrones de diseño que pueden ayudarlo a extraer toda la lógica de la GUI en clases verificables: Modev-View-Controller, Model-View-Presenter, Application Controller, Model-View-ViewModel, etc.
Puede realizar pruebas automatizadas de una aplicación completa a través de dichas interfaces, evitando solo la parte de representación de la GUI. Dichas pruebas se llaman Pruebas Subcutáneas, pero se consideran Pruebas de Integración, no pruebas unitarias.
He oído hablar de marcos de burla. ¿Son también para pruebas unitarias?
Las bibliotecas de simulación dinámicas son solo para pruebas unitarias.
Algunos buenos y populares son