Lebih jauh 
Pengujian perangkat lunak sistematis, terutama di komunitas Python, sering diabaikan atau dilakukan dengan cara yang khusus. Banyak programmer Python sama sekali tidak menyadari keberadaan pytest. Brian Ocken mengambil kesulitan untuk membuktikan bahwa pengujian perangkat lunak dengan pytest mudah, alami dan bahkan menarik.
Dmitry Zinoviev
Penulis Data Essentials Ilmu dalam Python

Contoh-contoh dalam buku ini ditulis menggunakan Python 3.6 dan pytest 3.2. pytest 3.2 mendukung Python 2.6, 2.7, dan Python 3.3+.
Kode sumber untuk proyek Tugas, serta untuk semua tes yang ditunjukkan dalam buku ini, tersedia di tautan di halaman web buku di pragprog.com . Anda tidak perlu mengunduh kode sumber untuk memahami kode uji; kode uji disajikan dalam bentuk yang mudah dalam contoh. Tetapi untuk mengikuti tugas-tugas proyek, atau mengadaptasi contoh uji untuk menguji proyek Anda sendiri (tangan Anda tidak terikat!), Anda harus pergi ke halaman web buku dan mengunduh karya. Di sana, di halaman web buku, ada tautan untuk pesan errata dan forum diskusi .
Di bawah spoiler adalah daftar artikel dalam seri ini.
Ucapan Terima Kasih
Pertama saya harus berterima kasih kepada Michelle - istri dan sahabat saya. Sangat disayangkan bahwa Anda tidak melihat ruang di mana saya menulis. Alih-alih sebuah meja, saya memiliki meja makan ek persegi dari kayu antik di mana ada cukup ruang untuk meletakkan kertas. Rak buku kaca yang indah dengan mainan ruang retro saya yang telah kami kumpulkan selama bertahun-tahun, serta buku-buku teknis, papan sirkuit dan bola juggling. Kotak aluminium antik untuk menyimpan kertas ke atas diisi dengan catatan, kabel dan bahkan stiker yang tersisa untuk roket. Satu dinding ditutupi dengan beludru, yang kami beli bertahun-tahun yang lalu, ketika toko kain memutuskan untuk menutup selamanya. Kain harus menenangkan gema ketika saya merekam podcast.
Saya suka menulis di sini bukan hanya karena nyaman dan konsisten dengan dunia batin saya, tetapi juga karena itu adalah ruang yang dibuat Michel dengan saya dan untuk saya. Dia dan saya selalu menjadi tim, dan dia sangat mendukung ide-ide gila saya untuk menulis blog, memulai satu atau dua podcast, dan sekarang, lebih dari setahun terakhir, tulis buku ini. Dia memastikan saya punya waktu dan ruang untuk menulis. Ketika saya lelah dan memikirkan apakah saya masih memiliki kekuatan untuk menulis, dia menawarkan saya untuk melanjutkan selama dua puluh menit dan melihat bagaimana perasaan saya saat itu, dia melakukan hal yang sama ketika dia membantu saya nanti. malam kuliah. Aku benar-benar tidak bisa melakukannya tanpanya.
Saya juga memiliki dua anak perempuan yang luar biasa menakjubkan, penasaran, dan cemerlang, Gabriella dan Sofia, yang merupakan dua penggemar terbesar saya. Ella menawarkan semua orang yang berbicara tentang pemrograman untuk mendengarkan podcast-ku, dan Phia memamerkan stiker untuk kode tes di ranselnya, yang dia ambil di kelas dua.
Ada begitu banyak orang untuk berterima kasih.
Editor saya, Katherine Dvorak, membantu saya mengumpulkan banyak ide dan tema acak dalam perkembangan yang kohesif, dan ini adalah alasan mengapa ini adalah sebuah buku dan bukan serangkaian posting blog yang disatukan. Saya masuk ke proyek ini sebagai blogger, dan terlalu terikat pada banyak tajuk utama, subpos, dan daftar item, dan Katie dengan sabar membimbing saya sehingga saya bisa menjadi penulis yang lebih baik.
Terima kasih kepada Suzanne Davidson Palatinate, Andy Hunt dan seluruh Rak Buku Pragmatis yang telah memberi saya kesempatan.
Peninjau teknis membuat saya jujur dalam pytest, tetapi juga dalam gaya Python, dan merupakan alasan bahwa contoh kode mengikuti PEP 8. Terima kasih kepada Oliver Bestwalter, Florian Bruhin, Floris Bruinog, Mark Goody, Peter Hampton, Dave Hunt, Al Crinker, Lokesh Kumaru Makani, Bruno Oliveira, Ronnie Pfannschmidt, Rafael Pierzine, Luciano Ramallo, Frank Ruiz dan Dmitry Zinoviev. Banyak dari daftar ini juga pengembang kernel pytest dan / atau mendukung plugin pytest yang luar biasa.
Terima kasih khusus kepada Luciano. Setelah menulis buku ini, saya mengirim empat bab pertama ke beberapa pengulas. Luciano adalah salah satunya, dan ulasannya adalah yang paling sulit dibaca. Saya tidak berpikir bahwa saya mengikuti semua nasihatnya, tetapi karena sambutannya, saya merevisi dan menulis ulang sebagian besar dari tiga bab pertama dan mengubah sesuatu dalam sisa buku ini.
Terima kasih kepada seluruh tim pytest-dev untuk membuat alat pengujian yang keren. Terima kasih kepada Oliver Bestwalter, Florian Bruhin, Floris Bruinoohe, Dave Hunt, Holger Kreckel, Bruno Oliveira, Ronnie Pfannschmidt, Rafael Pierzine dan banyak lainnya yang telah menjawab pertanyaan saya tentang kehidupan selama bertahun-tahun.
Dan yang tak kalah pentingnya, saya perlu berterima kasih kepada orang-orang yang berterima kasih kepada saya. Mereka mengambil kesempatan untuk memberi tahu saya melalui email bahwa pekerjaan saya menghemat waktu mereka dan membuat pekerjaan lebih mudah. Ini keren dan membuatku senang! Terima kasih
Brian okken
september 2017
Kata Pengantar
Penggunaan Python meningkat tidak hanya dalam pengembangan perangkat lunak, tetapi juga di berbagai bidang seperti analisis data, penelitian, pengujian dan pengukuran, serta di industri lain. Pengembangan Python di banyak bidang penting juga disertai dengan keinginan untuk melakukan tes perangkat lunak dengan benar, efisien dan efektif untuk memastikan bahwa program bekerja dengan benar dan memberikan hasil yang benar. Selain itu, semakin banyak proyek perangkat lunak menjangkau integrasi berkelanjutan dan mencakup fase pengujian otomatis karena siklus rilis diperpendek dan pengujian manual terhadap proyek yang semakin kompleks sama sekali tidak layak. Tim harus dapat mempercayai pengujian yang dilakukan oleh server integrasi berkesinambungan yang memberi tahu mereka jika mereka dapat mempercayai perangkat lunak mereka cukup untuk merilisnya.
Masukkan pytest.
Apa itu pytest?
Alat pengujian Python yang andal, pytest dapat digunakan untuk semua jenis dan tingkat pengujian perangkat lunak. pytest dapat digunakan oleh tim pengembangan, tim QA, kelompok pengujian independen, individu yang berlatih TDD, dan proyek sumber terbuka. Bahkan, proyek-proyek di internet telah beralih dari unittest atau nose ke pytest , termasuk Mozilla dan Dropbox. Mengapa Karena pytest menawarkan fitur-fitur canggih seperti menulis ulang "menegaskan", model plugin pihak ketiga dan model fixture yang kuat namun sederhana yang tidak tertandingi dalam kerangka pengujian lainnya.
pytest adalah platform pengujian perangkat lunak, yang berarti pytest adalah program baris perintah. Alat yang secara otomatis menemukan tes tertulis, menjalankan tes, dan menulis laporan dengan hasilnya. Ini memiliki perpustakaan lotion yang dapat Anda gunakan dalam tes untuk membantu Anda menguji lebih efisien. Itu dapat diperluas dengan menulis plugin Anda sendiri atau menginstal yang pihak ketiga. Ini dapat digunakan untuk menguji distribusi Python. Dan itu terintegrasi dengan alat-alat lain seperti integrasi berkelanjutan dan otomatisasi web.
Berikut adalah beberapa alasan mengapa pytest menonjol di antara banyak tes sistem terintegrasi lainnya:
- Tes sederhana mudah ditulis di pytest.
- Tes yang kompleks bahkan lebih mudah untuk ditulis.
- Tes mudah dibaca.
- Tes mudah dibaca. (Sangat penting bahwa ini diindikasikan dua kali.)
- Anda dapat memulai dalam hitungan detik.
assert
digunakan untuk gagal dalam tes, bukan self.assertEqual()
atau self.assertLessThan()
. Tegas saja!- Anda dapat menggunakan pytest untuk menjalankan tes tertulis untuk unittest atau hidung.
pytest dikembangkan secara aktif dan didukung oleh komunitas yang bersemangat dan berkembang. Ini sangat diperluas dan fleksibel sehingga cocok dengan alur kerja Anda. Dan karena itu diinstal secara terpisah dari versi Python Anda, Anda dapat menggunakan versi terbaru yang sama dari pytest pada legacy Python 2 (2.6 dan lebih tinggi) dan Python 3 (3.3 dan lebih tinggi).
Mempelajari pytest saat menguji contoh aplikasi
Apakah Anda ingin belajar pytest dengan menguji contoh-contoh konyol yang tidak akan pernah Anda lihat dalam kehidupan nyata? Saya juga. Kami tidak akan melakukan ini dalam buku ini. Sebagai gantinya, kami akan menulis tes untuk proyek yang, saya harap, memiliki banyak kesamaan dengan aplikasi yang akan Anda uji setelah membaca buku ini.
Proyek Tugas
Aplikasi yang akan kita lihat disebut Tugas. Tugas adalah aplikasi pelacakan tugas minimal dengan antarmuka baris perintah. Ini memiliki cukup kesamaan dengan banyak jenis aplikasi lain, yang, saya harap, Anda dapat dengan mudah melihat bagaimana konsep pengujian yang Anda pelajari ketika mengembangkan tes terhadap masalah dapat diterapkan pada proyek Anda sekarang dan di masa depan.
Meskipun Tugas memiliki antarmuka baris perintah (CLI), CLI berinteraksi dengan sisa kode melalui antarmuka pemrograman aplikasi (API). API adalah antarmuka tempat kami mengarahkan sebagian besar pengujian kami. API berinteraksi dengan lapisan manajemen basis data, yang berinteraksi dengan basis data dokumen - MongoDB atau TinyDB . Jenis basis data dikonfigurasikan ketika basis data diinisialisasi. Sebelum berfokus pada API, mari kita lihat sendiri tugas-tugasnya, alat baris perintah yang menyediakan antarmuka pengguna untuk tugas-tugas.
Berikut ini contoh sesi:
$ tasks add 'do something' --owner Brian $ tasks add 'do something else' $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 False do something else $ tasks update 2 --owner Brian $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 Brian False do something else $ tasks update 1 --done True $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian True do something 2 Brian False do something else $ tasks delete 1 $ tasks list ID owner done summary -- ----- ---- ------- 2 Brian False do something else $
Catatan Penerjemah: Dalam hal menggunakan platform Windows, saya mengalami beberapa masalah saat menguji sesi ini.
- Folder harus dibuat untuk database TinyDB bernama
tasks_db
di folder pengguna Anda. Sebagai contoh c:\Users\User_1\tasks_db\
- Gunakan tanda kutip bukan apostrof. Kalau tidak, kami mendapatkan kesalahan seperti itu.
$ tugas tambahkan 'lakukan sesuatu yang lain'
Penggunaan: tugas menambahkan [OPSI] RINGKASAN
Kesalahan: Mendapat argumen tambahan yang tidak terduga (ada yang lain ')
Ini bukan aplikasi manajemen tugas yang paling sulit, tetapi cukup kompleks untuk digunakan untuk mempelajari pengujian.
Strategi pengujian
Meskipun pytest cocok untuk Pengujian Unit, Pengujian Integrasi, Pengujian Sistem atau pengujian ujung-ke-ujung dan pengujian fungsional, strategi pengujian proyek Tugas terutama berfokus pada pengujian fungsional subkutan. Berikut ini adalah beberapa definisi yang berguna:
- Uji unit : Tes yang menguji sepotong kecil kode, seperti fungsi atau kelas, terpisah dari bagian lain sistem. Saya meninjau tes di Bab 1, Memulai dengan pytest, di halaman 1, untuk melakukan tes unit. Struktur data tugas.
- Pengujian Integrasi : Tes yang menguji sepotong kode yang lebih besar dapat mencakup beberapa kelas atau subsistem. Sebagian besar label yang digunakan untuk beberapa pengujian lebih besar dari uji unit, tetapi lebih kecil dari uji sistem.
- Uji sistem (end-to-end) : tes yang menguji seluruh sistem yang diuji dalam lingkungan sedekat mungkin dengan lingkungan pengguna akhir.
- Pengujian fungsional : Tes yang menguji satu bagian fungsionalitas sistem. Tes yang menguji seberapa baik kita menambah, menghapus, atau memperbarui item tugas dalam Tugas adalah tes fungsional.
- Tes subkutan : Tes yang dijalankan bukan untuk antarmuka pengguna akhir, tetapi untuk antarmuka yang terletak tepat di bawah permukaan. Karena sebagian besar tes dalam buku ini diuji pada tingkat API, bukan CLI, mereka memenuhi syarat sebagai tes Subkutan.
Bagaimana buku ini disusun?
Dalam Bab 1, “Memulai dengan pytest” di halaman 1, Anda menginstal pytest dan bersiap untuk menggunakannya. Kemudian Anda mengambil satu bagian dari proyek Tugas - struktur data yang mewakili satu tugas (nameduple disebut Tugas), dan menggunakannya untuk menguji contoh. Anda akan belajar cara menjalankan pytest dengan beberapa file uji. Anda akan melihat banyak opsi baris perintah populer dan sangat berguna untuk pytest, seperti kemampuan untuk memulai kembali kegagalan pengujian, menghentikan eksekusi setelah kegagalan pertama, mengontrol jejak tumpukan dan versi multi-halaman dari uji coba, dan banyak lagi.
Dalam bab 2, "Membuat Fungsi Uji," pada halaman 23, Anda menginstal Tugas secara lokal dengan pip dan melihat bagaimana menyusun tes dalam proyek Python. Anda harus melakukan ini untuk mulai menulis tes untuk aplikasi nyata. Semua contoh dalam bab ini menjalankan tes untuk aplikasi yang diinstal, termasuk menulis ke database. Fungsi tes yang sebenarnya adalah fokus dari bab ini dan Anda akan belajar bagaimana menggunakan assert
secara efektif dalam tes. Anda juga akan belajar tentang spidol. Sebuah fungsi yang memungkinkan Anda untuk menandai banyak tes yang akan berjalan secara bersamaan, menandai tes yang akan dilewati, atau memberitahu pytest bahwa kita sudah tahu bahwa beberapa tes akan gagal. Saya akan berbicara tentang cara menjalankan hanya beberapa tes, tidak hanya dengan spidol, tetapi juga dengan menyusun kode tes kami ke dalam direktori, modul, dan kelas, dan bagaimana menjalankan subset tes ini.
Tidak semua kode tes dimasukkan dalam fungsi tes. Dalam bab 3, “Perlengkapan terbaik”, di halaman 49, Anda akan belajar cara memasukkan data pengujian ke dalam perlengkapan pengujian, serta mengonfigurasi dan memecahkan kode. Mengatur keadaan suatu sistem (atau subsistem atau unit individu) adalah bagian penting dari pengujian perangkat lunak. Anda akan mempelajari aspek ini dari perlengkapan pytest untuk membantu menginisialisasi database proyek Tugas dan pra-mengisi data tes untuk beberapa tes. Fixture adalah bagian yang sangat kuat dari pytest, dan Anda akan belajar bagaimana menggunakannya secara efektif untuk mengurangi duplikasi kode tes lebih lanjut dan membantu membuat kode uji Anda sangat mudah dibaca dan dipelihara. Perlengkapan Pytest juga dapat diukur, mirip dengan fungsi pengujian, dan Anda akan menggunakan fungsi ini untuk dapat menjalankan semua pengujian Anda dengan TinyDB dan MongoDB, bagian server basis data yang didukung oleh Tugas.
Dalam bab 4, "Perlengkapan Bawaan", di halaman 71, Anda akan melihat beberapa perlengkapan bawaan yang disediakan oleh pytest. Anda akan belajar bagaimana perlengkapan bawaan terbesar dapat melacak direktori dan file sementara untuk Anda, membantu Anda memeriksa output dari kode uji, menggunakan patch monyet, memeriksa peringatan, dan banyak lagi.
Dalam bab 5, “Plugin,” di halaman 95, Anda akan belajar cara menambahkan opsi baris perintah ke pytest, mengubah output pytest, dan berbagi pengaturan pytest, termasuk perlengkapan, dengan pengguna lain melalui tulisan, pengemasan dan distribusi ( mendistribusikan) plugin sendiri. Plugin yang kami kembangkan di bab ini digunakan untuk membuat kesalahan pengujian yang kami lihat saat menguji tugas, sedikit lebih baik. Anda juga akan belajar cara menguji Plugins uji dengan benar. Meta macam apa? Dan untuk berjaga-jaga, jika Anda tidak cukup terinspirasi oleh bab ini untuk menulis plugin Anda sendiri, saya mengambil banyak plugin yang bagus untuk menunjukkan apa yang mungkin dalam Lampiran 3, “Plugin Sampler Pack,” di halaman 163.
Berbicara tentang penyesuaian, dalam bab 6, "Konfigurasi," pada halaman 113, Anda akan belajar cara mengkonfigurasi peluncuran pytest default untuk proyek Anda menggunakan file konfigurasi. Dengan file pytest.ini , Anda dapat melakukan hal-hal seperti menyimpan parameter baris perintah sehingga Anda tidak harus memasukkannya setiap saat, memberi tahu pytest untuk tidak melihat direktori spesifik untuk file uji, tentukan versi minimum dari pytest yang Anda miliki. tes, dan banyak lagi. Item konfigurasi ini dapat ditempatkan di tox.ini atau setup.cfg .
Dalam bab terakhir, Bab 7, menggunakan pytest dengan alat lain, pada halaman 125, Anda akan melihat bagaimana Anda dapat mengambil pytest yang sudah kuat dan membebani pengujian Anda dengan alat tambahan. Anda akan menjalankan proyek Tugas pada beberapa versi Python dengan tox. Anda akan menguji Tugas CLI tanpa menjalankan sistem dengan mock. Anda akan menggunakan coverage.py untuk memeriksa apakah kode sumber proyek tugas sedang diuji. Anda akan menggunakan Jenkins untuk menjalankan suite tes dan menampilkan hasil dari waktu ke waktu. Dan akhirnya, Anda akan melihat bagaimana pytest dapat digunakan untuk menjalankan tes unittest, serta untuk bertukar perlengkapan gaya pytest dengan tes berbasis unittest.
Apa yang perlu Anda ketahui
Python
Anda tidak perlu menjadi guru Python. Contoh tidak melakukan hal yang supranatural atau aneh.
pip
Anda harus menggunakan pip untuk menginstal plugin pytest dan pytest itu sendiri. Jika Anda ingin memutakhirkan pip, lihat Lampiran 2, pip, di halaman 159.
Baris perintah
Saya menulis buku ini dan menangkap contoh output menggunakan bash di laptop Mac. Namun, satu-satunya perintah yang saya gunakan dalam bash adalah cd untuk pergi ke direktori tertentu dan tentu saja pytest. Karena cd ada di Windows cmd.exe dan di semua shell unix yang saya tahu, semua contoh harus tersedia untuk dijalankan di aplikasi terminal apa pun yang Anda putuskan untuk digunakan.
Itu saja. Anda tidak perlu menjadi ahli pemrograman untuk mulai menulis tes otomatis dengan pytest.
Sampel Kode dan Sumber Daya Internet
Contoh-contoh dalam buku ini ditulis menggunakan Python 3.6 dan pytest 3.2. pytest 3.2 mendukung Python 2.6, 2.7, dan Python 3.3+.
Kode sumber untuk proyek Tugas, serta untuk semua tes yang ditunjukkan dalam buku ini, tersedia di tautan di halaman web buku di pragprog.com . Anda tidak perlu mengunduh kode sumber untuk memahami kode uji; kode uji disajikan dalam bentuk yang mudah dalam contoh. Tetapi untuk mengikuti tugas-tugas proyek, atau mengadaptasi contoh pengujian untuk menguji proyek Anda sendiri (tangan Anda tidak terikat!), Anda harus pergi ke halaman web buku untuk mengunduh karya. Di sana, di halaman web buku, ada tautan ke pos errata dan forum diskusi .
Saya telah pemrograman selama lebih dari dua puluh lima tahun, dan tidak ada yang membuat saya suka menulis kode tes sebanyak yang dilakukan pytest. Saya harap Anda belajar banyak dari buku ini, dan saya berharap bahwa pada akhirnya Anda akan menyukai kode tes seperti saya.
Lebih jauh 