2015-02-27 4 views
5

unittest Ich mache Raspberry Pi Programm mit Python. Ich möchte unittest meines Python-Codes schreiben. Wie kann ich den Ausgabestatus GPIO erhalten?Wie man GPIO Ausgabewert von Raspberry Pi in Python

Testzielklasse ist unten. Ich möchte Ausgänge nach Aufruf von Stop, Bremse, rotateClockwise und rotateCounterClockwise überprüfen.

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

Wenn ich nicht zu spät bin, habe ich gestern eine Antwort gepostet, die zu Ihrer Frage passen sollte –

Antwort

2

Wenn Sie RPi.GPIO Bibliothek vertrauen, ich glaube, es ist ein guter Angabe Punkt ist, können Sie patch it by unittest.mock framework. patchRPi.GPIO.output geben Sie die Möglichkeit, die Abhängigkeit von HW zu brechen und die Aufrufe an diese Funktion zu spüren.

Das Ihre Testklasse

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) 

paar Noten sein könnte:

  • In Python-2.7 Verwendung mock verfügbar von pip statt unittest.mock
  • ich autospec=True bin mit fast in jedem Test Wenn Sie sich fragen, warum werfen Sie einen Blick this
  • Meine Tests sho old fast 1 Fehler in Ihrem Code: Tippfehler in brake Methode
Verwandte Themen