Usuario:Luis.perez/sistemaspyaytozgz/testing

De WikiEducator
Revisión a fecha de 00:15 21 ene 2013; Luis.perez (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar



Instalar nose

Puedes usar pip o easy_install:

easy_install nose

o

pip install nose

O instalar desde el código fuente:

python setup.py install


Doctests

  • Documentación de código que además sirve como tests
  • Buena forma de obligar a mantener los docstrings actualizados
  • Tests junto al código, facilitan su mantenimiento
def add(a, b):
    """
    Suma dos números
 
    >>> add(5, 2)
    7
    """

Ejecutamos los doctests de dos formas:

  • Con el módulo doctest:
# ...
 
if __name__ == "__main__":
    import doctest
    doctest.add()
  • Con nose:
$ nosetests --with-doctest


Unittest

http://docs.python.org/2/library/unittest.html

  • Parte de la librería estandar
  • NUnit

Caracteristicas

  • Test cases: Clases que encapsulan un conjunto de tests. Extienden de unittest.TestCase
  • fixtures: métodos para preparar o destruir objetos que puedan necesitar todos los tests


Ejemplo

# randomtests.py
import random
import unittest
 
class TestSequenceFunctions(unittest.TestCase):
 
    def setUp(self):
        self.seq = range(10)
 
    def test_shuffle(self):
        # make sure the shuffled sequence does not lose any elements
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, range(10))
 
    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)
 
    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)

Ejecutando los tests

Se puede hacer añadiendo al código:

#...
if __name__ == '__main__':
    unittest.main()


O bien por línea de comando:

#...
 
python -m unittest seqtests
python -m unittest seqtests.TestSequenceFunctions
python -m unittest seqtests.TestSequenceFunctions.test_shuffle
 $ python -m unittest seqtests.TestSequenceFunctions
 ...
 ----------------------------------------------------------------------
 Ran 3 tests in 0.000s
 OK

Se puede usar el autodiscover:

$ python -m unittest discover

Busca módulos de test que se llamen test*.py (se puede modificar este comportamiento)

Fixtures

  • setUp: Se invoca antes de la ejecución de cada test
  • tearDown: Se invoca después de la ejecución de cada test
  • setUpClass: Se invoca una única vez antes de la ejecución de los tests del TestCase
@classmethod
def setUpClass(cls):
    ...
  • tearDownClass: Se invoca una única vez después de la ejecución de los tests del TestCase
@classmethod
def tearDownClass(cls):
    ...

Asserts

Escribe los tests en el proyecto y:Now you can run tests for your project:

 cd path/del/proyecto
 nosetests

Verás algo así:

 ..................................
 ----------------------------------------------------------------------
 Ran 34 tests in 1.440s
 
 OK

Escribir tests

Mira estos ejemplos

def test_a():
    assert ...

Para comprobar:

 $ nosetests