diff --git a/tools/integration-tests/tester/framework/docker.go b/tools/integration-tests/tester/framework/docker.go
index 2d1c08ce5e70e1e4dc05b4fba15d7b33e5b8a106..e04c9cfe6ec4a2eaa9886bd3b3b4a3297c25a724 100644
--- a/tools/integration-tests/tester/framework/docker.go
+++ b/tools/integration-tests/tester/framework/docker.go
@@ -160,6 +160,16 @@ func (d *DockerContainer) Stop() error {
 	return d.client.ContainerStop(context.Background(), d.id, &duration)
 }
 
+// ExitStatus returns the exit status according to the container information.
+func (d *DockerContainer) ExitStatus() (int, error) {
+	resp, err := d.client.ContainerInspect(context.Background(), d.id)
+	if err != nil {
+		return -1, err
+	}
+
+	return resp.State.ExitCode, nil
+}
+
 // Logs returns the logs of the container as io.ReadCloser.
 func (d *DockerContainer) Logs() (io.ReadCloser, error) {
 	options := types.ContainerLogsOptions{
diff --git a/tools/integration-tests/tester/framework/network.go b/tools/integration-tests/tester/framework/network.go
index 7b08e3a76a6f624bb919bd67d730fbb074b71be3..4094e8b6e173fd78148821645e7e1a7e3b4c911d 100644
--- a/tools/integration-tests/tester/framework/network.go
+++ b/tools/integration-tests/tester/framework/network.go
@@ -155,6 +155,19 @@ func (n *Network) Shutdown() error {
 		}
 	}
 
+	// save exit status of containers to check at end of shutdown process
+	exitStatus := make(map[string]int, len(n.peers)+1)
+	exitStatus[containerNameEntryNode], err = n.entryNode.ExitStatus()
+	if err != nil {
+		return err
+	}
+	for _, p := range n.peers {
+		exitStatus[p.name], err = p.ExitStatus()
+		if err != nil {
+			return err
+		}
+	}
+
 	// remove containers
 	err = n.entryNode.Remove()
 	if err != nil {
@@ -179,6 +192,13 @@ func (n *Network) Shutdown() error {
 		return err
 	}
 
+	// check exit codes of containers
+	for name, status := range exitStatus {
+		if status != exitStatusSuccessful {
+			return fmt.Errorf("container %s exited with code %d", name, status)
+		}
+	}
+
 	return nil
 }
 
diff --git a/tools/integration-tests/tester/framework/parameters.go b/tools/integration-tests/tester/framework/parameters.go
index c66302800d4c238a4e2fc60b6e4efda4e5e285ef..17d8933574870f1fe2bd6cd79d59add12d67b5bf 100644
--- a/tools/integration-tests/tester/framework/parameters.go
+++ b/tools/integration-tests/tester/framework/parameters.go
@@ -18,6 +18,8 @@ const (
 	dockerLogsPrefixLen = 8
 
 	dkgMaxTries = 50
+
+	exitStatusSuccessful = 0
 )
 
 // GoShimmerConfig defines the config of a GoShimmer node.
diff --git a/tools/integration-tests/tester/tests/common_test.go b/tools/integration-tests/tester/tests/common_test.go
index 02090370af2a215649af953793d3ff36b819cbce..e52f6c89798a8b8872b01e83b3a262e3afe41dd8 100644
--- a/tools/integration-tests/tester/tests/common_test.go
+++ b/tools/integration-tests/tester/tests/common_test.go
@@ -19,7 +19,7 @@ func TestSynchronization(t *testing.T) {
 	initalPeers := 4
 	n, err := f.CreateNetwork("common_TestSynchronization", initalPeers, 2, config)
 	require.NoError(t, err)
-	defer n.Shutdown()
+	defer ShutdownNetwork(t, n)
 
 	// wait for peers to change their state to synchronized
 	time.Sleep(5 * time.Second)
diff --git a/tools/integration-tests/tester/tests/drng_test.go b/tools/integration-tests/tester/tests/drng_test.go
index 0832f04ae9553522cd09097c5964ae2c6ab4ff3d..d0c176454ff03d6dfd5c96866fc752f68365de94 100644
--- a/tools/integration-tests/tester/tests/drng_test.go
+++ b/tools/integration-tests/tester/tests/drng_test.go
@@ -23,7 +23,7 @@ func TestDRNG(t *testing.T) {
 
 	drng, err := f.CreateDRNGNetwork("TestDRNG", 5, 8, 3)
 	require.NoError(t, err)
-	defer drng.Shutdown()
+	defer ShutdownNetwork(t, drng)
 
 	// wait for randomness generation to be started
 	log.Printf("Waiting for randomness generation to be started...\n")
diff --git a/tools/integration-tests/tester/tests/message_test.go b/tools/integration-tests/tester/tests/message_test.go
index d5583988961e901637753f47aad351ad0ad51b14..a1c334f6511628b837e3444f1720453636146d5c 100644
--- a/tools/integration-tests/tester/tests/message_test.go
+++ b/tools/integration-tests/tester/tests/message_test.go
@@ -11,7 +11,7 @@ import (
 func TestPersistence(t *testing.T) {
 	n, err := f.CreateNetwork("message_TestPersistence", 4, 2)
 	require.NoError(t, err)
-	defer n.Shutdown()
+	defer ShutdownNetwork(t, n)
 
 	// wait for peers to change their state to synchronized
 	time.Sleep(5 * time.Second)
diff --git a/tools/integration-tests/tester/tests/testutil.go b/tools/integration-tests/tester/tests/testutil.go
index 3c0bca2da6ca35f97c10681e21f9a3e4e47d82cf..845a7ca5b7a50ebcabd7aa6290f136fa2265e2cd 100644
--- a/tools/integration-tests/tester/tests/testutil.go
+++ b/tools/integration-tests/tester/tests/testutil.go
@@ -19,6 +19,10 @@ type DataMessageSent struct {
 	issuerPublicKey string
 }
 
+type Shutdowner interface {
+	Shutdown() error
+}
+
 // sendDataMessagesOnRandomPeer sends data messages on a random peer and saves the sent message to a map.
 func sendDataMessagesOnRandomPeer(t *testing.T, peers []*framework.Peer, numMessages int, idsMap ...map[string]DataMessageSent) map[string]DataMessageSent {
 	var ids map[string]DataMessageSent
@@ -90,3 +94,9 @@ func checkForMessageIds(t *testing.T, peers []*framework.Peer, ids map[string]Da
 		}
 	}
 }
+
+// ShutdownNetwork shuts down the network and reports errors.
+func ShutdownNetwork(t *testing.T, n Shutdowner) {
+	err := n.Shutdown()
+	require.NoError(t, err)
+}