test: sales person target variance
diff --git a/erpnext/selling/report/sales_person_target_variance_based_on_item_group/test_sales_person_target_variance_based_on_item_group.py b/erpnext/selling/report/sales_person_target_variance_based_on_item_group/test_sales_person_target_variance_based_on_item_group.py
new file mode 100644
index 0000000..4ae5d2b
--- /dev/null
+++ b/erpnext/selling/report/sales_person_target_variance_based_on_item_group/test_sales_person_target_variance_based_on_item_group.py
@@ -0,0 +1,84 @@
+import frappe
+from frappe.tests.utils import FrappeTestCase
+from frappe.utils import flt, nowdate
+
+from erpnext.accounts.utils import get_fiscal_year
+from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
+from erpnext.selling.report.sales_person_target_variance_based_on_item_group.sales_person_target_variance_based_on_item_group import (
+	execute,
+)
+
+
+class TestSalesPersonTargetVarianceBasedOnItemGroup(FrappeTestCase):
+	def setUp(self):
+		self.fiscal_year = get_fiscal_year(nowdate())[0]
+
+	def tearDown(self):
+		frappe.db.rollback()
+
+	def test_achieved_target_and_variance(self):
+		# Create a Target Distribution
+		distribution = frappe.new_doc("Monthly Distribution")
+		distribution.distribution_id = "Target Report Distribution"
+		distribution.fiscal_year = self.fiscal_year
+		distribution.get_months()
+		distribution.insert()
+
+		# Create sales people with targets
+		person_1 = create_sales_person_with_target("Sales Person 1", self.fiscal_year, distribution.name)
+		person_2 = create_sales_person_with_target("Sales Person 2", self.fiscal_year, distribution.name)
+
+		# Create a Sales Order with 50-50 contribution
+		so = make_sales_order(
+			rate=1000,
+			qty=20,
+			do_not_submit=True,
+		)
+		so.set(
+			"sales_team",
+			[
+				{
+					"sales_person": person_1.name,
+					"allocated_percentage": 50,
+					"allocated_amount": 10000,
+				},
+				{
+					"sales_person": person_2.name,
+					"allocated_percentage": 50,
+					"allocated_amount": 10000,
+				},
+			],
+		)
+		so.submit()
+
+		# Check Achieved Target and Variance
+		result = execute(
+			frappe._dict(
+				{
+					"fiscal_year": self.fiscal_year,
+					"doctype": "Sales Order",
+					"period": "Yearly",
+					"target_on": "Quantity",
+				}
+			)
+		)[1]
+		row = frappe._dict(result[0])
+		self.assertSequenceEqual(
+			[flt(value, 2) for value in (row.total_target, row.total_achieved, row.total_variance)],
+			[50, 10, -40],
+		)
+
+
+def create_sales_person_with_target(sales_person_name, fiscal_year, distribution_id):
+	sales_person = frappe.new_doc("Sales Person")
+	sales_person.sales_person_name = sales_person_name
+	sales_person.append(
+		"targets",
+		{
+			"fiscal_year": fiscal_year,
+			"target_qty": 50,
+			"target_amount": 30000,
+			"distribution_id": distribution_id,
+		},
+	)
+	return sales_person.insert()