mirror of
				https://github.com/cmur2/python-bme680.git
				synced 2025-10-31 10:25:13 +01:00 
			
		
		
		
	Expand test coverage and improve tests
This commit is contained in:
		| @@ -12,3 +12,4 @@ ignore = | ||||
| 	E501 | ||||
| 	F403 | ||||
| 	F405 | ||||
| 	W504 | ||||
|   | ||||
							
								
								
									
										101
									
								
								library/tests/conftest.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								library/tests/conftest.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| import sys | ||||
| import mock | ||||
| import pytest | ||||
| import bme680 | ||||
| from bme680.constants import CalibrationData | ||||
|  | ||||
|  | ||||
| class MockSMBus: | ||||
|     """Mock a basic non-presence SMBus device to cause BME680 to fail. | ||||
|  | ||||
|     Returns 0 in all cases, so that CHIP_ID will never match. | ||||
|  | ||||
|     """ | ||||
|  | ||||
|     def __init__(self, bus):  # noqa D107 | ||||
|         pass | ||||
|  | ||||
|     def read_byte_data(self, addr, register): | ||||
|         """Return 0 for all read attempts.""" | ||||
|         return 0 | ||||
|  | ||||
|  | ||||
| class MockSMBusPresent: | ||||
|     """Mock enough of the BME680 for the library to initialise and test.""" | ||||
|  | ||||
|     def __init__(self, bus): | ||||
|         """Initialise with test data.""" | ||||
|         self.regs = [0 for _ in range(256)] | ||||
|         self.regs[bme680.CHIP_ID_ADDR] = bme680.CHIP_ID | ||||
|  | ||||
|     def read_byte_data(self, addr, register): | ||||
|         """Read a single byte from fake registers.""" | ||||
|         return self.regs[register] | ||||
|  | ||||
|     def write_byte_data(self, addr, register, value): | ||||
|         """Write a single byte to fake registers.""" | ||||
|         self.regs[register] = value | ||||
|  | ||||
|     def read_i2c_block_data(self, addr, register, length): | ||||
|         """Read up to length bytes from register.""" | ||||
|         return self.regs[register:register + length] | ||||
|  | ||||
|  | ||||
| @pytest.fixture(scope='function', autouse=False) | ||||
| def smbus_notpresent(): | ||||
|     """Mock smbus module.""" | ||||
|     smbus = mock.MagicMock() | ||||
|     smbus.SMBus = MockSMBus | ||||
|     sys.modules['smbus'] = smbus | ||||
|     yield smbus | ||||
|     del sys.modules['smbus'] | ||||
|  | ||||
|  | ||||
| @pytest.fixture(scope='function', autouse=False) | ||||
| def smbus(): | ||||
|     """Mock smbus module.""" | ||||
|     smbus = mock.MagicMock() | ||||
|     smbus.SMBus = MockSMBusPresent | ||||
|     sys.modules['smbus'] = smbus | ||||
|     yield smbus | ||||
|     del sys.modules['smbus'] | ||||
|  | ||||
|  | ||||
| @pytest.fixture(scope='function', autouse=False) | ||||
| def calibration(): | ||||
|     """Mock bme680 calibration.""" | ||||
|     calibration = CalibrationData() | ||||
|     # Dump of calibration data borrowed from: | ||||
|     # https://github.com/pimoroni/bme680-python/issues/11 | ||||
|     data = { | ||||
|         'par_gh1': -30, | ||||
|         'par_gh2': -24754, | ||||
|         'par_gh3': 18, | ||||
|         'par_h1': 676, | ||||
|         'par_h2': 1029, | ||||
|         'par_h3': 0, | ||||
|         'par_h4': 45, | ||||
|         'par_h5': 20, | ||||
|         'par_h6': 120, | ||||
|         'par_h7': -100, | ||||
|         'par_p1': 36673, | ||||
|         'par_p10': 30, | ||||
|         'par_p2': -10515, | ||||
|         'par_p3': 88, | ||||
|         'par_p4': 7310, | ||||
|         'par_p5': -129, | ||||
|         'par_p6': 30, | ||||
|         'par_p7': 46, | ||||
|         'par_p8': -3177, | ||||
|         'par_p9': -2379, | ||||
|         'par_t1': 26041, | ||||
|         'par_t2': 26469, | ||||
|         'par_t3': 3, | ||||
|         'range_sw_err': 0, | ||||
|         'res_heat_range': 1, | ||||
|         'res_heat_val': 48, | ||||
|         't_fine': 136667 | ||||
|     } | ||||
|     for k, v in data.items(): | ||||
|         setattr(calibration, k, v) | ||||
|     return calibration | ||||
							
								
								
									
										41
									
								
								library/tests/test_compensation.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								library/tests/test_compensation.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| import bme680 | ||||
