diff --git a/models/pull.go b/models/pull.go
index 07c58446da..aba1046402 100644
--- a/models/pull.go
+++ b/models/pull.go
@@ -1058,29 +1058,30 @@ func (pr *PullRequest) checkAndUpdateStatus() {
 // TODO: test more pull requests at same time.
 func TestPullRequests() {
 	prs := make([]*PullRequest, 0, 10)
-	x.Iterate(PullRequest{
-		Status: PullRequestStatusChecking,
-	},
-		func(idx int, bean interface{}) error {
-			pr := bean.(*PullRequest)
 
-			if err := pr.GetBaseRepo(); err != nil {
-				log.Error(3, "GetBaseRepo: %v", err)
-				return nil
-			}
-			if pr.manuallyMerged() {
-				return nil
-			}
-			if err := pr.testPatch(); err != nil {
-				log.Error(3, "testPatch: %v", err)
-				return nil
-			}
-			prs = append(prs, pr)
-			return nil
-		})
+	err := x.Where("status = ?", PullRequestStatusChecking).Find(&prs)
+	if err != nil {
+		log.Error(3, "Find Checking PRs", err)
+		return
+	}
+
+	var checkedPRs = make(map[int64]struct{})
 
 	// Update pull request status.
 	for _, pr := range prs {
+		checkedPRs[pr.ID] = struct{}{}
+		if err := pr.GetBaseRepo(); err != nil {
+			log.Error(3, "GetBaseRepo: %v", err)
+			continue
+		}
+		if pr.manuallyMerged() {
+			continue
+		}
+		if err := pr.testPatch(); err != nil {
+			log.Error(3, "testPatch: %v", err)
+			continue
+		}
+
 		pr.checkAndUpdateStatus()
 	}
 
@@ -1089,7 +1090,12 @@ func TestPullRequests() {
 		log.Trace("TestPullRequests[%v]: processing test task", prID)
 		pullRequestQueue.Remove(prID)
 
-		pr, err := GetPullRequestByID(com.StrTo(prID).MustInt64())
+		id := com.StrTo(prID).MustInt64()
+		if _, ok := checkedPRs[id]; ok {
+			continue
+		}
+
+		pr, err := GetPullRequestByID(id)
 		if err != nil {
 			log.Error(4, "GetPullRequestByID[%s]: %v", prID, err)
 			continue