Unit menulis tes dengan Python: Bagaimana saya memulai? [Tutup]

534

Saya menyelesaikan proyek pertama saya dengan Python dan sekarang tugas saya adalah menulis tes untuk itu.

Karena ini adalah pertama kalinya saya melakukan proyek, ini adalah pertama kalinya saya akan menulis tes untuk itu.

Pertanyaannya adalah, bagaimana saya memulai? Saya sama sekali tidak tahu. Adakah yang bisa mengarahkan saya ke beberapa dokumentasi / tutorial / tautan / buku yang dapat saya gunakan untuk memulai dengan tes menulis (dan saya kira pengujian unit khususnya)

Saran apa pun akan disambut pada topik ini.

pengguna225312
sumber
4
Tidak pernah ada kata terlambat untuk menulis tes jika itu niat Anda. Lebih baik memiliki beberapa daripada tidak sama sekali untuk semua yang mengeluh ...
Asken
1
Berikut ini adalah buku pengembangan yang digerakkan oleh tes yang dikeluarkan secara gratis secara online: chimera.labs.oreilly.com/books/1234000000754/index.html
Will
4
sumber daya yang baik saya menemukan https://www.jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/ . Sebagai pemula untuk python, saya merasa itu bisa dimengerti.
feri
2
Panduan Hitchhiker untuk Python memiliki tinjauan singkat alat untuk pengujian unit: python-guide-pt-br.readthedocs.io/en/latest/writing/tests
Anton Tarasenko
Komentar sebelumnya harus dinilai lebih tinggi, karena panduan ini juga memiliki contoh kode repositori di github.com/kennethreitz/samplemod yang juga merupakan tempat yang tepat untuk memulai.
setempler

Jawaban:

101

Jika Anda baru menggunakan unittests, pendekatan paling sederhana untuk belajar seringkali adalah yang terbaik. Atas dasar itu saya sarankan menggunakan py.testdaripada modul defaultunittest .

Perhatikan dua contoh ini, yang melakukan hal yang sama:

Contoh 1 (belum dikirim):

import unittest

class LearningCase(unittest.TestCase):
    def test_starting_out(self):
        self.assertEqual(1, 1)

def main():
    unittest.main()

if __name__ == "__main__":
    main()

Contoh 2 (pytest):

def test_starting_out():
    assert 1 == 1

Dengan asumsi bahwa kedua file tersebut dinamai test_unittesting.py, bagaimana kita menjalankan tes?

Contoh 1 (belum dikirim):

cd /path/to/dir/
python test_unittesting.py

Contoh 2 (pytest):

cd /path/to/dir/
py.test
Tim McNamara
sumber
7
Saya telah mendengar tentang kesederhanaan py.test di banyak tempat ( docs.python-guide.org/en/latest/writing/tests/#py-test , docs.python.org/3.5/library/unittest.html#module -unittest , jeffknupp.com/blog/2013/12/09/… ) Mengapa unit-testmasih disertakan dalam perpustakaan standar, jika py.testdan nosemenyediakan fungsionalitas yang sama dengan antarmuka yang lebih sederhana? Apakah hanya untuk memberikan kompatibilitas, atau apakah unittestmemiliki beberapa kelebihan yang py.testdan nosetesttidak dapat memberikan?
alpha_989
@ alpha_989 Perpustakaan python standar tidak dimaksudkan untuk berisi alat terbaik yang tersedia. Itulah gunanya PyPI. unittestPaket standar masih cukup bagus. Ini adalah standar yang artinya dijamin bekerja dengan baik. Akhirnya, siapa pun yang menggunakan kode Anda tidak perlu menginstal paket tambahan.
Jeyekomon
72

Buku Python gratis Dive Into Python memiliki bab tentang pengujian unit yang mungkin berguna bagi Anda.

Jika Anda mengikuti praktik modern Anda mungkin harus menulis tes saat Anda sedang menulis proyek Anda, dan tidak menunggu sampai proyek Anda hampir selesai.

Agak terlambat sekarang, tetapi sekarang Anda tahu untuk waktu berikutnya. :)

