diff --git a/cmd/restic/integration_test.go b/cmd/restic/integration_test.go
index 11c048f90..2be089b23 100644
--- a/cmd/restic/integration_test.go
+++ b/cmd/restic/integration_test.go
@@ -31,6 +31,7 @@ import (
 )
 
 func parseIDsFromReader(t testing.TB, rd io.Reader) restic.IDs {
+	t.Helper()
 	IDs := restic.IDs{}
 	sc := bufio.NewScanner(rd)
 
@@ -148,6 +149,7 @@ func testRunRestoreAssumeFailure(snapshotID string, opts RestoreOptions, gopts G
 }
 
 func testRunCheck(t testing.TB, gopts GlobalOptions) {
+	t.Helper()
 	opts := CheckOptions{
 		ReadData:    true,
 		CheckUnused: true,
diff --git a/internal/test/helpers.go b/internal/test/helpers.go
index 93178ae10..65e3e36ec 100644
--- a/internal/test/helpers.go
+++ b/internal/test/helpers.go
@@ -3,13 +3,11 @@ package test
 import (
 	"compress/bzip2"
 	"compress/gzip"
-	"fmt"
 	"io"
 	"os"
 	"os/exec"
 	"path/filepath"
 	"reflect"
-	"runtime"
 	"testing"
 
 	"github.com/restic/restic/internal/errors"
@@ -19,30 +17,28 @@ import (
 
 // Assert fails the test if the condition is false.
 func Assert(tb testing.TB, condition bool, msg string, v ...interface{}) {
+	tb.Helper()
 	if !condition {
-		_, file, line, _ := runtime.Caller(1)
-		fmt.Printf("\033[31m%s:%d: "+msg+"\033[39m\n\n", append([]interface{}{filepath.Base(file), line}, v...)...)
-		tb.FailNow()
+		tb.Fatalf("\033[31m"+msg+"\033[39m\n\n", v...)
 	}
 }
 
 // OK fails the test if an err is not nil.
 func OK(tb testing.TB, err error) {
+	tb.Helper()
 	if err != nil {
-		_, file, line, _ := runtime.Caller(1)
-		fmt.Printf("\033[31m%s:%d: unexpected error: %+v\033[39m\n\n", filepath.Base(file), line, err)
-		tb.FailNow()
+		tb.Fatalf("\033[31munexpected error: %+v\033[39m\n\n", err)
 	}
 }
 
 // OKs fails the test if any error from errs is not nil.
 func OKs(tb testing.TB, errs []error) {
+	tb.Helper()
 	errFound := false
 	for _, err := range errs {
 		if err != nil {
 			errFound = true
-			_, file, line, _ := runtime.Caller(1)
-			fmt.Printf("\033[31m%s:%d: unexpected error: %+v\033[39m\n\n", filepath.Base(file), line, err.Error())
+			tb.Logf("\033[31munexpected error: %+v\033[39m\n\n", err.Error())
 		}
 	}
 	if errFound {
@@ -52,10 +48,9 @@ func OKs(tb testing.TB, errs []error) {
 
 // Equals fails the test if exp is not equal to act.
 func Equals(tb testing.TB, exp, act interface{}) {
+	tb.Helper()
 	if !reflect.DeepEqual(exp, act) {
-		_, file, line, _ := runtime.Caller(1)
-		fmt.Printf("\033[31m%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", filepath.Base(file), line, exp, act)
-		tb.FailNow()
+		tb.Fatalf("\033[31m\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", exp, act)
 	}
 }
 
@@ -92,6 +87,7 @@ func Random(seed, count int) []byte {
 
 // SetupTarTestFixture extracts the tarFile to outputDir.
 func SetupTarTestFixture(t testing.TB, outputDir, tarFile string) {
+	t.Helper()
 	input, err := os.Open(tarFile)
 	OK(t, err)
 	defer func() {
@@ -130,6 +126,7 @@ func SetupTarTestFixture(t testing.TB, outputDir, tarFile string) {
 // Env creates a test environment and extracts the repository fixture.
 // Returned is the repo path and a cleanup function.
 func Env(t testing.TB, repoFixture string) (repodir string, cleanup func()) {
+	t.Helper()
 	tempdir, err := os.MkdirTemp(TestTempDir, "restic-test-env-")
 	OK(t, err)
 
@@ -159,6 +156,7 @@ func isFile(fi os.FileInfo) bool {
 // This is mainly used for tests on Windows, which is unable to delete a file
 // set read-only.
 func ResetReadOnly(t testing.TB, dir string) {
+	t.Helper()
 	err := filepath.Walk(dir, func(path string, fi os.FileInfo, err error) error {
 		if fi == nil {
 			return err
@@ -183,6 +181,7 @@ func ResetReadOnly(t testing.TB, dir string) {
 // RemoveAll recursively resets the read-only flag of all files and dirs and
 // afterwards uses os.RemoveAll() to remove the path.
 func RemoveAll(t testing.TB, path string) {
+	t.Helper()
 	ResetReadOnly(t, path)
 	err := os.RemoveAll(path)
 	if errors.Is(err, os.ErrNotExist) {
@@ -194,6 +193,7 @@ func RemoveAll(t testing.TB, path string) {
 // TempDir returns a temporary directory that is removed by t.Cleanup,
 // except if TestCleanupTempDirs is set to false.
 func TempDir(t testing.TB) string {
+	t.Helper()
 	tempdir, err := os.MkdirTemp(TestTempDir, "restic-test-")
 	if err != nil {
 		t.Fatal(err)