diff --git a/dev-requirements.txt b/dev-requirements.txt
new file mode 100644
index 0000000..15545c0
--- /dev/null
+++ b/dev-requirements.txt
@@ -0,0 +1 @@
+hypothesis~=6.31.0
diff --git a/erpnext/stock/tests/test_valuation.py b/erpnext/stock/tests/test_valuation.py
index d415af3..065c490 100644
--- a/erpnext/stock/tests/test_valuation.py
+++ b/erpnext/stock/tests/test_valuation.py
@@ -1,10 +1,14 @@
 import unittest
 
+from hypothesis import given
+from hypothesis import strategies as st
+
 from erpnext.stock.valuation import FifoValuation, _round_off_if_near_zero
 
+qty_gen = st.floats(min_value=-1e6, max_value=1e6)
+value_gen = st.floats(min_value=1, max_value=1e6)
+stock_queue_generator = st.lists(st.tuples(qty_gen, value_gen), min_size=10)
 
-def rate_generator():
-	return 0.0
 
 class TestFifoValuation(unittest.TestCase):
 
@@ -17,10 +21,10 @@
 		self.assertTotalValue(value)
 
 	def assertTotalQty(self, qty):
-		self.assertEqual(sum(q for q, _ in self.queue), qty, msg=f"queue: {self.queue}")
+		self.assertAlmostEqual(sum(q for q, _ in self.queue), qty, msg=f"queue: {self.queue}", places=4)
 
 	def assertTotalValue(self, value):
-		self.assertEqual(sum(q * r for q, r in self.queue), value, msg=f"queue: {self.queue}")
+		self.assertAlmostEqual(sum(q * r for q, r in self.queue), value, msg=f"queue: {self.queue}", places=2)
 
 	def test_simple_addition(self):
 		self.queue.add_stock(1, 10)
@@ -28,7 +32,7 @@
 
 	def test_simple_removal(self):
 		self.queue.add_stock(1, 10)
-		self.queue.remove_stock(1, 0, rate_generator)
+		self.queue.remove_stock(1)
 		self.assertTotalQty(0)
 
 	def test_merge_new_stock(self):
@@ -48,11 +52,11 @@
 
 
 	def test_negative_stock(self):
-		self.queue.remove_stock(1, 5, rate_generator)
+		self.queue.remove_stock(1, 5)
 		self.assertEqual(self.queue, [[-1, 5]])
 
 		# XXX
-		self.queue.remove_stock(1, 10, rate_generator)
+		self.queue.remove_stock(1, 10)
 		self.assertTotalQty(-2)
 
 		self.queue.add_stock(2, 10)
@@ -63,7 +67,7 @@
 		self.queue.add_stock(1, 10)
 		self.queue.add_stock(1, 20)
 
-		self.queue.remove_stock(1, 20, rate_generator)
+		self.queue.remove_stock(1, 20)
 		self.assertEqual(self.queue, [[1, 10]])
 
 
@@ -73,7 +77,7 @@
 		self.queue.add_stock(1, 20)
 		self.queue.add_stock(5, 20)
 
-		self.queue.remove_stock(4, 0, rate_generator)
+		self.queue.remove_stock(4)
 		self.assertEqual(self.queue, [[5, 20]])
 
 
@@ -83,7 +87,7 @@
 		self.queue.add_stock(1, 20)
 		self.queue.add_stock(5, 20)
 
-		self.queue.remove_stock(3, 20, rate_generator)
+		self.queue.remove_stock(3, 20)
 		self.assertEqual(self.queue, [[1, 10], [5, 20]])
 
 	def test_collapsing_of_queue(self):
@@ -94,13 +98,13 @@
 
 		self.assertTotalValue(10)
 
-		self.queue.remove_stock(3, 1, rate_generator)
+		self.queue.remove_stock(3, 1)
 		# XXX
 		self.assertEqual(self.queue, [[1, 7]])
 
 	def test_rounding_off(self):
 		self.queue.add_stock(1.0, 1.0)
-		self.queue.remove_stock(1.0 - 1e-9, 0.0, rate_generator)
+		self.queue.remove_stock(1.0 - 1e-9)
 		self.assertTotalQty(0)
 
 	def test_rounding_off_near_zero(self):
@@ -114,8 +118,49 @@
 		self.queue.add_stock(1, 10)
 		self.queue.add_stock(2, 13)
 		self.queue.add_stock(1, 17)
-		self.queue.remove_stock(1, 0, rate_generator)
-		self.queue.remove_stock(1, 0, rate_generator)
-		self.queue.remove_stock(1, 0, rate_generator)
+		self.queue.remove_stock(1)
+		self.queue.remove_stock(1)
+		self.queue.remove_stock(1)
 		self.queue.add_stock(5, 17)
 		self.queue.add_stock(8, 11)
+
+	@given(stock_queue_generator)
+	def test_fifo_qty_hypothesis(self, stock_queue):
+		self.queue = FifoValuation([])
+		total_qty = 0
+
+		for qty, rate in stock_queue:
+			if qty == 0:
+				continue
+			if qty > 0:
+				self.queue.add_stock(qty, rate)
+				total_qty += qty
+			else:
+				qty = abs(qty)
+				consumed = self.queue.remove_stock(qty)
+				self.assertAlmostEqual(qty, sum(q for q, _ in consumed), msg=f"incorrect consumption {consumed}")
+				total_qty -= qty
+			self.assertTotalQty(total_qty)
+
+	@given(stock_queue_generator)
+	def test_fifo_qty_value_nonneg_hypothesis(self, stock_queue):
+		self.queue = FifoValuation([])
+		total_qty = 0.0
+		total_value = 0.0
+
+		for qty, rate in stock_queue:
+			# don't allow negative stock
+			if qty == 0 or total_qty + qty < 0 or abs(qty) < 0.1:
+				continue
+			if qty > 0:
+				self.queue.add_stock(qty, rate)
+				total_qty += qty
+				total_value += qty * rate
+			else:
+				qty = abs(qty)
+				consumed = self.queue.remove_stock(qty)
+				self.assertAlmostEqual(qty, sum(q for q, _ in consumed), msg=f"incorrect consumption {consumed}")
+				total_qty -= qty
+				total_value -= sum(q * r for q, r in consumed)
+			self.assertTotalQty(total_qty)
+			self.assertTotalValue(total_value)
