diff --git a/redfish/systems/test_sensor_monitoring.robot b/redfish/systems/test_sensor_monitoring.robot
new file mode 100644
index 0000000..bea0a57
--- /dev/null
+++ b/redfish/systems/test_sensor_monitoring.robot
@@ -0,0 +1,223 @@
+*** Settings ***
+Documentation    Test Redfish sensor monitoring.
+
+Resource         ../../lib/resource.robot
+Resource         ../../lib/bmc_redfish_resource.robot
+Resource         ../../lib/bmc_redfish_utils.robot
+Library          ../../lib/gen_robot_print.py
+
+Test Setup       Test Setup Execution
+Test Teardown    Test Teardown Execution
+
+*** Variables ***
+
+@{INVALID_SENSORS}
+${OPENBMC_CONN_METHOD}  ssh
+${IPMI_COMMAND}         Inband
+
+** Test Cases **
+
+Verify Sensor Monitoring
+    [Documentation]  Verify the redfish sensor monitoring according to the BMC
+    ...              expected SDR table.
+    [Tags]  Verify_Sensor_Monitoring
+
+    # Check whether the expected sensors are present in the Redfish request.
+    # Check whether the sensors's 'Health' is 'OK' and the 'State' is 'Enabled'.
+    # Check sensor reading is not equal to null.
+
+    ${resp}=  Redfish.Get  /redfish/v1/Chassis/${CHASSIS_ID}
+    ...  valid_status_codes=[${HTTP_OK}]
+
+   Should Be Equal As Strings  ${resp.dict['Sensors']['@odata.id']}
+   ...  /redfish/v1/Chassis/${CHASSIS_ID}/Sensors
+   Should Be Equal As Strings  ${resp.dict['Thermal']['@odata.id']}
+   ...  /redfish/v1/Chassis/${CHASSIS_ID}/Thermal
+   Should Be Equal As Strings  ${resp.dict['Power']['@odata.id']}
+   ...  /redfish/v1/Chassis/${CHASSIS_ID}/Power
+
+    # Check sensors in /redfish/v1/Chassis/{ChassisId}/Power
+    ${resp}=  Redfish.Get  /redfish/v1/Chassis/${CHASSIS_ID}/Power
+    ...  valid_status_codes=[${HTTP_OK}]
+
+    Check Sensors Present  ${resp.dict['Voltages']}  Voltage
+    Check Sensor Status And Reading Via Sensor Info
+    ...  ${resp.dict['Voltages']}  ReadingVolts
+
+    # Check sensors in /redfish/v1/Chassis/{ChassisId}/Thermal
+    ${resp}=  Redfish.Get  /redfish/v1/Chassis/${CHASSIS_ID}/Thermal
+    ...  valid_status_codes=[${HTTP_OK}]
+
+    Check Sensors Present  ${resp.dict['Temperatures']}  Temperature
+    Check Sensors Present  ${resp.dict['Fans']}  Fans
+
+    Check Sensor Status And Reading Via Sensor Info
+    ...  ${resp.dict['Temperatures']}  ReadingCelsius
+    Check Sensor Status And Reading Via Sensor Info
+    ...  ${resp.dict['Fans']}  Reading
+
+    # Check sensors in
+    # /redfish/v1/Chassis/{ChassisId}/Sensors/{Sensor Name}
+    ${expected_current_power_sensor_name_list}=  Set Variable
+    ...  ${redfish_sensor_info_map['${OPENBMC_MODEL}']['Current_Power']}
+
+    FOR  ${sensor_name}  IN  @{expected_current_power_sensor_name_list}
+        Check Sensor Status And Reading Via Sensor Name  ${sensor_name}
+    END
+
+    Rprint Vars  INVALID_SENSORS
+
+    ${error_msg}=   Evaluate  ", ".join(${INVALID_SENSORS})
+    Should Be Empty  ${INVALID_SENSORS}
+    ...  msg=Test fail, invalid sensors are ${error_msg}.
+
+
+*** Keywords ***
+
+Test Teardown Execution
+    [Documentation]  Do the post test teardown.
+
+    Run Keyword And Ignore Error  Redfish.Logout
+
+
+Test Setup Execution
+    [Documentation]  Do the test setup.
+
+    Required Parameters For Sensor Monitoring
+    Redfish.Login
+
+
+Required Parameters For Sensor Monitoring
+    [Documentation]  Check if required parameters are provided via command line.
+
+    Should Not Be Empty   ${OS_HOST}
+    Should Not Be Empty   ${OS_USERNAME}
+    Should Not Be Empty   ${OS_PASSWORD}
+    Run Keyword If  '${OPENBMC_CONN_METHOD}' == 'ssh'
+    ...    Should Not Be Empty   ${OPENBMC_HOST}
+    ...  ELSE IF  '${OPENBMC_CONN_METHOD}' == 'telnet'
+    ...    Should Not Be Empty   ${OPENBMC_SERIAL_HOST}
+    Should Not Be Empty   ${OPENBMC_MODEL}
+
+
+Get Sensors Name List From Redfish
+    [Documentation]  Get sensors name list from redfish.
+    [Arguments]  ${sensor_info_list}
+    # Description of arguments:
+    # sensor_info_list    A list of a specified sensor info return by a redfish
+    #                     request.
+
+    # An example of a sensor redfish request:
+    # /redfish/v1/Chassis/${CHASSIS_ID}/Power
+    # {
+    #     ...
+    #     "Voltages": [
+    #     {
+    #     "@odata.id": "/redfish/v1/Chassis/${CHASSIS_ID}/Power#/Voltages/0",
+    #     "@odata.type": "#Power.v1_0_0.Voltage",
+    #     "LowerThresholdCritical": 1.14,
+    #     "LowerThresholdNonCritical": 1.14,
+    #     "MaxReadingRange": 2.0,
+    #     "MemberId": "Output_Voltage",
+    #     "MinReadingRange": 0.0,
+    #     "Name": "Output Voltage",
+    #     "ReadingVolts": 1.176,
+    #     "Status": {
+    #         "Health": "OK",
+    #         "State": "Enabled"
+    #     },
+    #     "UpperThresholdCritical": 1.21,
+    #     "UpperThresholdNonCritical": 1.21
+    #     }
+    #     ...
+    # }
+
+    @{sensor_name_list}=  Create List
+    FOR  ${sensor_info}  IN  @{sensor_info_list}
+        Append To List  ${sensor_name_list}  ${sensor_info['MemberId']}
+    END
+
+    [Return]  ${sensor_name_list}
+
+
+Check Sensor Status And Reading Via Sensor Name
+    [Documentation]  Check Sensor Status And Reading Via Sensor Name.
+    [Arguments]  ${sensor_name}
+    # Description of arguments:
+    # sensor_name    Sensor that should be present.
+
+    ${resp}=  Redfish.Get
+    ...  /redfish/v1/Chassis/${CHASSIS_ID}/Sensors/${sensor_name}
+    ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NOT_FOUND}]
+
+    Run Keyword And Return If  '${resp.status}' == '${HTTP_NOT_FOUND}'
+    ...  Append To List  ${INVALID_SENSORS}  ${sensor_name}
+
+    ${condition_str}=  Catenate
+        ...  '${resp.dict['Status']['Health']}' != 'OK'
+        ...  or '${resp.dict['Status']['State']}' != 'Enabled'
+        ...  or ${resp.dict['Reading']} == ${null}
+
+    Run Keyword If  ${condition_str}
+    ...  Append To List  ${INVALID_SENSORS}  ${sensor_name}
+
+
+Check Sensor Status And Reading Via Sensor Info
+    [Documentation]  Check Sensor Status And Reading Via Sensor Info.
+    [Arguments]  ${sensor_info_list}  ${reading_unit}
+    # Description of arguments:
+    # sensor_info_list  A list of a specified sensor info return by a redfish
+    #                   request.
+    # reading_unit      A string represents the reading value in sensor info
+    #                   return by a redfish request. It different between
+    #                   different sensor unit of sensor info.
+
+    FOR  ${sensor_info}  IN  @{sensor_info_list}
+        ${sensor}=  Set Variable  ${sensor_info['MemberId']}
+        ${condition_str}=  Catenate
+        ...  '${sensor_info['Status']['Health']}' != 'OK'
+        ...  or '${sensor_info['Status']['State']}' != 'Enabled'
+        ...  or ${sensor_info['${reading_unit}']} == ${null}
+
+        Run Keyword If  ${condition_str}
+        ...  Append To List  ${INVALID_SENSORS}  ${sensor_info['MemberId']}
+    END
+
+
+Check Sensors Present
+    [Documentation]  Check that sensors are present as expected.
+    [Arguments]  ${sensor_info_list}  ${sensor_type}
+    # Description of arguments:
+    # sensor_info_list  A list of a specified sensor info return by a redfish
+    #                   request.
+    # sensor_type       A string represents the sensor category to be verified.
+
+    # An example table of expected sensors:
+    # redfish_sensor_info_map = {
+    #   ${OPENBMC_MODEL}:{
+    #       "Voltage":{
+    #           "Voltage0",
+    #           ...
+    #       },
+    #       "Temperature":{
+    #           "DIMM0",
+    #           ...
+    #       }
+    #       "Fans":{
+    #           "Fan0",
+    #           ...
+    #       }...
+    #   }
+    #}
+
+    ${curr_sensor_name_list}=  Get Sensors Name List From Redfish
+    ...  ${sensor_info_list}
+
+    ${expected_sensor_name_list}=  Set Variable
+    ...  ${redfish_sensor_info_map['${OPENBMC_MODEL}']['${sensor_type}']}
+
+    FOR  ${sensor_name}  IN  @{expected_sensor_name_list}
+        ${exist}=  Evaluate  '${sensor_name}' in ${curr_sensor_name_list}
+        Run Keyword If  '${exist}' == '${False}'
+        ...  Append To List  ${INVALID_SENSORS}  ${sensor_name}
+    END