|  | ||||
|  | ||||
| def test_calc_temperature(smbus, calibration): | ||||
|     """Validate temperature calculation against mock calibration data.""" | ||||
|     sensor = bme680.BME680() | ||||
|     sensor.calibration_data = calibration | ||||
|     assert sensor._calc_temperature(501240) == 2669 | ||||
|     assert sensor.calibration_data.t_fine == 136667 | ||||
|  | ||||
|  | ||||
| def test_calc_pressure(smbus, calibration): | ||||
|     """Validate pressure calculation against mock calibration data.""" | ||||
|     sensor = bme680.BME680() | ||||
|     sensor.calibration_data = calibration | ||||
|     sensor._calc_temperature(501240) | ||||
|     assert sensor._calc_pressure(353485) == 98712 | ||||
|  | ||||
|  | ||||
| def test_calc_humidity(smbus, calibration): | ||||
|     """Validate humidity calculation against mock calibration data.""" | ||||
|     sensor = bme680.BME680() | ||||
|     sensor.calibration_data = calibration | ||||
|     sensor._calc_temperature(501240) | ||||
|     assert sensor._calc_humidity(19019) == 42402 | ||||
|  | ||||
|  | ||||
| def test_calc_gas_resistance(smbus, calibration): | ||||
|     """Validate gas calculation against mock calibration data.""" | ||||
|     sensor = bme680.BME680() | ||||
|     sensor.calibration_data = calibration | ||||
|     assert sensor._calc_gas_resistance(0, 0) == 12946860 | ||||
|  | ||||
|  | ||||
| def test_temp_offset(smbus, calibration): | ||||
|     """Validate temperature calculation with offset against mock calibration data.""" | ||||
|     sensor = bme680.BME680() | ||||
|     sensor.calibration_data = calibration | ||||
|     sensor.set_temp_offset(1.99) | ||||
|     assert sensor._calc_temperature(501240) == 2669 + 199 | ||||
|     assert sensor.calibration_data.t_fine == 146830 | ||||
| @@ -1,57 +1,13 @@ | ||||
| import sys | ||||
| import mock | ||||
| import pytest | ||||
| import bme680 | ||||
|  | ||||
|  | ||||
| class MockSMBus: | ||||
|     """Mock a basic non-presence SMBus device to cause BME680 to fail. | ||||
|  | ||||
|     Returns 0 in all cases, so that CHIP_ID will never match. | ||||
|  | ||||
|     """ | ||||
|  | ||||
|     def __init__(self, bus):  # noqa D107 | ||||
|         pass | ||||
|  | ||||
|     def read_byte_data(self, addr, register): | ||||
|         """Return 0 for all read attempts.""" | ||||
|         return 0 | ||||
|  | ||||
|  | ||||
| class MockSMBusPresent: | ||||
|     """Mock enough of the BME680 for the library to initialise and test.""" | ||||
|  | ||||
|     def __init__(self, bus): | ||||
|         """Initialise with test data.""" | ||||
|         self.regs = [0 for _ in range(256)] | ||||
|         self.regs[bme680.CHIP_ID_ADDR] = bme680.CHIP_ID | ||||
|  | ||||
|     def read_byte_data(self, addr, register): | ||||
|         """Read a single byte from fake registers.""" | ||||
|         return self.regs[register] | ||||
|  | ||||
|     def write_byte_data(self, addr, register, value): | ||||
|         """Write a single byte to fake registers.""" | ||||
|         self.regs[register] = value | ||||
|  | ||||
|     def read_i2c_block_data(self, addr, register, length): | ||||
|         """Read up to length bytes from register.""" | ||||
|         return self.regs[register:register + length] | ||||
|  | ||||
|  | ||||
| def test_setup_not_present(): | ||||
| def test_setup_not_present(smbus_notpresent): | ||||
|     """Mock the adbsence of a BME680 and test initialisation.""" | ||||
|     sys.modules['smbus'] = mock.MagicMock() | ||||
|     sys.modules['smbus'].SMBus = MockSMBus | ||||
|  | ||||
|     with pytest.raises(RuntimeError): | ||||
|         sensor = bme680.BME680()  # noqa F841 | ||||
|  | ||||
|  | ||||
| def test_setup_mock_present(): | ||||
| def test_setup_mock_present(smbus): | ||||
|     """Mock the presence of a BME680 and test initialisation.""" | ||||
|     sys.modules['smbus'] = mock.MagicMock() | ||||
|     sys.modules['smbus'].SMBus = MockSMBusPresent | ||||
|  | ||||
|     sensor = bme680.BME680()  # noqa F841 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Phil Howard
					Phil Howard