Apa artinya "to stub" dalam pemrograman?

117

Misalnya, apa artinya dalam kutipan ini?

Mengintegrasikan dengan API eksternal hampir merupakan jaminan di aplikasi web modern mana pun. Untuk menguji integrasi tersebut secara efektif, Anda perlu menghentikannya . Rintisan yang baik harus mudah dibuat dan selalu diperbarui dengan respons API aktual dan terkini. Dalam posting ini, kami akan menjelaskan strategi pengujian menggunakan rintisan untuk API eksternal.

janko-m
sumber
9
Sudahkah Anda melihat jawaban yang diterima di Apa itu "Stub"? ?
Nick

Jawaban:

104

Stub adalah pengganti yang dapat dikontrol untuk Ketergantungan yang Ada (atau kolaborator) dalam sistem. Dengan menggunakan stub, Anda dapat menguji kode Anda tanpa berurusan dengan dependensi secara langsung.

Ketergantungan Eksternal - Ketergantungan yang Ada:
Ini adalah objek di sistem Anda yang berinteraksi dengan kode Anda dan di mana Anda tidak memiliki kendali. (Contoh umum adalah sistem file, utas, memori, waktu, dan sebagainya.)

Misalnya dalam kode di bawah ini:

public void Analyze(string filename)
    {
        if(filename.Length<8)
        {
            try
            {
                errorService.LogError("long file entered named:" + filename);
            }
            catch (Exception e)
            {
                mailService.SendEMail("[email protected]", "ErrorOnWebService", "someerror");
            }
        }
    }

Anda ingin menguji metode mailService.SendEMail () , tetapi untuk melakukannya Anda perlu mensimulasikan Exception dalam metode pengujian Anda, jadi Anda hanya perlu membuat objek Fake Stub errorService untuk mensimulasikan hasil yang diinginkan, maka kode pengujian Anda akan menjadi mampu menguji metode mailService.SendEMail () . Seperti yang Anda lihat, Anda perlu mensimulasikan hasil yang berasal dari Dependensi lain yang merupakan objek kelas ErrorService (objek Dependensi yang Ada).

Mustafa Ekici
sumber
9
Inggris? Apa ketergantungan yang sudah ada?
Jwan622
17
@ Jwan622 Dalam istilah awam: Apa pun yang digunakan kode. Mungkin membantu untuk memahami jika Anda membaca ulang dan mengganti "ketergantungan" dengan "kelas" atau "fungsi" atau apa pun (bergantung pada latar belakang Anda). Terkadang menggunakan kelas / fungsi yang ada bukanlah pilihan yang layak dan Anda memerlukan tanda rintisan (misalnya dalam pengujian unit otomatis untuk fungsi yang bergantung pada lingkungan seperti tanggal & waktu sistem saat ini).
MasterMastic
101

Sebuah rintisan , dalam konteks ini, berarti implementasi tiruan.

Artinya, implementasi sederhana dan palsu yang sesuai dengan antarmuka dan akan digunakan untuk pengujian.

Oded
sumber
3
Rincian lebih lanjut disediakan dalam artikel terkenal Mocks Bukankah Stubs oleh Martin Fowler: "Tapi sesering tidak saya melihat objek tiruan dijelaskan dengan buruk. Secara khusus saya melihat mereka sering bingung dengan rintisan - pembantu umum untuk lingkungan pengujian.".
pba
61

Istilah awam, itu dummy data (atau data palsu, data uji ... dll.) Yang dapat Anda gunakan untuk menguji atau mengembangkan kode Anda sampai Anda (atau pihak lain) siap untuk menyajikan / menerima data yang sebenarnya. Ini adalah "Lorem Ipsum" programmer.

Database karyawan belum siap? Buat yang sederhana dengan Jane Doe, John Doe ... dll. API belum siap? Buat yang palsu dengan membuat file .json statis yang berisi data palsu.

Waktu Siang
sumber
1
Terima kasih atas contohnya :)
CapturedTree
8

Dalam konteks ini, kata "rintisan" digunakan sebagai pengganti "tiruan", tetapi demi kejelasan dan ketepatan, penulis seharusnya menggunakan "tiruan", karena "tiruan" adalah semacam rintisan, tetapi untuk pengujian. Untuk menghindari kebingungan lebih lanjut, kita perlu mendefinisikan apa itu rintisan.

Dalam konteks umum, rintisan adalah bagian dari program (biasanya fungsi atau objek) yang merangkum kompleksitas pemanggilan program lain (biasanya terletak di mesin lain, VM, atau proses - tetapi tidak selalu, itu juga bisa lokal. obyek). Karena program sebenarnya yang akan dipanggil biasanya tidak terletak di ruang memori yang sama, pemanggilannya memerlukan banyak operasi seperti pengalamatan, melakukan pemanggilan jarak jauh yang sebenarnya, menyusun / membuat serial data / argumen yang akan diteruskan (dan sama dengan hasil potensial), bahkan mungkin berurusan dengan otentikasi / keamanan, dan sebagainya. Perhatikan bahwa dalam beberapa konteks, stub juga disebut proxy (seperti proxy dinamis di Java).

