Estoy probando clases en Python usando unittest
. Según tengo entendido, unittest
llama a la función setUp
antes de cada prueba para que el estado de los objetos de prueba de la unidad sea el mismo y el orden en que se ejecuten las pruebas no importaría.Objetos de prueba de unidad en Python: el objeto no está escrito en la configuración
Ahora tengo esta clase Estoy probando ...
#! usr/bin/python2
class SpamTest(object):
def __init__(self, numlist = []):
self.__numlist = numlist
@property
def numlist(self):
return self.__numlist
@numlist.setter
def numlist(self, numlist):
self.__numlist = numlist
def add_num(self, num):
self.__numlist.append(num)
def incr(self, delta):
self.numlist = map(lambda x: x + 1, self.numlist)
def __eq__(self, st2):
i = 0
limit = len(self.numlist)
if limit != len(st2.numlist):
return False
while i < limit:
if self.numlist[i] != st2.numlist[i]:
return False
i += 1
return True
con las siguientes pruebas unitarias ...
#! usr/bin/python2
from test import SpamTest
import unittest
class Spammer(unittest.TestCase):
def setUp(self):
self.st = SpamTest()
#self.st.numlist = [] <--TAKE NOTE OF ME!
self.st.add_num(1)
self.st.add_num(2)
self.st.add_num(3)
self.st.add_num(4)
def test_translate(self):
eggs = SpamTest([2, 3, 4, 5])
self.st.incr(1)
self.assertTrue(self.st.__eq__(eggs))
def test_set(self):
nl = [1, 4, 1, 5, 9]
self.st.numlist = nl
self.assertEqual(self.st.numlist, nl)
if __name__ == "__main__":
tests = unittest.TestLoader().loadTestsFromTestCase(Spammer)
unittest.TextTestRunner(verbosity = 2).run(tests)
Esta prueba falla por test_translate.
que puedo hacer dos cosas para que las pruebas tienen éxito:
(1) Elimine la segunda línea en la función de configuración. O bien,
(2) Cambie los nombres de las pruebas de manera que ocurra primero translate
. Me di cuenta de que unittest
ejecuta las pruebas en orden alfabético. Cambiar translate
a, digamos, atranslate
para que se ejecute primero hace que todas las pruebas sean exitosas.
Para (1), no puedo imaginar cómo esto afecta las pruebas ya que en la primera línea de setUp
, creamos un nuevo objeto para self.st. En cuanto a (2), mi queja es similar ya que, oye, en setUp
asigno un nuevo objeto a self.st
así que cualquier cosa que haga a self.st
en no debe afectar el resultado de test_translate
.
Entonces, ¿qué es lo que me falta aquí?
Entonces ... educarme un poco más. ¿Cuál es la diferencia entre 'is None' y' == None'? Siempre utilicé 'is None'; no sabía que '== None' funciona. – skytreader
@skytreader: El operador 'is' prueba la identidad del objeto. El valor 'None' está representado por la instancia única de la clase NoneType. Tener el valor 'Ninguno' significa que está compartiendo la referencia al objeto idéntico. La 'numlist es Ninguna 'significa que está probando si el objeto idéntico es compartido. El operador '==' es más complicado. Si la 'numlist' fuera la instancia (referencia a) de una clase que define su propio método' .__ eq__', ''==' podría producir un valor booleano inesperado. Sin embargo, es casi lo mismo en casos simples. – pepr