2015-02-27 4 views
5

Sto creando un programma Raspberry Pi usando python. Voglio scrivere unittest del mio codice Python. Come posso ottenere lo stato di uscita di GPIO?Come smontare il valore di uscita GPIO di raspberry pi in Python

La classe di destinazione del test è riportata sotto. Voglio controllare le uscite dopo aver chiamato stop, freno, rotazione in senso antiorario e rotazione in senso orario.

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" 
+0

Se non sono in ritardo, ho postato una risposta ieri che dovrebbe essere adatta alla tua domanda –

risposta

2

Se vi fidate RPi.GPIO biblioteca, penso che sia un buon punto affermando, è possibile patch it by unittest.mock framework. patchRPi.GPIO.output offre la possibilità di interrompere la dipendenza da HW e rilevare le chiamate a tale funzione.

Che potrebbe essere la vostra classe di test

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) 

alcune note:

  • In python-2.7 Condizioni mock a disposizione da pip invece di unittest.mock
  • sto usando autospec=True quasi tutti i test se ti stai chiedendo perché dare un'occhiata this
  • I miei test sho uld solleva quasi 1 bug nel tuo codice: errore nel metodo brake