pulsador - Cómo probar el valor de salida GPIO de Raspberry pi en Python
raspberry pi gpio python (1)
Estoy haciendo el programa Raspberry Pi usando python. Quiero escribir unittest
de mi código python. ¿Cómo puedo obtener el estado de salida de GPIO
?
la clase objetivo de prueba está abajo. Quiero verificar las salidas después de llamar a "detener", "frenar", "rotar en sentido horario" y "rotar encuentro" en el sentido de las agujas del reloj.
import RPi.GPIO as GPIO
# moter management class, with like TA7291P
class MoterManager:
def __init__(self, in1Pin, in2Pin):
self.__in1Pin = in1Pin
self.__in2Pin = in2Pin
def stop(self):
self.__offIn1()
self.__offIn2()
def brake(self):
elf.__onIn1()
self.__onIn2()
def rotateClockwise(self):
self.__onIn1()
self.__offIn2()
def rotateCounterClockwise(self):
self.__offIn1()
self.__onIn2()
def __onIn1(self):
GPIO.output( self.__in1Pin, True)
print "In1 on"
def __onIn2(self):
GPIO.output( self.__in2Pin, True)
print "In2 on"
def __offIn1(self):
GPIO.output( self.__in1Pin, False )
print "In1 off"
def __offIn2(self):
GPIO.output( self.__in2Pin, False )
print "In2 off"
Si confías en la biblioteca RPi.GPIO
, creo que es un buen punto de RPi.GPIO
, puedes patch
en unittest.mock
framework . patch
RPi.GPIO.output
da la posibilidad de romper la dependencia de HW y detectar las llamadas a esa función.
Esa podría ser tu clase de prueba
import unittest
from unittest.mock import patch, call
from my_module import MoterManager
@patch("RPi.GPIO.output", autospec=True)
class TestMoterManager(unittest.TestClass):
in1Pin=67
in2Pin=68
def test_init(self, mock_output):
"""If you would MoterManager() stop motor when you build it your test looks like follow code"""
mm = MoterManager(self.in1Pin,self.in1Pin)
mock_output.assert_has_calls([call(self.in1Pin, False),call(self.in2Pin, False)],any_order=True)
def test_stop(self, mock_output):
mm = MoterManager(self.in1Pin,self.in1Pin)
mock_output.reset_mock
mm.stop()
mock_output.assert_has_calls([call(self.in1Pin, False),call(self.in2Pin, False)],any_order=True)
def test_brake(self, mock_output):
mm = MoterManager(self.in1Pin,self.in1Pin)
mock_output.reset_mock
mm.stop()
mock_output.assert_has_calls([call(self.in1Pin, True),call(self.in2Pin, True)],any_order=True)
def test_rotateClockwise(self, mock_output):
mm = MoterManager(self.in1Pin,self.in1Pin)
mock_output.reset_mock
mm.stop()
mock_output.assert_has_calls([call(self.in1Pin, True),call(self.in2Pin, False)],any_order=True)
def test_rotateCounterClockwise(self, mock_output):
mm = MoterManager(self.in1Pin,self.in1Pin)
mock_output.reset_mock
mm.stop()
mock_output.assert_has_calls([call(self.in1Pin, False),call(self.in2Pin, True)],any_order=True)
Algunas notas:
- En python-2.7 usa el
mock
disponible porpip
lugar deunittest.mock
- Estoy usando
autospec=True
casi en todas las pruebas si te preguntas por qué echar un vistazo a esto - Mis pruebas deberían generar casi 1 error en tu código: error tipográfico en el método de
brake