diff --git a/tests/functional/tester/cluster.go b/tests/functional/tester/cluster.go
index <HASH>..<HASH> 100644
--- a/tests/functional/tester/cluster.go
+++ b/tests/functional/tester/cluster.go
@@ -113,8 +113,6 @@ func NewCluster(lg *zap.Logger, fpath string) (*Cluster, error) {
 	}
 	go clus.serveTesterServer()
 
-	clus.updateCases()
-
 	clus.rateLimiter = rate.NewLimiter(
 		rate.Limit(int(clus.Tester.StressQPS)),
 		int(clus.Tester.StressQPS),
diff --git a/tests/functional/tester/cluster_run.go b/tests/functional/tester/cluster_run.go
index <HASH>..<HASH> 100644
--- a/tests/functional/tester/cluster_run.go
+++ b/tests/functional/tester/cluster_run.go
@@ -33,6 +33,10 @@ const compactQPS = 50000
 func (clus *Cluster) Run() {
 	defer printReport()
 
+	// updateCases must be executed after etcd is started, because the FAILPOINTS case
+	// needs to obtain all the failpoints from the etcd member.
+	clus.updateCases()
+
 	if err := fileutil.TouchDirAll(clus.Tester.DataDir); err != nil {
 		clus.lg.Panic(
 			"failed to create test data directory",
fix: failed to get failpoints from  member