2010-08-28 10 views
15

Claramente, I don't understand unit testing. Esto está bien, considerando que nunca lo había hecho antes. Estoy comenzando un nuevo proyecto, y quería probarlo desde el principio, así que estoy buscando aprender.¿Qué debe y no debe cubrirse con pruebas unitarias?

Siempre he comparado las pruebas unitarias con la cobertura del código, pensando que debe tener pruebas unitarias que cubran cada función/método en su aplicación, pero claramente este no es el caso y he entendido mal el concepto.

Así,

  • ¿Qué tipo de funciones se benefician de las pruebas unitarias?
  • ¿Qué tipo de funciones no se deben probar unitarias?

Respuesta

1

Según TDD (Test Driven Development) metodología cual examine toda función pública, y cada ruta de ejecución en esa función.

+0

pero cosas como controladores y enrutadores (es decir, controladores frontales) son públicos, y no veo cómo las pruebas unitarias pueden cubrirlos. Este es el problema que formulé en la pregunta a la que me he vinculado y la razón de ser de esta pregunta. ¿Debería enmendarse algo así como "cada función pública que devuelve un valor", o existe alguna forma de hacer que las pruebas unitarias cubran estas instancias? – AgentConundrum

+0

Controladores y enrutadores también deben probarse. No es una teoría, se hace en la práctica sobre una base diaria. Algunos frameworks, es decir, Rails, lo hacen más fácil que otros. Pruebas de ejemplo para controladores: http://guides.rubyonrails.org/testing.html#functional-tests-for-your-controllers Ejemplos de pruebas de rutas: http://guides.rubyonrails.org/testing.html#testing- rutas – qertoip

0

La prueba de unidades es una herramienta, y hay muchos enfoques sobre cómo usarla. Aquí está mi enfoque:

Escribo mis pruebas unitarias contra las firmas de servicio y DAO, y no tanto contra las DTO y los tipos de entidad. La mayoría de los tipos de valores serán probados indirectamente. Sin embargo, se deben probar los métodos equals y hashCode en DTOs y tipos de entidades.

Utilizo pruebas de unidades puras con dependencias falsas y pruebas de integración con el servidor completo. Para una cobertura adecuada, uno necesita ambos.

+0

Lo siento, me estoy perdiendo un poco en sus términos ("firmas DAO", "DTO"). ¿Podrías aclarar esto un poco? – AgentConundrum

+0

* DAO = http://en.wikipedia.org/wiki/Data_access_object (servicios para abstracción de persistencia) * DTO = http://en.wikipedia.org/wiki/Data_transfer_object (objetos de valor) –

2

no tengo una respuesta completa (me gustaría escuchar a alguien que lo hace, la verdad), pero al menos puedo echar un vistazo a algunos puntos ...

  1. ya se encuentra en el pista correcta al impulsar el desarrollo de las pruebas en primer lugar. Las pruebas de unidad de ajuste retroactivo en aplicaciones existentes son difíciles y rara vez proporcionan un beneficio real (en cambio, a menudo dan una falsa sensación de cobertura de código). El TDD apropiado es siempre una previsión, nunca una idea de último momento.
  2. No me molestaría en probar funciones privadas. Varias herramientas de cobertura de código pueden decir que no se ha probado, pero si es privada, entonces su funcionalidad debe probarse probando los métodos públicos. Los métodos privados son internos y no forman parte de la API, nada fuera de la clase (incluso las pruebas) debe saber o preocuparse por ellos, ya que pueden cambiar fácilmente si se cambia la implementación de esa clase.
  3. Enfóquese en la API expuesta de su código. Escriba pruebas contra sus interfaces, no contra sus clases. Las clases mismas se implementan y prueban luego contra las pruebas.
  4. Finalmente, y muy importante, estudie lo que está haciendo y cuáles son sus beneficios. Las pruebas de unidad de escritura no son un proceso de marrón y servir. Uno no logra una buena cobertura de prueba simplemente escribiendo pruebas, sino entendiendo TDD y cómo implementarlo. Tomará práctica. Una sugerencia que le daría es hacer un proyecto apropiado de TDD y también tratar de adaptar las pruebas en un proyecto existente. Podemos decirnos el uno al otro todo el día que el primero es mejor que el segundo, pero al hacer ambos puedes distinguir las diferencias y obtener una mejor comprensión de por qué es mejor. Esto lo llevará más allá de solo escribir las pruebas y ser más un experto en TDD y lo que realmente trae a la mesa. Cualquiera puede escribir pruebas, pero con demasiada frecuencia solo están perdiendo el tiempo a menos que realmente entiendan lo que está pasando.
+0

@David: usted otra vez ! Puedo decir que voy a aprender mucho de ti ... Dos cosas: 1) Ya entiendo # 1/# 4 simplemente por leer mucho al respecto, y por la vaga experiencia con conceptos similares: es la misma razón por la que QA se necesitan departamentos: un desarrollador sabe demasiado sobre el código y actualizará la prueba para pasar el código. 2) volviendo a la pregunta de mvc que también respondió por mí, ¿cómo concilia los "métodos públicos de pruebas unitarias" con cosas como controladores y enrutadores/controladores frontales? Estos objetos tienen interfaces públicas, pero no veo cómo puede ajustar las pruebas unitarias sobre ellos. – AgentConundrum

+0

@AgentConundrum: ¿Yo de nuevo? :) Uno de los grandes beneficios de los controladores en MVC por código subyacente en WebForms es que se pueden probar fácilmente en unidades. Eche un vistazo aquí: http://www.lostechies.com/blogs/chrismissal/archive/2010/02/05/unit-testing-simple-asp-net-mvc-controllers.aspx y http://msdn.microsoft .com/en-us/magazine/dd942838.aspx y http://www.asp.net/mvc/tutorials/creating-unit-tests-for-asp-net-mvc-applications-vb El "contexto" de la la aplicación se puede burlar, por lo que solo debe probar que las acciones devuelvan las vistas correctas. Los simulacros en las dependencias verifican que se llamaron correctamente. – David

+0

(Disculpe si asumo .NET aquí, simplemente ha sido mi experiencia. Sin embargo, los conceptos se pueden aplicar universalmente, independientemente de las herramientas utilizadas.) – David

Cuestiones relacionadas