diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
index c65c6cf1995d436de6a614ca141551e3f851d4f8..6c2165fe490feec6f1aa1db7b3bb34d47272b592 100644
--- a/unittest/CMakeLists.txt
+++ b/unittest/CMakeLists.txt
@@ -45,24 +45,28 @@ add_lib_unit_test(std_vector)
 add_lib_unit_test(std_array)
 add_lib_unit_test(std_pair)
 add_lib_unit_test(user_struct)
-add_lib_unit_test(boost_variant)
 
-function(config_bind_optional tagname opttype)
-  set(MODNAME bind_optional_${tagname})
-  set(OPTIONAL ${opttype})
-  configure_file(bind_optional.cpp.in ${MODNAME}.cpp)
+function(config_test test tagname opttype)
+  set(MODNAME ${test}_${tagname})
+  set(TEST_TYPE ${opttype})
+  configure_file(${test}.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/${MODNAME}.cpp)
 
-  set(py_file test_optional_${tagname}.py)
-  configure_file(python/test_optional.py.in
+  set(py_file test_${test}_${tagname}.py)
+  configure_file(python/test_${test}.py.in
                  ${CMAKE_CURRENT_BINARY_DIR}/python/${py_file})
   add_lib_unit_test(${MODNAME})
-  add_python_unit_test("py-optional-${tagname}" "unittest/python/${py_file}"
+  add_python_unit_test("py-${test}-${tagname}" "unittest/python/${py_file}"
                        "unittest")
 endfunction()
 
-config_bind_optional(boost "boost::optional")
+config_test(variant boost "boost::variant")
 if(CMAKE_CXX_STANDARD GREATER 14 AND CMAKE_CXX_STANDARD LESS 98)
-  config_bind_optional(std "std::optional")
+  config_test(variant std "std::variant")
+endif()
+
+config_test(bind_optional boost "boost::optional")
+if(CMAKE_CXX_STANDARD GREATER 14 AND CMAKE_CXX_STANDARD LESS 98)
+  config_test(bind_optional std "std::optional")
 endif()
 
 add_lib_unit_test(bind_virtual_factory)
@@ -133,10 +137,6 @@ add_python_unit_test("py-user-struct" "unittest/python/test_user_struct.py"
                      "python;unittest")
 set_tests_properties("py-user-struct" PROPERTIES DEPENDS ${PYWRAP})
 
-add_python_unit_test("py-boost-variant" "unittest/python/test_boost_variant.py"
-                     "python;unittest")
-set_tests_properties("py-boost-variant" PROPERTIES DEPENDS ${PYWRAP})
-
 add_python_unit_test("py-bind-virtual" "unittest/python/test_bind_virtual.py"
                      "python;unittest")
 set_tests_properties("py-bind-virtual" PROPERTIES DEPENDS ${PYWRAP})
diff --git a/unittest/bind_optional.cpp.in b/unittest/bind_optional.cpp.in
index 844449b19e0437cdd5b7d6248586d74f4e43800a..30b9ac249f9d5d4844cd30ad35c053265af859de 100644
--- a/unittest/bind_optional.cpp.in
+++ b/unittest/bind_optional.cpp.in
@@ -8,7 +8,8 @@
 #include <optional>
 #endif
 
-#cmakedefine OPTIONAL @OPTIONAL@
+#cmakedefine TEST_TYPE @TEST_TYPE@
+#define OPTIONAL TEST_TYPE
 
 typedef eigenpy::detail::nullopt_helper<OPTIONAL> none_helper;
 static auto OPT_NONE = none_helper::value();
@@ -74,6 +75,7 @@ BOOST_PYTHON_MODULE(@MODNAME@) {
           bp::make_setter(&mystruct::msg));
 
   bp::def("none_if_zero", none_if_zero, bp::args("i"));
-  bp::def("create_if_true", create_if_true, (bp::arg("flag"), bp::arg("b") = OPT_NONE));
+  bp::def("create_if_true", create_if_true,
+          (bp::arg("flag"), bp::arg("b") = OPT_NONE));
   bp::def("random_mat_if_true", random_mat_if_true, bp::args("flag"));
 }
diff --git a/unittest/python/test_optional.py.in b/unittest/python/test_bind_optional.py.in
similarity index 100%
rename from unittest/python/test_optional.py.in
rename to unittest/python/test_bind_optional.py.in
diff --git a/unittest/python/test_boost_variant.py b/unittest/python/test_variant.py.in
similarity index 80%
rename from unittest/python/test_boost_variant.py
rename to unittest/python/test_variant.py.in
index 023b940bdc91150e97f80d9d96f142cca73fff54..df375b1bdd17468a6b6a6373c4b205152ca3b749 100644
--- a/unittest/python/test_boost_variant.py
+++ b/unittest/python/test_variant.py.in
@@ -1,4 +1,10 @@
-from boost_variant import V1, V2, VariantHolder, make_variant
+import importlib
+
+variant_module = importlib.import_module("@MODNAME@")
+V1 = variant_module.V1
+V2 = variant_module.V2
+VariantHolder = variant_module.VariantHolder
+make_variant = variant_module.make_variant
 
 variant = make_variant()
 assert isinstance(variant, V1)
diff --git a/unittest/boost_variant.cpp b/unittest/variant.cpp.in
similarity index 87%
rename from unittest/boost_variant.cpp
rename to unittest/variant.cpp.in
index fad8e45879810c1e7503469d3a5e22863c6784c2..ee339cc39b8d689f08d565f6efc4b2f23219af7b 100644
--- a/unittest/boost_variant.cpp
+++ b/unittest/variant.cpp.in
@@ -4,6 +4,9 @@
 #include <eigenpy/eigenpy.hpp>
 #include <eigenpy/variant.hpp>
 
+#cmakedefine TEST_TYPE @TEST_TYPE@
+#define VARIANT TEST_TYPE
+
 namespace bp = boost::python;
 
 struct V1 {
@@ -12,7 +15,7 @@ struct V1 {
 struct V2 {
   char v;
 };
-typedef boost::variant<V1, V2> MyVariant;
+typedef VARIANT<V1, V2> MyVariant;
 
 MyVariant make_variant() { return V1(); }
 
@@ -20,7 +23,7 @@ struct VariantHolder {
   MyVariant variant;
 };
 
-BOOST_PYTHON_MODULE(boost_variant) {
+BOOST_PYTHON_MODULE(@MODNAME@) {
   using namespace eigenpy;
 
   enableEigenPy();