diff --git a/scripts/coverage.sh b/scripts/coverage.sh
index 4ee5ab077da1ea0bbe429b54a64debe7dfc3fc4e..354b3048f1eb8091a15b23d7a464aa238c1c321c 100755
--- a/scripts/coverage.sh
+++ b/scripts/coverage.sh
@@ -25,10 +25,22 @@ hash godir 2>/dev/null || go get github.com/Masterminds/godir
 
 generate_cover_data() {
   for d in $(godir) ; do
-    local output="${coverdir}/${d//\//-}.cover"
-    go test -coverprofile="${output}" -covermode="$covermode" "$d"
+    (
+      local output="${coverdir}/${d//\//-}.cover"
+      go test -coverprofile="${output}" -covermode="$covermode" "$d"
+    ) &
   done
 
+  local fails
+  fails=0
+  for job in $(jobs -p); do
+    wait "${job}" || let "fails+=1"
+  done
+  if (( fails != 0 )); then
+    echo "FAILED"
+    exit ${fails}
+  fi
+
   echo "mode: $covermode" >"$profile"
   grep -h -v "^mode:" "$coverdir"/*.cover >>"$profile"
 }
@@ -40,7 +52,7 @@ push_to_coveralls() {
 generate_cover_data
 go tool cover -func "${profile}"
 
-case "$1" in
+case "${1-}" in
   --html)
     go tool cover -html "${profile}"
     ;;