Tu no sabes Unit Testing

oswaldo.herrera@WIZELINE.com 

@wdonet

Python DayMéxico   Junio 10, 2017

Aislar cada parte del programa y demostrar que las partes individuales son correctas

Para que ?  

Ventajas

cobertura de código

asegurar el comportamiento del código legado

documentar el código

programación orientada a interfaces

fomentar el cambio

simplifica la integración de componentes

agiliza la programación

menos bugs

refactorizar

Tips para hacer

Pruebas Unitarias

 

Enfócate en

pequeñas funcionalidades


import unittest
from sorters import InsertionSort # code from module you're testing

class SimpleTestCase(unittest.TestCase):

    def runTest(self):
      source = [6, 8, 12, 11, 15, 13, 20, 3, 10]
      result = InsertionSort.sort(source)
      assert len(source) == len(result), 'incorrect size'
      self.assertEqual(result, [3, 6, 8, 10, 11, 12, 13, 15, 20])

AssertionError

Debe poderse

ejecutar independiente

 

fixtures & suites

setUp()

tearDown()


def setUp(self):
    self.file = open("test-cases.xml", "r")

def tearDown(self):
    self.file.close()

solo termina

Ejecuta Test


if __name__ == "__main__":
    unittest.main() # run all tests

suite

import unittest

class SimpleWidgetTestCase(unittest.TestCase):
    def setUp(self):
        self.widget = Widget("The widget")

    def test_default_widget_size(self):
        assert self.widget.size() == (50,50), 'incorrect default size'

    def test_widget_resize(self):
        self.widget.resize(100,150)
        assert self.widget.size() == (100,150), \
               'wrong size after resize'


if __name__ == "__main__":
    unittest.main() # run all tests
import unittest

class SimpleWidgetTestCase(unittest.TestCase):
    def setUp(self):
        self.widget = Widget("The widget")



class DefaultWidgetSizeTestCase(SimpleWidgetTestCase):
    def runTest(self):
        assert self.widget.size() == (50,50), 'incorrect default size'

class WidgetResizeTestCase(SimpleWidgetTestCase):
    def runTest(self):
        self.widget.resize(100,150)
        assert self.widget.size() == (100,150), \
               'wrong size after resize'

fixtures

Donde ?

src

    README.md
    LICENSE
    setup.py
    requirements.txt
    sample

        __init__.py
        core.py
        helpers.py
   
    test_basic.py
   
    test_advanced.py

src

    README.md
    sample1

        __init__.py
        core.py

    sample2

        __init__.py

        helpers.py

    tests

        test_sample1.py
        test_sample2.py

De

rápida ejecución

Misma suite

 

Ejecución automática

 

 

Acceden a datos simples o a ninguno

Suite diferente

 

Ejecutar en Scheduled Task

 

Acceden a una estructura de datos compleja

Unos pocos milisegundos

 

 

 

 

 

 

 

 

 

 

Pruebas de unidad

Habitos

Aprende a usar tus herramientas de trabajo para crear pruebas

Ejecuta la suite de

 

pruebas antes y después de cambiar un módulo

Implementar un hook

 

antes y depués

de subir el código

al repositorio

Disfruta tu

tiempo libre

 

escribiendo una

prueba unitaria

Utiliza las pruebas unitarias

 

para entender el código

Utiliza las pruebas unitarias

 

para introducir el código a

nuevos ingenieros en el equipo

Métodos con

Nombres Descriptivos

square()

sum()
test_square_of_number_9()

test_square_of_negative_number()

test_sum_of_1_and_n()

test_sum_negative_number_greater_than_positive_number()

Nombres  descriptivos de pruebas:

Módulo a probar

test_1()
test_must_work()
test_god_damn_fail()

No!

Bugs

reprodúcelo con una prueba unitaria e inclúyela en una suite 

oswaldo.herrera@WIZELINE.com 

 

twitter: @wdonet

Tu no sabes Unit Testing

By Oswaldo Herrera

Tu no sabes Unit Testing

Recomendaciones sobre la creación de Pruebas Unitarias. Aunque se usan ejemplos con Python, muchos de los conceptos son aplicables a cualquier lenguaje orientado a objetos.

  • 658