Κοινή χρήση τεχνολογίας

Πήγαινε δοκιμές μονάδας

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Στη γλώσσα Go, η δοκιμή μονάδας υλοποιείται μέσω του πακέτου δοκιμών στην τυπική βιβλιοθήκη, η οποία παρέχει ένα σύνολο λειτουργιών που καθιστούν τη σύνταξη, την εκτέλεση και τη διαχείριση δοκιμών μονάδας απλή και αποτελεσματική.

1. Κανόνες

  • Δοκιμή κανόνων ονομασίας αρχείων
    Ο κανόνας ονομασίας αρχείου δοκιμής στο Go είναι η προσθήκη_test.go .Για παράδειγμα, εάν έχετε έναcalculator.go αρχείο, το αντίστοιχο αρχείο δοκιμής θα πρέπει να είναιcalculator_test.go

  • Κανόνες ονομασίας για συναρτήσεις δοκιμής
    Η λειτουργία δοκιμής πρέπει να ξεκινά μεTest ξεκινά και μπορεί να ακολουθείται από οποιαδήποτε μη κενή συμβολοσειρά, για παράδειγμαTestAddTestSubtract Περίμενε.

  • χρήση testing.T Κάντε ισχυρισμούς και αναφέρετε σφάλματα
    Στη λειτουργία δοκιμής, χρησιμοποιήστεtesting.T Πληκτρολογήστε παραμέτρους για να διαχειριστείτε την κατάσταση και την έξοδο δοκιμής.μπορείς να χρησιμοποιήσειςt.Error*t.Fail* και άλλες μεθόδους για την ένδειξη της αποτυχίας δοκιμής και την έξοδο σχετικών πληροφοριών σφάλματος.

2. Παράδειγμα δοκιμής μονάδας

2.1 Ενιαία δοκιμαστική περίπτωση

Στο πακέτο αριθμομηχανής ορίζεται μια συνάρτηση αριθμομηχανής και η συγκεκριμένη υλοποίηση είναι η εξής:

package calculator

func Add(a, b int) int {
	return a + b
}
  • 1
  • 2
  • 3
  • 4
  • 5

Στον τρέχοντα κατάλογο, δημιουργούμε ένα δοκιμαστικό αρχείο calculator_test.go και ορίζουμε μια δοκιμαστική συνάρτηση ως εξής:

package calculator

import "testing"


