τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Στη γλώσσα Go, η δοκιμή μονάδας υλοποιείται μέσω του πακέτου δοκιμών στην τυπική βιβλιοθήκη, η οποία παρέχει ένα σύνολο λειτουργιών που καθιστούν τη σύνταξη, την εκτέλεση και τη διαχείριση δοκιμών μονάδας απλή και αποτελεσματική.
Δοκιμή κανόνων ονομασίας αρχείων
Ο κανόνας ονομασίας αρχείου δοκιμής στο Go είναι η προσθήκη_test.go
.Για παράδειγμα, εάν έχετε έναcalculator.go
αρχείο, το αντίστοιχο αρχείο δοκιμής θα πρέπει να είναιcalculator_test.go
。
Κανόνες ονομασίας για συναρτήσεις δοκιμής
Η λειτουργία δοκιμής πρέπει να ξεκινά μεTest
ξεκινά και μπορεί να ακολουθείται από οποιαδήποτε μη κενή συμβολοσειρά, για παράδειγμαTestAdd
、TestSubtract
Περίμενε.
χρήση testing.T
Κάντε ισχυρισμούς και αναφέρετε σφάλματα
Στη λειτουργία δοκιμής, χρησιμοποιήστεtesting.T
Πληκτρολογήστε παραμέτρους για να διαχειριστείτε την κατάσταση και την έξοδο δοκιμής.μπορείς να χρησιμοποιήσειςt.Error*
、t.Fail*
και άλλες μεθόδους για την ένδειξη της αποτυχίας δοκιμής και την έξοδο σχετικών πληροφοριών σφάλματος.
Στο πακέτο αριθμομηχανής ορίζεται μια συνάρτηση αριθμομηχανής και η συγκεκριμένη υλοποίηση είναι η εξής:
package calculator
func Add(a, b int) int {
return a + b
}
Στον τρέχοντα κατάλογο, δημιουργούμε ένα δοκιμαστικό αρχείο 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)
}
}
Για να εκτελέσετε αυτήν τη δοκιμή μονάδας, χρησιμοποιήστε την εντολή go test.Στη γραμμή εντολών, εισαγάγετε τον κατάλογο που περιέχει το calculator.go και το calculator_test.go και, στη συνέχεια, εκτελέστεgo test
, τα αποτελέσματα αυτά είναι τα εξής
go test
PASS
ok modu 0.226s
Προσθέστε την ακόλουθη συνάρτηση δοκιμής στο 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)
}
}
Για να δούμε καλύτερα την εκτέλεση κάθε δοκιμαστικής περίπτωσης στα αποτελέσματα εξόδου, μπορούμε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
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
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)
}
}
κατά την εκτέλεση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
Μέσω ομάδων δοκιμών και υποδοκιμών, μπορείτε να προσθέσετε περισσότερες περιπτώσεις δοκιμών και να δείτε τα αποτελέσματα με πιο φιλικό τρόπο
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)
}
})
}
}
τρέξιμο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
Η γλώσσα 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)
}
})
}
}
χρήσηgo test -cover
για να δείτε την κάλυψη δοκιμής
go test -cover
PASS
modu coverage: 100.0% of statements
ok modu 1.149s
Κατά τη διεξαγωγή δοκιμών μονάδας στη γλώσσα 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)
}
})
}
Διαθέσιμο τώρα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)
})
}
testify/require
έχωtestify/assert
Όλες οι συναρτήσεις διεκδίκησης, η μόνη διαφορά μεταξύ τους είναιtestify/require
Εάν αντιμετωπιστεί μια αποτυχημένη περίπτωση δοκιμής, η δοκιμή θα τερματιστεί αμέσως.