Giờ mã của bạn đã ở trạng thái ổn định (nhân tiện, làm tốt lắm), hãy thêm một test. Kiểm thử mã trong lúc phát triển có thể phơi bày những lỗi lọt vào khi bạn thay đổi mã. Trong chủ đề này, bạn sẽ thêm test cho hàm Hello.
Lưu ý: Chủ đề này là một phần của loạt hướng dẫn nhiều phần, bắt đầu từ Tạo một Go module.
Việc Go hỗ trợ sẵn unit testing giúp bạn kiểm thử dễ dàng ngay trong quá trình làm. Cụ thể, nhờ các quy ước đặt tên, package testing của Go, và lệnh go test, bạn có thể viết và chạy test rất nhanh.
-
Trong thư mục greetings, tạo một tệp tên là greetings_test.go.
Việc đặt tên tệp kết thúc bằng _test.go cho lệnh
go testbiết rằng tệp này chứa các hàm test. -
Trong greetings_test.go, dán đoạn mã sau vào và lưu tệp lại.
package greetings import ( "testing" "regexp" ) // TestHelloName calls greetings.Hello with a name, checking // for a valid return value. func TestHelloName(t *testing.T) { name := "Gladys" want := regexp.MustCompile(`\b`+name+`\b`) msg, err := Hello("Gladys") if !want.MatchString(msg) || err != nil { t.Errorf(`Hello("Gladys") = %q, %v, want match for %#q, nil`, msg, err, want) } } // TestHelloEmpty calls greetings.Hello with an empty string, // checking for an error. func TestHelloEmpty(t *testing.T) { msg, err := Hello("") if msg != "" || err == nil { t.Errorf(`Hello("") = %q, %v, want "", error`, msg, err) } }Trong đoạn mã này, bạn:
- Hiện thực các hàm test trong cùng package với mã mà bạn đang kiểm thử.
- Tạo hai hàm test để kiểm thử hàm
greetings.Hello. Tên hàm test có dạngTestName, trong đó Name nói lên điều gì đó về test cụ thể. Ngoài ra, hàm test nhận một con trỏ tới kiểutesting.Tcủa packagetestinglàm tham số. Bạn dùng các method của tham số này để báo cáo và ghi log từ test của mình. - Hiện thực hai test:
TestHelloNamegọi hàmHello, truyền vào một giá trịnamemà với nó hàm phải trả về được thông điệp hợp lệ. Nếu lời gọi trả về lỗi hoặc một thông điệp ngoài mong đợi (thông điệp không chứa tên bạn đã truyền vào), bạn dùng methodErrorfcủa tham sốtđể in thông báo ra console.TestHelloEmptygọi hàmHellovới một chuỗi rỗng. Test này được thiết kế để xác nhận phần xử lý lỗi của bạn hoạt động đúng. Nếu lời gọi trả về chuỗi khác rỗng hoặc không có lỗi, bạn dùng methodErrorfcủa tham sốtđể in thông báo ra console.
-
Tại dòng lệnh trong thư mục greetings, chạy lệnh
go testđể thực thi test.Lệnh
go testthực thi các hàm test (có tên bắt đầu bằngTest) trong các tệp test (có tên kết thúc bằng _test.go). Bạn có thể thêm cờ-vđể có đầu ra chi tiết, liệt kê tất cả các test cùng kết quả của chúng.Các test sẽ pass.
$ go test PASS ok example.com/greetings 0.364s $ go test -v === RUN TestHelloName --- PASS: TestHelloName (0.00s) === RUN TestHelloEmpty --- PASS: TestHelloEmpty (0.00s) PASS ok example.com/greetings 0.372s -
Cố tình làm hỏng hàm
greetings.Hellođể xem một test thất bại.Hàm test
TestHelloNamekiểm tra giá trị trả về đối với cái tên bạn đã chỉ định làm tham số cho hàmHello. Để xem kết quả một test thất bại, hãy sửa hàmgreetings.Hellosao cho nó không còn chứa cái tên nữa.Trong greetings/greetings.go, dán đoạn mã sau thay cho hàm
Hello. Hãy để ý rằng những dòng được đánh dấu đã thay đổi giá trị mà hàm trả về, như thể đối sốnameđã vô tình bị bỏ đi.// Hello returns a greeting for the named person. func Hello(name string) (string, error) { // If no name was given, return an error with a message. if name == "" { return name, errors.New("empty name") } // Create a message using a random format. // message := fmt.Sprintf(randomFormat(), name) message := fmt.Sprint(randomFormat()) return message, nil } -
Tại dòng lệnh trong thư mục greetings, chạy
go testđể thực thi test.Lần này, hãy chạy
go testmà không có cờ-v. Đầu ra sẽ chỉ gồm kết quả của những test thất bại, điều này hữu ích khi bạn có nhiều test. TestTestHelloNamesẽ thất bại – cònTestHelloEmptyvẫn pass.$ go test --- FAIL: TestHelloName (0.00s) greetings_test.go:15: Hello("Gladys") = "Hail, %v! Well met!", <nil>, want match for `\bGladys\b`, nil FAIL exit status 1 FAIL example.com/greetings 0.182s
Ở chủ đề tiếp theo (và cũng là cuối cùng), bạn sẽ thấy cách biên dịch và cài đặt mã của mình để chạy nó trên máy cục bộ.