diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
index 38f75745f9f7672bf953bb8bba2ccd36190c6059..8d6571d1bade3aec7eced4e65c7feaeb02185771 100644
--- a/unittest/CMakeLists.txt
+++ b/unittest/CMakeLists.txt
@@ -136,6 +136,8 @@ add_python_eigenpy_lib_unit_test("py-LDLT" "unittest/python/test_LDLT.py")
 
 add_python_eigenpy_lib_unit_test("py-id" "unittest/python/test_id.py")
 
+add_python_eigenpy_lib_unit_test("py-QR" "unittest/python/test_QR.py")
+
 if(NOT WIN32)
   add_python_eigenpy_lib_unit_test("py-MINRES" "unittest/python/test_MINRES.py")
 endif(NOT WIN32)
diff --git a/unittest/python/test_QR.py b/unittest/python/test_QR.py
new file mode 100644
index 0000000000000000000000000000000000000000..b7a7f98517ee50b1084ece309654253f5769480a
--- /dev/null
+++ b/unittest/python/test_QR.py
@@ -0,0 +1,22 @@
+import numpy as np
+
+import eigenpy
+
+rows = 20
+cols = 100
+rng = np.random.default_rng()
+
+A = rng.random((rows, cols))
+
+# Test HouseholderQR decomposition
+householder_qr = eigenpy.HouseholderQR()
+householder_qr = eigenpy.HouseholderQR(rows, cols)
+householder_qr = eigenpy.HouseholderQR(A)
+
+householder_qr_eye = eigenpy.HouseholderQR(np.eye(rows, rows))
+X = rng.random((rows, 20))
+assert householder_qr_eye.absDeterminant() == 1.0
+assert householder_qr_eye.logAbsDeterminant() == 0.0
+
+Y = householder_qr_eye.solve(X)
+assert (X == Y).all()