raspberry pulsador python raspberry-pi python-unittest

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 por pip lugar de unittest.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