Tes Golang di sub-direktori

121

Saya ingin membuat paket di Go dengan tes dan contoh untuk paket sebagai subdirektori untuk menjaga ruang kerja lebih bersih. Apakah ini mungkin dan jika iya, bagaimana?

Semua dokumentasi selalu menempatkan kode pengujian di tempat yang sama dengan kode lainnya, apakah ini lebih baik dalam beberapa hal atau hanya konvensi?

Penguin yang Anggun
sumber
5
Catatan: go test ./...akan menjalankan tes pada folder saat ini dan semua subfolder. Lihat jawaban saya di bawah
VonC
Kemungkinan duplikat dari Bagaimana `go test` semua pengujian dalam proyek saya?
Matthew Rankin
saya memikirkan hal yang sama. mengalami kesulitan untuk menempatkan tes pada direktori yang terpisah karena diretor pada level yang sama memiliki sub direktori.
filthy_wizard

Jawaban:

203

Perhatikan bahwa Anda dapat menjalankan go test"secara rekursif": Anda perlu membuat daftar semua paket yang ingin Anda uji .

Jika Anda berada di folder root proyek Go Anda, ketik:

go test ./...

./...Notasi ' ' dijelaskan di bagian " Deskripsi daftar paket " dari " perintahgo ":

Jalur impor adalah pola jika menyertakan satu atau lebih karakter ...pengganti " ", yang masing-masing bisa cocok dengan string apa pun, termasuk string kosong dan string yang berisi garis miring.

Pola seperti itu meluas ke semua direktori paket yang ditemukan di GOPATHpohon dengan nama yang cocok dengan pola tersebut.

Sebagai kasus khusus, x/...cocok xserta xsubdirektori.
Misalnya, net/...memperluas ke netdan memaketkan di subdirektorinya.


Jika Anda menyimpan _test.gofile Anda dalam subfolder, perintah ' go test ./...' akan dapat mengambilnya.
Tapi:

  • Anda perlu memberi awalan variabel dan fungsi yang diekspor (digunakan dalam pengujian Anda) dengan nama paket Anda, agar file pengujian dapat mengakses konten yang diekspor dari paket.
  • Anda tidak akan mengakses konten yang tidak diekspor.

Karena itu, saya masih lebih suka menyimpan _test.gofile tepat di samping file sumber utama: lebih mudah ditemukan.

VonC
sumber
4
Beberapa orang mungkin berpendapat bahwa non-akses ke barang pribadi adalah pengujian kotak hitam normal dan lebih baik. Mengenai keharusan untuk memenuhi syarat simbol publik, Anda selalu dapat mengimpor _ "...".
ddevienne
15

Letakkan pengujian Anda bersama kode Anda dalam direktori yang sama dalam sebuah file bernama di file_test.gomana "file" adalah nama file kode sumber yang Anda uji. Ini adalah konvensi dan menurut pengalaman saya adalah yang terbaik.

Jika go testalat tersebut tidak cukup otomatis untuk Anda, Anda dapat melihat GoConvey , yang memiliki UI web yang secara otomatis akan memperbarui dan menjalankan pengujian Go tradisional serta pengujian GoConvey (yang didasarkan pada perilaku, dan lebih mendokumentasikan sendiri) daripada tes Go tradisional).

Matt
sumber
2
GoConvey luar biasa (dan saya menunggu UI baru dengan antisipasi tinggi). Saya menggunakannya dalam proyek saya saat ini seperti di github.com/VonC/asciidocgo/blob/master/abstractNode_test.go , misalnya). Namun, go testjuga dapat berfungsi untuk subfolder. Lihat jawaban saya di bawah
VonC
Kamu benar. Faktanya, itu mungkin lebih relevan daripada jawaban saya untuk pertanyaan ini.
Matt
10

DIEDIT

Dibangun di atas jawaban VonC,

Jawaban ini valid dalam go1.11. Belum diuji di goversi atas .

Bagi Anda yang ingin menyimpan pengujian mereka dalam sub-folder, katakanlah test, lalu jalankan

go test ./...

akan mencoba menjalankan tes di setiap folder, bahkan yang tidak berisi tes apa pun, sehingga memiliki ?dalam laporan berikutnya untuk folder non-tes.

Lari

go test ./.../test

sebagai gantinya hanya akan menargetkan testfolder Anda , sehingga memiliki laporan bersih yang difokuskan pada folder pengujian Anda saja.

PERINGATAN

Harap diperhatikan bahwa menggunakan sub-folder pengujian akan mencegah penghitungan laporan cakupan. Filosofi dari pergi adalah meninggalkan file pengujian di folder paket.

avi.elkharrat
sumber
1
Tip bagus, selain jawaban saya yang berumur lima tahun. Suara positif
VonC
sayang anna, tolong jelaskan apa yang tidak berhasil? dan versi apa yang Anda gunakan? apa yang sedang Anda coba lakukan? Saya kemudian menyadari bahwa metode ini tidak diperbolehkan untuk menghitung cakupan kode, yang sangat menyebalkan. Apakah ini yang kamu maksud
avi.elkharrat
1
go test ./.../testreturn go: warning: "./.../test" matched no packages// tidak hanya menargetkan folder uji. go versi go1.13 darwin / amd64
anna
1
@Madeo, ini masuk akal, karena golang tidak mendorong pemisahan tes dan kode. Anomali adalah mengizinkannya di versi sebelumnya.
avi.elkharrat
1
@ avi.elkharrat dan sebenarnya saya telah memutuskan untuk tidak menggunakan pendekatan ini lagi, meskipun saya suka menyimpan pengujian saya ke dalam paket / folder terpisah = (
Madeo
-4

Saya biasanya tidak melakukan pengujian, tetapi Anda dapat mengelompokkan file Anda ke dalam direktori dan menggunakan import like

import "./models"jika satu tingkat
import "../modelsjika satu tingkat keluar dan satu tingkat masuk

Misalnya untuk:
./models/todo.go
./test/todo_test.go

untuk menguji todo.godari todo_test.go, impor Anda dalam todo_test.gowasiat

import "../models"

Felix Zilla
sumber
Metode pengimporan kode ini hanya berfungsi untuk fungsi yang terbuka. Tampaknya tidak berperilaku seperti mereka berada dalam paket yang sama meskipun Anda secara eksplisit memasukkannya ke dalam paket yang sama. Jadi solusi ini tidak benar-benar menyelesaikan masalah untuk pengujian unit.
The Graceful Penguin