func TestAdd(t *testing.T) {
	result := Add(1, 2)
	expected := 3
	if result != expected {
		t.Errorf("Add(1,2) return %d, expected %d", result, expected)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Για να εκτελέσετε αυτήν τη δοκιμή μονάδας, χρησιμοποιήστε την εντολή go test.Στη γραμμή εντολών, εισαγάγετε τον κατάλογο που περιέχει το calculator.go και το calculator_test.go και, στη συνέχεια, εκτελέστεgo test, τα αποτελέσματα αυτά είναι τα εξής

go test
PASS
ok      modu    0.226s
  • 1
  • 2
  • 3

2.2 Πολλαπλές περιπτώσεις δοκιμών

Προσθέστε την ακόλουθη συνάρτηση δοκιμής στο calculator_test.go:

func TestAdd2(t *testing.T) {
	result := Add(3, 2)
	expected := 3
	if result != expected {
		t.Errorf("Add(1,2) return %d, expected %d", result, expected)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Για να δούμε καλύτερα την εκτέλεση κάθε δοκιμαστικής περίπτωσης στα αποτελέσματα εξόδου, μπορούμεgo test -vπαραμέτρους για να του επιτρέψουν να δώσει πλήρη αποτελέσματα δοκιμής.

go test -v
=== RUN   TestAdd
--- PASS: TestAdd (0.00s)
=== RUN   TestAdd2
    calculator_test.go:17: Add(1,2) return 5, expected 3
--- FAIL: TestAdd2 (0.00s)
FAIL
exit status 1
FAIL    modu    0.216s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.3 Καθορίστε τις περιπτώσεις εκτέλεσης δοκιμών

go test -run Η εντολή μπορεί να εκτελέσει δοκιμές σύμφωνα με τον καθορισμένο τρόπο λειτουργίας. Αυτή η εντολή υποστηρίζει τυπικές εκφράσεις για την επιλογή δοκιμαστικών συναρτήσεων προς εκτέλεση.

Για παράδειγμα, αφού διορθώσετε την περίπτωση χρήσης TestAdd2, περάστεgo tes -run=Add2Εκτελέστε μόνο την περίπτωση δοκιμής TestAdd2, το αποτέλεσμα είναι

go test -run=Add2 -v
=== RUN   TestAdd2
--- PASS: TestAdd2 (0.00s)
PASS
ok      modu    0.198s
  • 1
  • 2
  • 3
  • 4
  • 5

4. Παραλείψτε κάποιες περιπτώσεις δοκιμών
Προσθήκη νέας λειτουργίας δοκιμής

func TestAdd3(t *testing.T) {
	if testing.Short() {
        t.Skip("short模式下会跳过该测试用例")
    }
	
	result := Add(3, 2)
	expected := 5
	if result != expected {
		t.Errorf("Add(1,2) return %d, expected %d", result, expected)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

κατά την εκτέλεσηgo test -shorΌταν t, θα παραλειφθείtesting.Short()Η χαρακτηρισμένη περίπτωση δοκιμής, το αποτέλεσμα είναι

go test -short -v
=== RUN   TestAdd
--- PASS: TestAdd (0.00s)
=== RUN   TestAdd2
--- PASS: TestAdd2 (0.00s)
=== RUN   TestAdd3
    calculator_test.go:23: short模式下会跳过该测试用例
--- SKIP: TestAdd3 (0.00s)
PASS
ok      modu    0.635s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3. Ομάδες δοκιμών και υποδοκιμές

3.1 Ομάδες δοκιμών και υποδοκιμές

Μέσω ομάδων δοκιμών και υποδοκιμών, μπορείτε να προσθέσετε περισσότερες περιπτώσεις δοκιμών και να δείτε τα αποτελέσματα με πιο φιλικό τρόπο

func TestAdd(t *testing.T) {
	tests := []struct {
		name     string
		x, y     int
		expected int
	}{
		{"Add1", 1, 2, 3},
		{"Add2", 3, 3, 6},
		{"Add3", 4, 5, 8},
	}

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			result := Add(tc.x, tc.y)
			if result != tc.expected {
				t.Errorf("Add(%d, %d) returned %d, expected %d", tc.x, tc.y, result, tc.expected)
			}
		})
	}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

τρέξιμοgo test -v,αποδεικνύονται

go test -v
=== RUN   TestAdd
=== RUN   TestAdd/Add2
=== RUN   TestAdd/Add3
    calculator_test.go:51: Add(4, 5) returned 9, expected 8
--- FAIL: TestAdd (0.00s)
    --- PASS: TestAdd/Add1 (0.00s)
    --- PASS: TestAdd/Add2 (0.00s)
    --- FAIL: TestAdd/Add3 (0.00s)
FAIL
exit status 1
FAIL    modu    0.190s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3.2 Παράλληλη δοκιμή

Η γλώσσα Go υποστηρίζει εγγενώς τη συγχρονικότητα, επομένως προσθέτονταςt.Parallel()Για να επιτευχθεί παραλληλισμός των δοκιμών οδηγού.

func TestAdd(t *testing.T) {
	t.Parallel()  // 将 TLog 标记为能够与其他测试并行运行
	// 这里使用匿名结构体定义了若干个测试用例
	// 并且为每个测试用例设置了一个名称
	tests := []struct {
		name     string
		x, y     int
		expected int
	}{
		{"Add1", 1, 2, 3},
		{"Add2", 3, 3, 6},
		{"Add3", 4, 5, 8},
	}

	for _, tc := range tests {
		tc := tc  // 注意这里重新声明tt变量(避免多个goroutine中使用了相同的变量)
		t.Run(tc.name, func(t *testing.T) {
			t.Parallel()  // 将每个测试用例标记为能够彼此并行运行
			result := Add(tc.x, tc.y)
			if result != tc.expected {
				t.Errorf("Add(%d, %d) returned %d, expected %d", tc.x, tc.y, result, tc.expected)
			}
		})
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

3.3 Κάλυψη δοκιμής

χρήσηgo test -coverγια να δείτε την κάλυψη δοκιμής

go test -cover
PASS
        modu    coverage: 100.0% of statements
ok      modu    1.149s
  • 1
  • 2
  • 3
  • 4

4. Go unit testing toolkit – μαρτυρά

Κατά τη διεξαγωγή δοκιμών μονάδας στη γλώσσα Go, καθώς η επίσημη συνάρτηση βεβαίωσης δεν είναι ενσωματωμένη, συνήθως χρειάζεται να χρησιμοποιήσουμε μεγάλο αριθμόif...else... δήλωση για την επαλήθευση των αποτελεσμάτων της δοκιμής.Ωστόσο, χρησιμοποιώντας βιβλιοθήκες τρίτων όπως π.χtestify/assert, μπορούμε εύκολα να καλέσουμε μια ποικιλία από κοινώς χρησιμοποιούμενες συναρτήσεις διεκδίκησης, οι οποίες όχι μόνο απλοποιούν τον κώδικα δοκιμής, αλλά δημιουργούν επίσης σαφείς και κατανοητές πληροφορίες περιγραφής σφάλματος για να μας βοηθήσουν να εντοπίσουμε γρήγορα το πρόβλημα.

Στο παραπάνω παράδειγμα, χρησιμοποιούμεif...else...Δήλωση για την επαλήθευση των αποτελεσμάτων της δοκιμής

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			result := Add(tc.x, tc.y)
			if result != tc.expected {
				t.Errorf("Add(%d, %d) returned %d, expected %d", tc.x, tc.y, result, tc.expected)
			}
		})
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Διαθέσιμο τώραtestify/assertΗ παραπάνω διαδικασία κρίσης απλοποιείται ως εξής:

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			result := Add(tc.x, tc.y)
			assert.Equal(t, result, tc.expected)
		})
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

testify/requireέχωtestify/assertΌλες οι συναρτήσεις διεκδίκησης, η μόνη διαφορά μεταξύ τους είναιtestify/requireΕάν αντιμετωπιστεί μια αποτυχημένη περίπτωση δοκιμής, η δοκιμή θα τερματιστεί αμέσως.