单元测试解决方案:
serial.py:
class Serial(object):
def __init__(self, port, baudrate):
self.port = port
self.baudrate = baudrate
def write(self, data):
return 100
myclass.py:
import serial
class MyClass(object):
def __init__(self, com_port, baudrate):
self.sp = serial.Serial(com_port, baudrate)
def do_something(self, data):
num_bytes_written = self.sp.write(data)
if num_bytes_written != len(data):
return -1
return 0
test_myclass.py:
import unittest
from unittest import mock
import serial
import myclass
class TestMyClass(unittest.TestCase):
@mock.patch('myclass.serial.Serial')
def test_do_something_fails_on_bad_write(self, mock_Serial):
serial_instance = mock_Serial()
serial_instance.write.return_value = 1
want = -1
dummy_data = b'123'
c = myclass.MyClass('COM8', 115200)
got = c.do_something(dummy_data)
self.assertEqual(got, want)
serial_instance.write.assert_called_once_with(b'123')
@mock.patch('myclass.serial.Serial')
def test_do_something_success(self, mock_Serial):
serial_instance = mock_Serial()
serial_instance.write.return_value = 3
want = 0
dummy_data = b'123'
c = myclass.MyClass('COM8', 115200)
got = c.do_something(dummy_data)
self.assertEqual(got, want)
serial_instance.write.assert_called_once_with(b'123')
if __name__ == '__main__':
unittest.main()
带有覆盖率报告的单元测试结果:
..
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK
Name Stmts Miss Cover Missing
--------------------------------------------------------------------------
src/stackoverflow/61333922/myclass.py 9 0 100%
src/stackoverflow/61333922/serial.py 6 3 50% 3-4, 7
src/stackoverflow/61333922/test_myclass.py 25 0 100%
--------------------------------------------------------------------------
TOTAL 40 3 92%