Catatan
Bersaksi sedang dipertahankan di V1, tidak ada perubahan yang akan diterima dalam repo ini.
Lihat diskusi tentang v2.
Paket GO Code (Golang) yang menyediakan banyak alat untuk bersaksi bahwa kode Anda akan berperilaku sesuai keinginan Anda.
Fitur meliputi:
Pernyataan mudah
Mengejek
Menguji antarmuka dan fungsi suite
Mulai:
Instal Testify dengan satu baris kode, atau perbarui dengan yang lain
Untuk pengantar kode tes menulis di Go, lihat https://go.dev/doc/code#testing
Lihat dokumentasi API https://pkg.go.dev/github.com/stretch/testify
Gunakan TestifyLint (via Golanci-Lint) untuk menghindari kesalahan umum
Sedikit tentang pengembangan tes (TDD)
assert
Paket assert
menyediakan beberapa metode bermanfaat yang memungkinkan Anda untuk menulis kode tes yang lebih baik di Go.
Mencetak deskripsi kegagalan yang ramah dan mudah dibaca
Memungkinkan kode yang sangat mudah dibaca
Secara opsional anotasi setiap pernyataan dengan pesan
Melihatnya beraksi:
paket milik Anda ("pengujian" "github.com/stretchr/testify/assert")func testsomething (t *testing.t) {// Assert kesetaraan Assert.Equal (T, 123, 123, "Mereka harus sama") // menegaskan ketidaksetaraan assert.notequal (t, 123, 456, "Mereka tidak boleh sama") // menegaskan nil (baik untuk kesalahan) assert.nil (t, objek) // Assert for not nil (bagus saat Anda mengharapkan sesuatu) Jika assert.notnil (t, objek) {// Sekarang kita tahu bahwa objek bukan nil, kita aman untuk membuat // pernyataan lebih lanjut tanpa menyebabkan kesalahan. } }
Setiap FUNC Assert mengambil objek testing.T
sebagai argumen pertama. Beginilah cara menulis kesalahan melalui kemampuan go test
normal.
Setiap FUNC menegaskan bool yang menunjukkan apakah pernyataan itu berhasil atau tidak, ini berguna untuk jika Anda ingin terus membuat pernyataan lebih lanjut dalam kondisi tertentu.
Jika Anda menegaskan berkali -kali, gunakan di bawah ini:
paket milik Anda ("pengujian" "github.com/stretchr/testify/assert")func testsomething (t *testing.t) {assert: = assert.new (t) // assert kesetaraan Assert.Equal (123, 123, "Mereka harus sama") // menegaskan ketidaksetaraan Assert.notequal (123, 456, "Mereka tidak boleh sama") // Assert untuk nihil (baik untuk kesalahan) assert.nil (objek) // menegaskan untuk tidak nil (baik saat Anda mengharapkan sesuatu) Jika Assert.notnil (objek) {// Sekarang kita tahu objek itu bukan nil, kita aman untuk membuat // pernyataan lebih lanjut tanpa menyebabkan kesalahan. } }
require
paket Paket require
memberikan fungsi global yang sama dengan paket assert
, tetapi alih -alih mengembalikan hasil boolean mereka mengakhiri tes saat ini. Fungsi -fungsi ini harus dipanggil dari goroutine yang menjalankan fungsi tes atau benchmark, bukan dari goroutine lain yang dibuat selama pengujian. Jika tidak, kondisi ras dapat terjadi.
Lihat T.FailNow untuk detailnya.
mock
Paket mock
menyediakan mekanisme untuk dengan mudah menulis objek tiruan yang dapat digunakan sebagai pengganti objek nyata saat menulis kode tes.
Contoh fungsi uji yang menguji sepotong kode yang bergantung pada objek eksternal testObj
, dapat mengatur ekspektasi (bersaksi) dan menyatakan bahwa mereka memang terjadi:
paket milik Anda ("pengujian" "github.com/stretchr/testify/mock")/* objek uji* /// mymockedObject adalah objek yang diejek yang mengimplementasikan antarmuka // yang menggambarkan objek yang diuji kode yang diuji oleh kode. mock.mock} // dosomething adalah metode pada mymockedObject yang mengimplementasikan beberapa antarmuka // dan hanya mencatat aktivitas, dan mengembalikan apa yang dikatakan objek tiruan. Tapi karena ini // adalah objek yang diejek - kita hanya akan membuatnya keluar./////Catatan: Metode ini tidak diuji di sini, kode yang menggunakan objek ini adalah. int) (bool, error) {args: = m.called (angka) return args.bool (0), args.error (1) }/*Fungsi uji aktual*/// testsomething adalah contoh cara menggunakan objek tes kami untuk // membuat pernyataan tentang beberapa kode target yang kami uji.func testsomething (t*testing.t) {// Buat instance dari objek uji kami testObj: = baru (mymockedObject) // mengatur ekspektasi testobj.on ("dosomething", 123). Kembali (true, nil) // Panggil kode yang kami uji TargetFuncthatdoessomethingwithObj (testoBj) // menyatakan bahwa harapan telah dipenuhi testobj.assertexpection (t) } // testsomethingwithplaceHolder adalah contoh kedua tentang cara menggunakan objek tes kami untuk // membuat pernyataan tentang beberapa kode target yang kami uji.// kali ini menggunakan placeholder. Placeholder dapat digunakan ketika // data yang diteruskan secara dinamis dihasilkan secara dinamis dan tidak dapat // diprediksi sebelumnya (mis. Mengandung hash yang sensitif terhadap waktu) functsomethingwithplaceHolder (t *testing.t) {// Buat instance dari kami objek uji testObj: = baru (mymockedObject) // Mengatur harapan dengan placeholder dalam daftar argumen testobj.on ("dosomething", mock. TargetFuncthatdoessomethingwithObj (testoBj) // menyatakan bahwa harapan telah dipenuhi testobj.assertexpection (t) } // testsomethingelse2 adalah contoh ketiga yang menunjukkan bagaimana Anda dapat menggunakan // metode yang tidak disetel untuk membersihkan penangan dan kemudian menambahkan yang baru. testObj: = baru (mymockedObject) // Mengatur harapan dengan placeholder dalam daftar argumen mockcall: = testobj.on ("dosomething", mock.anything). return (true, nil) // hubungi kode yang kami uji targetFuncthatdoessomethingwithObj (testoBj) // menegaskan bahwa harapan telah dipenuhi testobj.assertexpection (t) // lepaskan pawang sekarang sehingga kita dapat menambahkan yang lain yang lebih diutamakan mockcall.unset () // return false sekarang bukan true testobj.on ("dosomething", mock.anyhing). return (false, nil) testobj.assertexpection (t) }
Untuk informasi lebih lanjut tentang cara menulis kode tiruan, lihat dokumentasi API untuk paket mock
.
Anda dapat menggunakan alat ejekan untuk autogenerasi kode tiruan terhadap antarmuka juga, membuat menggunakan tiruan lebih cepat.
suite
Peringatan
Paket Suite tidak mendukung tes paralel. Lihat #934.
Paket suite
menyediakan fungsionalitas yang mungkin Anda gunakan dari bahasa yang lebih umum berorientasi objek. Dengan itu, Anda dapat membangun suite pengujian sebagai struct, membangun metode pengaturan/robekan dan metode pengujian pada struct Anda, dan menjalankannya dengan 'tes go' sesuai normal.
Contoh suite ditampilkan di bawah ini:
// ImportSImport Dasar ("Pengujian" "github.com/stretch/testify/assert" "github.com/stretchr/testify/suite") // Tentukan suite, dan serap fungsionalitas BASIC-IND-IN - termasuk metode t () yang // Mengembalikan konteks pengujian saat ini exampleTestSuite struct { suite.SuiteVariableThatShouldStartAtFive int}// Make sure that VariableThatShouldStartAtFive is set to five// before each testfunc (suite *ExampleTestSuite) SetupTest() {suite.VariableThatShouldStartAtFive = 5}// All methods that begin with "Test" are run as tests within a // suite.func (suite *exampleTestSuite) testexample () {assert.equal (suite.t (), 5, suite.variableThatshouldstartatfive) } // Agar 'Go Test' untuk menjalankan suite ini, kita perlu membuat // fungsi uji normal dan meneruskan suite kami ke suite.runfunc testExampleTestSuite (t *testing.t) {suite.run (t, baru (baru (baru (t * ExampleTestSuite)) }
Sebagai contoh yang lebih lengkap, menggunakan semua fungsi yang disediakan oleh paket suite, lihat contoh pengujian Contoh kami
Untuk informasi lebih lanjut tentang menulis suite, lihat dokumentasi API untuk paket suite
.
Objek Suite
memiliki metode pernyataan:
// Impor Dasar Impor ("Pengujian" "github.com/stretch/testify/suite") // Tentukan suite, dan serap fungsionalitas dasar bawaan // fungsionalitas dari Testify - termasuk metode penegasan.type exampleTestSuite struct { suite.SuiteVariableThatShouldStartAtFive int}// Make sure that VariableThatShouldStartAtFive is set to five// before each testfunc (suite *ExampleTestSuite) SetupTest() {suite.VariableThatShouldStartAtFive = 5}// All methods that begin with "Test" are run as tests within a // suite.func (suite *exampleTestSuite) testexample () {suite.equal (suite.variableThatshouldstartatfive, 5) } // Agar 'Go Test' untuk menjalankan suite ini, kita perlu membuat // fungsi uji normal dan meneruskan suite kami ke suite.runfunc testExampleTestSuite (t *testing.t) {suite.run (t, baru (baru (baru (t * ExampleTestSuite)) }
Untuk menginstal kesaksian, gunakan go get
:
go get github.com/stretchr/testify
Ini kemudian akan membuat paket berikut tersedia untuk Anda:
github.com/stretchr/testify/assert github.com/stretchr/testify/require github.com/stretchr/testify/mock github.com/stretchr/testify/suite github.com/stretchr/testify/http (deprecated)
Impor Paket testify/assert
ke dalam kode Anda menggunakan templat ini:
paket milik Anda ("pengujian" "github.com/stretch/testify/assert")func testsomething (t *testing.t) {assert.true (t, true," true itu benar! ") }
Untuk memperbarui bersaksi untuk versi terbaru, gunakan go get -u github.com/stretchr/testify
.
Kami saat ini mendukung versi GO utama terbaru dari 1,19 dan seterusnya.
Silakan kirimkan masalah, potong repositori dan kirim permintaan tarik!
Saat mengirimkan masalah, kami meminta Anda memasukkan fungsi pengujian lengkap yang menunjukkan masalah ini. Kredit tambahan bagi mereka yang menggunakan Testify untuk menulis kode uji yang menunjukkannya.
Pembuatan kode digunakan. Cari Code generated with
di bagian atas beberapa file. Jalankan go generate ./...
untuk memperbarui file yang dihasilkan.
Kami juga mengobrol di grup Gophers Slack di saluran #testify
dan #testify-dev
.
Proyek ini dilisensikan berdasarkan ketentuan lisensi MIT.