diff --git a/tests/pipe/Makefile b/tests/pipe/Makefile
index 1eb1913b4cc630223414c1dc6ea0c7e22f550d43..eac90671fa55fb3478ce7c08bc8c2991bde4ff39 100644
--- a/tests/pipe/Makefile
+++ b/tests/pipe/Makefile
@@ -6,3 +6,6 @@ BOARD_INSUFFICIENT_MEMORY := nucleo32-f031
 USEMODULE += pipe
 
 include $(RIOTBASE)/Makefile.include
+
+test:
+	tests/01-run.py
diff --git a/tests/pipe/tests/01-run.py b/tests/pipe/tests/01-run.py
new file mode 100755
index 0000000000000000000000000000000000000000..64086c37e2b855a1708130281bc0c6622f8239bf
--- /dev/null
+++ b/tests/pipe/tests/01-run.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+import math
+
+sys.path.append(os.path.join(os.environ['RIOTBASE'], 'dist/tools/testrunner'))
+import testrunner
+
+
+def testfunc(child):
+    child.expect_exact('Start.')
+    child.expect_exact('Middle read: <ABCD> [0:4]')
+    child.expect_exact('Middle read: <EF> [4:6]')
+    child.expect_exact('End read: <ABC> [0:3]')
+    child.expect_exact('End read: <DEF> [3:6]')
+    child.expect_exact('Middle read: <GHIJ> [6:10]')
+    child.expect_exact('Middle read: <KL> [10:12]')
+    child.expect_exact('End read: <GHI> [6:9]')
+    child.expect_exact('End read: <JKL> [9:12]')
+    child.expect_exact('Middle read: <MNOP> [12:16]')
+    child.expect_exact('Middle read: <QR> [16:18]')
+    child.expect_exact('End read: <MNO> [12:15]')
+    child.expect_exact('End read: <PQR> [15:18]')
+    child.expect_exact('Middle read: <STUV> [18:22]')
+    child.expect_exact('Middle read: <WX> [22:24]')
+    child.expect_exact('Main done.')
+    child.expect_exact('End read: <STU> [18:21]')
+    child.expect_exact('End read: <VWX> [21:24]')
+    child.expect_exact('Middle read: <YZ> [24:26]')
+    child.expect_exact('Middle done.')
+    child.expect_exact('End read: <YZ> [24:26]')
+    child.expect_exact('End done.')
+
+if __name__ == "__main__":
+    sys.exit(testrunner.run(testfunc))