2008-09-17 9 views
5

Recientemente he estado experimentando con TDD mientras desarrollaba una aplicación GUI en Python. Me resulta muy tranquilizador tener pruebas que verifiquen la funcionalidad de mi código, pero ha sido difícil seguir algunas de las prácticas recomendadas de TDD. A saber, escribir pruebas primero ha sido difícil. Y me resulta difícil hacer que mis pruebas sean legibles (debido al uso extensivo de una biblioteca burlona).Prueba del código GUI: ¿debería usar una biblioteca de burla?

Elegí una biblioteca burlona llamada mocker. Lo uso mucho porque gran parte del código que estoy probando hace llamadas a (a) otros métodos en mi aplicación que dependen del estado del sistema o (b) objetos ObjC/Cocoa que no pueden existir sin un bucle de evento, etc.

de todos modos, tengo una gran cantidad de pruebas que se ven así:

def test_current_window_controller(): 
    def test(config): 
     ac = AppController() 
     m = Mocker() 
     ac.iter_window_controllers = iwc = m.replace(ac.iter_window_controllers) 
     expect(iwc()).result(iter(config)) 
     with m: 
      result = ac.current_window_controller() 
      assert result == (config[0] if config else None) 
    yield test, [] 
    yield test, [0] 
    yield test, [1, 0] 

Tenga en cuenta que esto es en realidad tres pruebas; todos usan la misma función de prueba parametrizada. Aquí está el código que se está probando:

def current_window_controller(self): 
    try: 
     # iter_window_controllers() iterates in z-order starting 
     # with the controller of the top-most window 
     # assumption: the top-most window is the "current" one 
     wc = self.iter_window_controllers().next() 
    except StopIteration: 
     return None 
    return wc 

Una de las cosas que he notado con el uso de burlador es que es más fácil escribir el código de la aplicación en primer lugar y luego volver y escribir las pruebas en segundo lugar, ya que la mayoría de la tiempo me estoy burlando de muchas llamadas a métodos y la sintaxis para escribir las llamadas simuladas es mucho más detallada (por lo tanto, más difícil de escribir) que el código de la aplicación. Es más fácil escribir el código de la aplicación y luego modelar el código de prueba de eso.

Me parece que con este método de prueba (y un poco de disciplina) puedo escribir código fácilmente con una cobertura de prueba del 100%.

Me pregunto si estas pruebas son buenas pruebas? ¿Me arrepentiré de haberlo hecho así cuando finalmente descubro el secreto para escribir buenas pruebas?

¿Estoy violando tanto los principios básicos de TDD que mi prueba es en vano?

Respuesta

-2

Las pruebas de unidad son realmente útiles cuando refactoriza su código (es decir, reescribe o mueve completamente un módulo). Siempre que tenga pruebas unitarias antes de hacer los grandes cambios, tendrá la certeza de que no ha olvidado moverse o incluir algo cuando termine.

7

Si está escribiendo sus pruebas después de escribir el código y hacer que aprueben, no está haciendo TDD (ni obtiene ningún beneficio del desarrollo Test-First o Test-Driven ... consulte SO preguntas para los libros definitivos sobre TDD)

Una de las cosas que he notado con utilizando burlador es que es más fácil de escribir el código de la aplicación primero y después volver atrás y escribir las pruebas segundos, ya que la mayoría de la época en que soy burlando muchas llamadas a métodos y el s la yinta para escribir las llamadas simuladas es mucho más detallado (por lo tanto más difícil de escribir) que el código de la aplicación. Es más fácil escribir el código de la aplicación y luego modelar el código de prueba de eso.

Por supuesto, es más fácil porque solo está probando que el cielo es anaranjado después de que lo hizo de naranja pintándolo con un tipo específico de pincel. Esto es pruebas de actualización (para la seguridad en sí mismo).Las burlas son buenas, pero debes saber cómo y cuándo usarlas. Como dice el refrán "Cuando tienes un martillo todo parece un clavo". También es fácil escribir una carga completa de ilegible y no tan útil como puedas. -ser pruebas. El tiempo dedicado a comprender de qué se trata la prueba es el tiempo perdido que se puede usar para reparar los rotos.

Y el punto es:

  • Leer Mocks aren't stubs - Martin Fowler si no lo ha hecho. Busque en Google algunas instancias documentadas de buenas GUIs con diseño ModelViewPresenter (falsas/simuladas las IU si es necesario).
  • Estudie sus opciones y elija sabiamente. Jugaré al hombre con el halo en el hombro izquierdo en blanco diciendo 'No lo hagas'. Lea esta pregunta como my reasons - St. Justin está en su hombro derecho. Creo que también tiene algo que decir :)
-3

Recuerda que TDD no es una panaceum. Es difícil, se supone que es difícil, y es especialmente difícil escribir pruebas de burla "por adelantado".

Así que yo diría que haga lo que funcione para usted. Incluso no es "certificado TDD". Básicamente hago lo mismo.

Es posible que desee proporcionar su propia API para la GUI que se situaría entre el código del controlador y el código de la biblioteca de la GUI. Eso podría ser más fácil de burlar, o incluso puedes agregarle algunos ganchos de prueba.

Por último, su código no parece ilegible para mí. Código que usa simulaciones es generalmente más difícil de entender. Afortunadamente en Python burlarse es mucho más fácil y más limpio que en otros idiomas.

Cuestiones relacionadas