Simplify testing
diff --git a/test/assert.sh b/test/assert.sh
index acceebf..30e158d 100644
--- a/test/assert.sh
+++ b/test/assert.sh
@@ -52,9 +52,12 @@
   local msg="${3-}"
 
   if [ "$expected" == "$actual" ]; then
+    [ "${#msg}" -gt 0 ] && log_success "$msg" || true
+    ((PASSED++))
     return 0
   else
-    [ "${#msg}" -gt 0 ] && log_failure "$expected == $actual :: $msg" || true
+    [ "${#msg}" -gt 0 ] && log_failure "$expected != $actual :: $msg is not the case" || true
+    ((ERRORS++))
     return 1
   fi
 }
@@ -65,9 +68,12 @@
   local msg="${3-}"
 
   if [ ! "$expected" == "$actual" ]; then
+    [ "${#msg}" -gt 0 ] && log_success "$msg" || true
+    ((PASSED++))
     return 0
   else
     [ "${#msg}" -gt 0 ] && log_failure "$expected != $actual :: $msg" || true
+    ((ERRORS++))
     return 1
   fi
 }
@@ -171,6 +177,7 @@
   fi
 
   if [ -z "${haystack##*$needle*}" ]; then
+    ((PASSED++))
     return 0
   else
     [ "${#msg}" -gt 0 ] && log_failure "$haystack doesn't contain $needle :: $msg" || true
@@ -188,9 +195,12 @@
   fi
 
   if [ "${haystack##*$needle*}" ]; then
+    [ "${#msg}" -gt 0 ] && log_success "$msg" || true
+    ((PASSED++))
     return 0
   else
-    [ "${#msg}" -gt 0 ] && log_failure "$haystack contains $needle :: $msg" || true
+    [ "${#msg}" -gt 0 ] && log_failure "$haystack not contains $needle :: $msg" || true
+    ((ERRORS++))
     return 1
   fi
 }
@@ -201,9 +211,12 @@
   local msg="${3-}"
 
   if [[ "$first" -gt  "$second" ]]; then
+    [ "${#msg}" -gt 0 ] && log_success "$msg" || true
+    ((PASSED++))
     return 0
   else
     [ "${#msg}" -gt 0 ] && log_failure "$first > $second :: $msg" || true
+    ((ERRORS++))
     return 1
   fi
 }
@@ -214,9 +227,12 @@
   local msg="${3-}"
 
   if [[ "$first" -ge  "$second" ]]; then
+    [ "${#msg}" -gt 0 ] && log_success "$msg" || true
+    ((PASSED++))
     return 0
   else
     [ "${#msg}" -gt 0 ] && log_failure "$first >= $second :: $msg" || true
+    ((ERRORS++))
     return 1
   fi
 }
@@ -227,9 +243,12 @@
   local msg="${3-}"
 
   if [[ "$first" -lt  "$second" ]]; then
+    [ "${#msg}" -gt 0 ] && log_success "$msg" || true
+    ((PASSED++))
     return 0
   else
     [ "${#msg}" -gt 0 ] && log_failure "$first < $second :: $msg" || true
+    ((ERRORS++))
     return 1
   fi
 }
@@ -240,9 +259,21 @@
   local msg="${3-}"
 
   if [[ "$first" -le  "$second" ]]; then
+    [ "${#msg}" -gt 0 ] && log_success "$msg" || true
+    ((PASSED++))
     return 0
   else
     [ "${#msg}" -gt 0 ] && log_failure "$first <= $second :: $msg" || true
+    ((ERRORS++))
     return 1
   fi
 }
+
+exit_with_test_summary() {
+  if [ "$ERRORS" -gt 0 ]; then
+    log_failure "There were $ERRORS errors"
+  else
+    log_success "All $PASSED tests passed"
+  fi
+  exit $ERRORS
+}
\ No newline at end of file
diff --git a/test/test-xml.sh b/test/test-xml.sh
index 63bb2ea..3a77a95 100755
--- a/test/test-xml.sh
+++ b/test/test-xml.sh
@@ -4,6 +4,7 @@
 # set -e
 . ${ASSERTSH}
 ERRORS=0
+PASSED=0
 TEXTS=6
 I5_FILE=target/dnb18.i5.xml
 if [ ! -f "$I5_FILE" ]; then
@@ -13,59 +14,23 @@
 
 
 observed=$(xmlstarlet  sel --net -t -v "count(//idsText)"  $I5_FILE)
-
-if $(assert_eq "$observed" "$TEXTS"); then
-  log_success "$I5_FILE contains $TEXTS idsText elements"
-else
-  log_failure "$I5_FILE does not contain $TEXTS idsText elements, but: $observed"
-  ((ERRORS++))
-fi
-
+assert_eq "$observed" "$TEXTS" "$I5_FILE contains $TEXTS idsText elements"
 
 observed=$(xmlstarlet sel --net -t -v "count(/idsCorpus/idsDoc/idsText/idsHeader/fileDesc/sourceDesc/biblStruct/monogr/h.author[normalize-space(.)])"  $I5_FILE)
-if $(assert_eq "$observed" "$TEXTS"); then
-  log_success "$I5_FILE contains $TEXTS non-empty h.author elements"
-else
-  log_failure "$I5_FILE does not contain $TEXTS non-empty h.author elements: $observed"
-  ((ERRORS++))
-fi
+assert_eq "$observed" "$TEXTS" "$I5_FILE contains $TEXTS non-empty h.author elements"
 
 observed=$(xmlstarlet sel --net -t -v "/idsCorpus/idsHeader/fileDesc/titleStmt/c.title" target/dnb13.i5.xml)
-if $(assert_eq "$observed" "Deutsche Nationalbibliothek: Belletristik 2013"); then
-  log_success "c.title contains yeaar"
-else
-  log_failure "c.title does not contain year: $observed"
-  ((ERRORS++))
-fi
+assert_eq "$observed" "Deutsche Nationalbibliothek: Belletristik 2013" "c.title contains yeaar"
 
 observed=$(xmlstarlet sel --net -t -v "count(/idsCorpus/idsDoc/idsText/idsHeader/fileDesc/sourceDesc/biblStruct/monogr/h.author[contains(., '[')])"  target/dnb13.i5.xml)
-if $(assert_eq "$observed" "0"); then
-  log_success "authors do not contain []"
-else
-  log_failure "authors contain []: $observed"
-  ((ERRORS++))
-fi
+assert_eq "$observed" "0" "authors do not contain []"
 
 observed=$(xmlstarlet sel --net -t -v "/idsCorpus/idsDoc/idsText/idsHeader/fileDesc/sourceDesc/biblStruct/monogr/editor[@role='translator'][1]"  target/dnb13.i5.xml)
-if $(assert_eq "$observed" "Zwack, Heinz"); then
-  log_success "translator is correctly identified"
-else
-  log_failure "translator is not correctly identified: $observed"
-  ((ERRORS++))
-fi
+assert_eq "$observed" "Zwack, Heinz" "translator is correctly identified"
 
 observed=$(grep -Ec '^Copyright' target/dnb13.i5.xml)
-if $(assert_eq "$observed" "2"); then
-  log_success "spaces at <br> elements are inserted correctly"
-else
-  log_failure "spaces at <br> elements are not inserted correctly"
-  ((ERRORS++))
-fi
+assert_eq "$observed" "2" "spaces at <br> elements are inserted correctly"
+
+exit_with_test_summary
 
 
-if [ $ERRORS -gt 0 ]; then
-  log_failure "There were $ERRORS errors"
-  exit 1
-else
-  log_success "All tests passed"
-fi