diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1e614fecac3ebf263d5de130e8de3519accc01d8..4a5c881e041ccf7c6afee14642a1e521992780fc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -25,6 +25,7 @@
 #   SKIP_JAVA_CLIENT               -- Skip building the java client
 #   ENABLE_JEMALLOC                -- Link jemalloc into all executables
 #   ENABLE_NATIVE                  -- Build native client
+#   ENABLE_TESTING                 -- Build unit test
 #
 cmake_minimum_required(VERSION 3.0.0)
 
@@ -37,8 +38,10 @@ option(ENABLE_JEMALLOC "Whether to link jemalloc to all executables" ON)
 option(ENABLE_NATIVE "Whether to build native client" OFF)
 option(ENABLE_CCACHE "Whether to use ccache to speed up compiling" ON)
 option(ENABLE_ASAN "Whether to turn AddressSanitizer ON or OFF" OFF)
+option(ENABLE_TEST "Whether to turn unit test ON or OFF" ON)
 
 message(STATUS "ASAN: ${ENABLE_ASAN}")
+message(STATUS "ENABLE_TESTING: ${ENABLE_TESTING}")
 
 
 if (ENABLE_NATIVE)
@@ -46,7 +49,9 @@ if (ENABLE_NATIVE)
     add_compile_options(-fPIC)
 endif()
 
-enable_testing()
+if (ENABLE_TESTING)
+    enable_testing()
+endif()
 
 if (!CMAKE_CXX_COMPILER)
     message(FATAL_ERROR "No C++ compiler found")
@@ -508,6 +513,13 @@ macro(nebula_link_libraries target)
     )
 endmacro(nebula_link_libraries)
 
+function(nebula_add_subdirectory dir_name)
+    if ((NOT ENABLE_TESTING) AND (${dir_name} STREQUAL test))
+        return()
+    endif()
+    add_subdirectory(${dir_name})
+endfunction()
+
 if (NOT SKIP_JAVA_CLIENT)
     set(NEBULA_CLEAN_ALL_DEPS clean-interface clean-pch clean-hbase clean-java-client)
 else()
diff --git a/package/nebula.spec b/package/nebula.spec
index 21df8fd5145d5bba280e27e72a2103ca2619a42f..69a0c8ae6e84e05f5663e32ad8f8334e86ba684b 100755
--- a/package/nebula.spec
+++ b/package/nebula.spec
@@ -33,7 +33,7 @@ A high performance distributed graph database
 %prep
 
 %build
-cmake -DCMAKE_BUILD_TYPE=Release -DNEBULA_BUILD_VERSION=%{_version} -DCMAKE_INSTALL_PREFIX=%{_install_dir} ./
+cmake -DCMAKE_BUILD_TYPE=Release -DNEBULA_BUILD_VERSION=%{_version} -DCMAKE_INSTALL_PREFIX=%{_install_dir} -DENABLE_TESTING=OFF./
 make -j2
 
 %install
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 62460a849e3c413b95530bedd723deb418b7132f..486d03229cdd4a201a4e6ea696c702d8b75dce67 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,13 +1,13 @@
-add_subdirectory(common)
-add_subdirectory(interface)
-add_subdirectory(client)
-add_subdirectory(meta)
-add_subdirectory(console)
-add_subdirectory(kvstore)
-add_subdirectory(parser)
-add_subdirectory(dataman)
-add_subdirectory(graph)
-add_subdirectory(daemons)
-add_subdirectory(storage)
-add_subdirectory(webservice)
-add_subdirectory(tools)
+nebula_add_subdirectory(common)
+nebula_add_subdirectory(interface)
+nebula_add_subdirectory(client)
+nebula_add_subdirectory(meta)
+nebula_add_subdirectory(console)
+nebula_add_subdirectory(kvstore)
+nebula_add_subdirectory(parser)
+nebula_add_subdirectory(dataman)
+nebula_add_subdirectory(graph)
+nebula_add_subdirectory(daemons)
+nebula_add_subdirectory(storage)
+nebula_add_subdirectory(webservice)
+nebula_add_subdirectory(tools)
diff --git a/src/executor/CMakeLists.txt b/src/executor/CMakeLists.txt
index 227104dc12b464b8e757e010716125d599465854..5a019b873f9a9f9de0684472f77a7c5d51681416 100644
--- a/src/executor/CMakeLists.txt
+++ b/src/executor/CMakeLists.txt
@@ -69,5 +69,5 @@ add_dependencies(
     base_obj
 )
 
-add_subdirectory(test)
+nebula_add_subdirectory(test)
 
diff --git a/src/parser/CMakeLists.txt b/src/parser/CMakeLists.txt
index 3bb586d7a5a58ae6f82d7277b8f0faec7728ca94..43f51cf73e1235f72bf01b65f09872ddb39cff03 100644
--- a/src/parser/CMakeLists.txt
+++ b/src/parser/CMakeLists.txt
@@ -21,4 +21,4 @@ nebula_add_library(
     UserSentences.cpp
 )
 
-add_subdirectory(test)
+nebula_add_subdirectory(test)