diff --git a/tools/testing/unittest/Makefile b/tools/testing/unittest/Makefile
index c923ae5f39736e6ea46fd2cb4f0475c1c0319722..e55df8ef79b6c0248a291f51894ec573218d57ed 100644
--- a/tools/testing/unittest/Makefile
+++ b/tools/testing/unittest/Makefile
@@ -6,14 +6,13 @@ TARGETS += sysctl
 # Makefile to avoid test build failures when test
 # Makefile doesn't have explicit build rules.
 
-CFLAGS += -fprofile-arcs -ftest-coverage
+
+export CFLAGS = -fprofile-arcs -ftest-coverage
+export LDFLAGS = -lgcov --coverage
 
 ifeq (1,$(MAKELEVEL))
-override LDFLAGS =
 override MAKEFLAGS =
 else
-export CFLAGS
-export LDFLAGS = -lgcov --coverage
 endif
 
 
@@ -26,9 +25,20 @@ run_tests: all
 	for TARGET in $(TARGETS); do \
 		make -C $$TARGET run_tests; \
 	done;
-clean:
+
+coverage_tests: all
+	for TARGET in $(TARGETS); do \
+		make -C $$TARGET coverage_tests; \
+	done;
+
+clean_coverage:
+	for TARGET in $(TARGETS); do \
+		make -C $$TARGET clean_coverage; \
+	done;
+
+clean: clean_coverage
 	for TARGET in $(TARGETS); do \
 		make -C $$TARGET clean; \
 	done;
 
-.PHONY: install
+.PHONY: 
diff --git a/tools/testing/unittest/lib.mk b/tools/testing/unittest/lib.mk
index 479fc114336d1163b560179dc0d176c282b36da3..f0fffdbf0c3cc7d95d662591aadf38e3e31844c6 100644
--- a/tools/testing/unittest/lib.mk
+++ b/tools/testing/unittest/lib.mk
@@ -16,13 +16,24 @@ endef
 run_tests: all
 	$(RUN_TESTS)
 
-define EMIT_TESTS
+define COVERAGE_TESTS
 	@for TEST in $(TEST_PROGS); do \
-		echo "(./$$TEST && echo \"selftests: $$TEST [PASS]\") || echo \"selftests: $$TEST [FAIL]\""; \
+		lcov --rc lcov_branch_coverage=1 --capture --directory ./ --output-file coverage.info; \
+		genhtml --branch-coverage coverage.info --output-directory out; \
 	done;
 endef
 
-emit_tests:
-	$(EMIT_TESTS)
+coverage_tests: run_tests
+	$(COVERAGE_TESTS)
 
-.PHONY: run_tests all clean emit_tests
+
+define CLEAN_COVERAGE
+	@for TEST in $(TEST_PROGS); do \
+		$(RM) -r $$TEST $$TEST.gcno $$TEST.gcda coverage.info out/; \
+	done;
+endef
+
+clean_coverage:
+	$(CLEAN_COVERAGE)
+
+.PHONY: run_tests all clean coverage_tests clean_coverage