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
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.
- 661