diff --git a/.circleci/config.yml b/.circleci/config.yml
index 0d2a2961..3c37299c 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -20,7 +20,7 @@ aliases:
     command: npm run lint
   - &unit
     name: "run unit tests"
-    command: npm run unit
+    command: JEST_JUNIT_OUTPUT_NAME=unit-jest-results.xml npm run unit -- --reporters=jest-junit
   - &build
     name: "run npm build"
     command: |
diff --git a/.gitignore b/.gitignore
index c6c5feec..9a2237b0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,6 @@ dist/*
 # generated translation files
 /translations
 /locale
+
+# tests
+/test/results/*
diff --git a/package-lock.json b/package-lock.json
index 6541d7a7..7a572758 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10238,6 +10238,41 @@
         }
       }
     },
+    "jest-junit": {
+      "version": "13.0.0",
+      "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-13.0.0.tgz",
+      "integrity": "sha512-JSHR+Dhb32FGJaiKkqsB7AR3OqWKtldLd6ZH2+FJ8D4tsweb8Id8zEVReU4+OlrRO1ZluqJLQEETm+Q6/KilBg==",
+      "dev": true,
+      "requires": {
+        "mkdirp": "^1.0.4",
+        "strip-ansi": "^6.0.1",
+        "uuid": "^8.3.2",
+        "xml": "^1.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.1"
+          }
+        },
+        "uuid": {
+          "version": "8.3.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+          "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+          "dev": true
+        }
+      }
+    },
     "jest-leak-detector": {
       "version": "22.4.3",
       "resolved": "http://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz",
@@ -21460,6 +21495,12 @@
         "async-limiter": "~1.0.0"
       }
     },
+    "xml": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
+      "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=",
+      "dev": true
+    },
     "xml-name-validator": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
diff --git a/package.json b/package.json
index f1d4b019..7f99aa12 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
     "lint": "eslint . --ext .js,.jsx",
     "start": "webpack-dev-server",
     "test": "npm run lint && npm run unit && NODE_ENV=production npm run build",
-    "unit": "jest",
+    "unit": "jest --reporters=default",
     "watch": "webpack --progress --colors --watch"
   },
   "author": "Massachusetts Institute of Technology",
@@ -69,6 +69,7 @@
     "html-webpack-plugin": "3.2.0",
     "jest": "22.4.4",
     "jest-canvas-mock": "2.3.1",
+    "jest-junit": "13.0.0",
     "json": "9.0.6",
     "lodash.defaultsdeep": "4.6.1",
     "mkdirp": "1.0.4",
@@ -114,6 +115,9 @@
       "\\.(css|less)$": "<rootDir>/test/__mocks__/styleMock.js"
     }
   },
+  "jest-junit": {
+    "outputDirectory": "./test/results"
+  },
   "browserslist": [
     "last 3 versions",
     "Safari >= 8",