Golang kiểm tra trong thư mục con


121

Tôi muốn tạo một gói trong Go với các bài kiểm tra và ví dụ cho gói dưới dạng thư mục con để giữ cho không gian làm việc sạch hơn. Điều này có khả thi không và nếu có thì làm thế nào?

Tất cả các tài liệu luôn đặt mã kiểm tra ở cùng một nơi với mã khác, điều này tốt hơn theo một cách nào đó hay chỉ là quy ước?


5
Lưu ý: go test ./...sẽ chạy thử nghiệm trên thư mục hiện tại tất cả các thư mục con. Xem câu trả lời của tôi bên dưới
VonC


tôi đã suy nghĩ cùng một điều. gặp khó khăn khi đặt các bài kiểm tra na dir riêng biệt vì diretor trên cùng một cấp có dirs phụ.
filthy_wizard

Câu trả lời:


203

Lưu ý rằng bạn có thể chạy go test"đệ quy": bạn cần liệt kê tất cả các gói bạn muốn kiểm tra .

Nếu bạn đang ở trong thư mục gốc của dự án Go, hãy nhập:

go test ./...

Các ' ./...' ký hiệu được mô tả trong phần " Mô tả danh sách gói " của " lệnhgo ":

Đường dẫn nhập là một mẫu nếu nó bao gồm một hoặc nhiều ...ký tự đại diện "", mỗi ký tự này có thể khớp với bất kỳ chuỗi nào, bao gồm chuỗi trống và chuỗi chứa dấu gạch chéo.

Một mẫu như vậy mở rộng đến tất cả các thư mục gói được tìm thấy trong các GOPATHcây có tên phù hợp với các mẫu.

Như một trường hợp đặc biệt, các x/...trận đấu xcũng như xcác thư mục con của.
Ví dụ: net/...mở rộng đến netvà đóng gói trong các thư mục con của nó.


Nếu bạn giữ các _test.gotệp của mình trong một thư mục con, go test ./...lệnh '' sẽ có thể chọn chúng.
Nhưng:

  • bạn sẽ cần thêm tiền tố cho các biến và hàm đã xuất của mình (được sử dụng trong các thử nghiệm của bạn) với tên gói của bạn, để tệp thử nghiệm có thể truy cập vào nội dung đã xuất của gói.
  • bạn sẽ không truy cập nội dung không được xuất.

Điều đó đang được nói, tôi vẫn muốn giữ _test.gotệp ngay bên cạnh tệp nguồn chính: nó dễ tìm hơn.


4
Một số người có thể cho rằng không truy cập vào nội dung riêng tư là thử nghiệm hộp đen thông thường và tốt hơn. Về việc phải đủ điều kiện ký hiệu công khai, bạn luôn có thể nhập _ "...".
ddevienne

15

Đặt các thử nghiệm của bạn cùng với mã của bạn trong cùng một thư mục trong một tệp có tên là file_test.go"tệp" là tên của tệp mã nguồn mà bạn đang kiểm tra. Đây là quy ước và tôi thấy nó là tốt nhất theo kinh nghiệm của riêng tôi.

Nếu go testcông cụ này không đủ tự động cho bạn, bạn có thể xem xét GoConvey , có giao diện người dùng web sẽ tự động cập nhật và chạy các bài kiểm tra cờ vây truyền thống cũng như các bài kiểm tra GoConvey (dựa trên hành vi và tự ghi lại nhiều hơn so với các bài kiểm tra cờ vây truyền thống).


2
GoConvey thật tuyệt vời (và tôi đang chờ đợi giao diện người dùng mới với sự kỳ vọng cao). Tôi đang sử dụng nó trong dự án hiện tại của mình , chẳng hạn như trong github.com/VonC/asciidocgo/blob/master/abstractNode_test.go ). Tuy nhiên, go testcũng có thể hoạt động đối với các thư mục con. Xem câu trả lời của tôi bên dưới
VonC

Bạn đúng. Trên thực tế, nó có lẽ phù hợp hơn câu trả lời của tôi cho câu hỏi này.
Matt

10

ĐÃ CHỈNH SỬA

Được xây dựng dựa trên câu trả lời của VonC,

Câu trả lời này có giá trị trong go1.11. Chưa được thử nghiệm trong gocác phiên bản cao hơn.

Đối với những người bạn muốn giữ các bài kiểm tra của họ trong một thư mục con, hãy nói test, sau đó chạy

go test ./...

sẽ cố gắng chạy thử nghiệm trong mọi thư mục, ngay cả những thư mục không chứa bất kỳ thử nghiệm nào, do đó sẽ có ?báo cáo tiếp theo cho các thư mục không thử nghiệm.

Đang chạy

go test ./.../test

thay vào đó sẽ chỉ nhắm mục tiêu các testthư mục của bạn , do đó có một báo cáo rõ ràng chỉ tập trung vào các thư mục thử nghiệm của bạn.

THẬN TRỌNG

Xin lưu ý rằng việc sử dụng các thư mục con thử nghiệm sẽ ngăn cản việc tính toán báo cáo phạm vi. Triết lý của go là để các tệp thử nghiệm trong các thư mục gói.


1
Mẹo hay, ngoài câu trả lời năm tuổi của tôi. Bình chọn
VonC

Anna thân mến, xin vui lòng giải thích những gì không hoạt động? và phiên bản đi của bạn là gì? bạn đang cố làm gì vậy? Sau đó, tôi nhận ra rằng phương pháp này không cho phép tính toán vùng phủ mã, đó là một lỗi. Ý bạn là vậy đúng không?
avi.elkharrat

1
go test ./.../testtrả về go: warning: "./.../test" matched no packages// không chỉ nhắm mục tiêu các thư mục thử nghiệm. go phiên bản go1.13 darwin / amd64
anna

1
@Madeo, điều này sẽ có ý nghĩa, bởi vì golang không khuyến khích tách biệt các bài kiểm tra và mã. Điều bất thường là cho phép nó trong các phiên bản trước.
avi.elkharrat

1
@ avi.elkharrat và trên thực tế, tôi đã quyết định không theo đuổi cách tiếp cận này nữa, mặc dù tôi thích giữ các bài kiểm tra của mình vào một gói / thư mục riêng = (
Madeo

-4

Tôi thường không kiểm tra, nhưng bạn có thể nhóm tệp của mình thành các thư mục và sử dụng nhập như

import "./models"nếu là một cấp
import "../modelsnếu là một cấp và một cấp trong

Ví dụ, cho:
./models/todo.go
./test/todo_test.go

để kiểm tra todo.gotừ todo_test.go, nhập khẩu của bạn trong todo_test.gosẽ

import "../models"


Phương pháp nhập mã này chỉ hoạt động đối với các chức năng được hiển thị. Nó dường như không hoạt động như chúng ở trong cùng một gói, thậm chí bạn nghĩ rằng bạn đặt chúng trong cùng một gói một cách rõ ràng. Vì vậy giải pháp này không thực sự giải quyết được vấn đề cho kiểm thử đơn vị.
The Graceful Penguin,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.