Tiruan adalah jenis rintisan yang sangat spesifik dan terbatas, karena tiruan adalah pengganti fungsi atau objek lain untuk pengujian. Dalam prakteknya kita sering menggunakan tiruan sebagai program lokal (fungsi atau objek) untuk menggantikan program jarak jauh di lingkungan pengujian. Dalam kasus apapun, tiruan tersebut dapat mensimulasikan perilaku aktual dari program yang diganti dalam konteks terbatas.

Jenis rintisan yang paling terkenal jelas untuk pemrograman terdistribusi, ketika perlu memanggil prosedur jarak jauh ( RPC ) atau objek jarak jauh ( RMI , CORBA ). Sebagian besar framework / library pemrograman terdistribusi mengotomatiskan pembuatan rintisan sehingga Anda tidak perlu menulisnya secara manual. Stub dapat dibuat dari definisi antarmuka, ditulis dengan IDL misalnya (tetapi Anda juga dapat menggunakan bahasa apa pun untuk menentukan antarmuka).

Biasanya, di RPC, RMI, CORBA, dan seterusnya, ada yang membedakan stub sisi klien , yang sebagian besar menangani penyusunan / serialisasi argumen dan melakukan pemanggilan jarak jauh, dan stub sisi server , yang sebagian besar menangani unmarshaling / deserializing argumen dan benar-benar menjalankan fungsi / metode jarak jauh. Jelas, stub klien terletak di sisi klien, sedangkan stub sever (sering disebut kerangka) terletak di sisi server.

Menulis rintisan yang efisien dan umum yang baik menjadi cukup menantang saat berurusan dengan referensi objek. Sebagian besar kerangka kerja objek terdistribusi seperti RMI dan CORBA menangani referensi objek terdistribusi, tetapi itu adalah sesuatu yang dihindari sebagian besar pemrogram di lingkungan REST misalnya. Biasanya, dalam lingkungan REST, pemrogram JavaScript membuat fungsi rintisan sederhana untuk merangkum pemanggilan AJAX (serialisasi objek didukung oleh JSON.parsedan JSON.stringify). Proyek Swagger Codegen menyediakan dukungan ekstensif untuk secara otomatis menghasilkan rintisan REST dalam berbagai bahasa.

Renaud Pawlak
sumber
4

Stub adalah definisi fungsi yang memiliki nama fungsi yang benar, jumlah parameter yang benar, dan menghasilkan hasil dummy dari jenis yang benar.

Ini membantu untuk menulis tes dan berfungsi sebagai semacam perancah untuk memungkinkan menjalankan contoh bahkan sebelum desain fungsi selesai

Lorem Ipsum Dolor
sumber
3

Anda juga memiliki kerangka kerja pengujian yang sangat bagus untuk membuat rintisan seperti itu. Salah satu pilihan saya adalah Mockito Ada juga EasyMock dan lainnya ... Tapi Mockito hebat, Anda harus membacanya - paket yang sangat elegan dan kuat

Julias
sumber
3

Frasa ini hampir pasti analogi dengan fase dalam konstruksi rumah - "mematikan" pipa ledeng. Selama konstruksi, sementara dindingnya masih terbuka, pipa yang kasar dipasang. Hal ini diperlukan agar konstruksi dapat dilanjutkan. Kemudian, ketika segala sesuatu di sekitarnya sudah cukup siap, seseorang kembali dan menambahkan keran dan toilet dan barang-barang produk akhir yang sebenarnya. (Lihat misalnya Cara Memasang Stub-Out Plumbing .)

Saat Anda "menghentikan" suatu fungsi dalam pemrograman, Anda membangunnya cukup banyak untuk dikerjakan (untuk pengujian atau untuk menulis kode lain). Kemudian, Anda kembali lagi nanti dan menggantinya dengan implementasi penuh.

mattdm.dll
sumber
0

RPC Stubs

  • Pada dasarnya, rintisan sisi klien adalah prosedur yang dilihat klien seolah-olah itu adalah prosedur server yang dapat dipanggil.
  • Rintisan sisi server melihat ke server seolah-olah itu adalah klien yang menelepon.
  • Program klien mengira sedang memanggil server; sebenarnya, itu memanggil rintisan klien.
  • Program server mengira itu dipanggil oleh klien; sebenarnya, ini disebut dengan rintisan server.
  • Stubs mengirim pesan satu sama lain untuk membuat RPC terjadi.

Sumber

Zain Qasmi
sumber
0

"Mematikan suatu fungsi berarti Anda hanya menulis secukupnya untuk menunjukkan bahwa fungsi itu dipanggil, meninggalkan detailnya nanti saat Anda punya lebih banyak waktu."

Dari: SAMS Ajari diri Anda C ++, Jesse Liberty dan Bradley Jones

salinger
sumber