Mark Byers
sumber
13
Saya masih akan mengatakan bahwa jika Anda ingin kode refactor yang tidak memiliki tes unit, Anda harus terlebih dahulu menulis tes unit untuk itu
Hubert Kario
9
Ya, banyak orang yang datang ke unittests untuk pertama kalinya mendengar apa yang terdengar seperti "well, agak terlambat untuk proyek Anda saat ini" dari tangan lama: bahkan jika bukan itu yang sebenarnya ingin mereka katakan, itulah yang didengar oleh pemula. . Ini seperti pepatah Cina tentang menanam pohon: waktu terbaik untuk memulai tes adalah pada awal proyek; waktu terbaik kedua untuk memulai tes adalah sekarang!
JP
4
Selami tautan Python rusak ... :-(
Scott Skiles
40

Menurut pendapat saya, ada tiga kerangka pengujian python yang bagus untuk dilihat.
unittest - modul hadir standar dengan semua
hidung distribusi python - dapat menjalankan tes unittest, dan memiliki lebih sedikit boilerplate.
pytest - juga menjalankan tes unittest, memiliki pelat yang lebih sedikit, pelaporan yang lebih baik, banyak fitur ekstra keren

Untuk mendapatkan perbandingan yang baik dari semua ini, baca pengantar masing-masing di http://pythontesting.net/start-here .
Ada juga artikel tambahan tentang perlengkapan, dan banyak lagi di sana.

Okken
sumber
35

Dokumen unittest akan menjadi tempat yang baik untuk memulai.

Juga, ini agak terlambat sekarang, tetapi di masa depan tolong pertimbangkan untuk menulis tes unit sebelum atau selama proyek itu sendiri. Dengan begitu Anda dapat menggunakannya untuk menguji saat Anda melanjutkan, dan (secara teori) Anda dapat menggunakannya sebagai tes regresi, untuk memverifikasi bahwa perubahan kode Anda belum merusak kode yang ada. Ini akan memberi Anda manfaat penuh dari menulis test case :)

Justin Ethier
sumber
Itu jika Anda ingin pengembangan berbasis tes, yang bukan hal buruk untuk dimiliki. Dalam kasus saya, saya melihat kode yang ada dan mencoba memahaminya dengan menulis dan mengutak-atik tes untuk lulus, dan itu membuat saya mulai unittest. Setelah saya memahami berbagai hal, saya akan menggunakannya lebih banyak untuk pengembangan, serta meningkatkan jumlah test case untuk setiap unit.
icedwater
27

Unittest hadir dengan perpustakaan standar, tetapi saya akan merekomendasikan Anda nosetests .

" Hidung meluas unittest untuk membuat pengujian lebih mudah. "

Saya juga merekomendasikan Anda pylint

" Menganalisis kode sumber Python mencari bug dan tanda-tanda berkualitas buruk. "

toleransi
sumber
8

Seperti yang sudah dijawab orang lain, sudah terlambat untuk menulis unit test, tetapi belum terlambat. Pertanyaannya adalah apakah kode Anda dapat diuji atau tidak. Memang, tidak mudah untuk menguji kode yang ada, bahkan ada sebuah buku tentang ini: Bekerja Secara Efektif dengan Kode Legacy (lihat poin-poin kunci atau prekursor PDF ).

Sekarang menulis unit tes atau tidak adalah panggilan Anda. Anda hanya perlu menyadari bahwa itu bisa menjadi tugas yang membosankan. Anda mungkin menangani ini untuk mempelajari pengujian unit atau mempertimbangkan untuk menulis tes penerimaan (ujung-ke-ujung) terlebih dahulu, dan mulai menulis tes unit ketika Anda akan mengubah kode atau menambahkan fitur baru ke proyek.

filant
sumber
2
+1 untuk "Bekerja Secara Efektif dengan Kode Warisan". Ini semua tentang kode yang tidak memiliki tes.
David
3

nosetests adalah solusi brilian untuk pengujian unit dengan python. Ini mendukung kedua testcases dan dokumen berdasarkan unittest, dan membuat Anda mulai dengan hanya file konfigurasi sederhana.

Daniel Kluev
sumber
Tautan nosetests Anda sudah usang. Tampaknya lokasi baru adalah: nose.readthedocs.org/en/latest
odigity
1
Sesuai dokumentasi di github dan situs web terbaru, nosedan nose2dalam mode pemeliharaan. Lebih baik untuk memulainya py.testkarena memiliki lebih banyak dukungan
alpha_989