diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py
index e6571fa89e..4ccbd74b5a 100644
--- a/InvenTree/stock/models.py
+++ b/InvenTree/stock/models.py
@@ -922,6 +922,14 @@ class StockItem(MPTTModel):
         return s
 
     def getTestResults(self, test=None, result=None, user=None):
+        """
+        Return all test results associated with this StockItem.
+
+        Optionally can filter results by:
+        - Test name
+        - Test result
+        - User
+        """
 
         results = self.test_results
 
@@ -939,6 +947,25 @@ class StockItem(MPTTModel):
 
         return results
 
+    def testResultMap(self, **kwargs):
+        """
+        Return a map of test-results using the test name as the key.
+        Where multiple test results exist for a given name,
+        the *most recent* test is used.
+
+        This map is useful for rendering to a template (e.g. a test report),
+        as all named tests are accessible.
+        """
+
+        results = self.getTestResults(**kwargs).order_by('-date')
+
+        result_map = {}
+
+        for result in results:
+            result_map[result.test] = result
+
+        return result_map
+
 
 @receiver(pre_delete, sender=StockItem, dispatch_uid='stock_item_pre_delete_log')
 def before_delete_stock_item(sender, instance, using, **kwargs):
diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py
index 622f93e620..ad53da200d 100644
--- a/InvenTree/stock/serializers.py
+++ b/InvenTree/stock/serializers.py
@@ -7,6 +7,7 @@ from rest_framework import serializers
 from .models import StockItem, StockLocation
 from .models import StockItemTracking
 from .models import StockItemAttachment
+from .models import StockItemTestResult
 
 from django.db.models import Sum, Count
 from django.db.models.functions import Coalesce
@@ -216,6 +217,24 @@ class StockItemAttachmentSerializer(InvenTreeModelSerializer):
         ]
 
 
+class StockItemTestResultSerializer(InvenTreeModelSerializer):
+    """ Serializer for the StockItemTestResult model """
+
+    class Meta:
+        model = StockItemTestResult
+
+        fields = [
+            'pk',
+            'test',
+            'result',
+            'value',
+            'attachment',
+            'notes',
+            'user',
+            'date'
+        ]
+
+
 class StockTrackingSerializer(InvenTreeModelSerializer):
     """ Serializer for StockItemTracking model """
 
diff --git a/InvenTree/stock/tests.py b/InvenTree/stock/tests.py
index 2c8640d48a..a2bb4d4bb4 100644
--- a/InvenTree/stock/tests.py
+++ b/InvenTree/stock/tests.py
@@ -423,3 +423,11 @@ class TestResultTest(StockTest):
         # Passing tests
         self.assertEqual(item.getTestResults(result=True).count(), 3)
         self.assertEqual(item.getTestResults(result=False).count(), 1)
+
+        # Result map
+        result_map = item.testResultMap()
+
+        self.assertEqual(len(result_map), 3)
+
+        for test in ['Firmware Version', 'Settings Checksum', 'Temperature Test']:
+            self.assertIn(test, result_map.keys())
\ No newline at end of file