Jawaban:
Keduanya berharga. Saya menggunakan kedua doctest dan hidung mengambil tempat unittest. Saya menggunakan doctest untuk kasus-kasus di mana tes ini memberikan contoh penggunaan yang sebenarnya berguna sebagai dokumentasi. Secara umum saya tidak membuat tes ini komprehensif, hanya bertujuan untuk informatif. Saya secara efektif menggunakan doctest secara terbalik: bukan untuk menguji kode saya benar berdasarkan pada doctest saya, tetapi untuk memeriksa bahwa dokumentasi saya benar berdasarkan pada kode.
Alasannya adalah bahwa saya menemukan dokumen komprehensif akan mengacaukan dokumentasi Anda terlalu banyak, sehingga Anda akan berakhir dengan dokumen yang tidak dapat digunakan, atau pengujian yang tidak lengkap.
Untuk benar-benar menguji kode , tujuannya adalah untuk menguji secara menyeluruh setiap kasus, daripada menggambarkan apa yang dilakukan dengan contoh, yang merupakan tujuan berbeda yang menurut saya lebih baik dipenuhi oleh kerangka kerja lain.
Saya menggunakan unittest hampir secara eksklusif.
Sekali-sekali, saya akan meletakkan beberapa barang di docstring yang dapat digunakan oleh doctest.
95% dari kasus uji adalah yang paling bebas.
Mengapa? Saya suka menyimpan dokumen agak lebih pendek dan lebih tepatnya. Kadang-kadang kasus uji membantu memperjelas dokumen. Sebagian besar waktu, kasus uji aplikasi terlalu panjang untuk didokumentasikan.
docstring
dan apa yang tidak. Saya sebenarnya suka docstring dalam istilah yang secara eksplisit menunjukkan cara menggunakan antarmuka, tetapi menggunakannya baik untuk itu dan pengujian unit mungkin tidak cocok.
Keuntungan lain dari doctesting adalah Anda bisa memastikan kode Anda melakukan apa yang menurut dokumentasi Anda. Setelah beberapa saat, perubahan perangkat lunak dapat membuat dokumentasi dan kode Anda melakukan hal yang berbeda. :-)
Saya bekerja sebagai ahli bioinformatika, dan sebagian besar kode yang saya tulis adalah skrip "satu kali, satu tugas", kode yang akan dijalankan hanya sekali atau dua kali dan yang menjalankan satu tugas khusus.
Dalam situasi ini, menulis unittests besar mungkin berlebihan, dan doctests adalah kompromi yang bermanfaat. Mereka lebih cepat untuk menulis, dan karena mereka biasanya dimasukkan dalam kode, mereka memungkinkan untuk selalu mengawasi bagaimana kode harus berperilaku, tanpa harus membuka file lain. Itu berguna saat menulis skrip kecil.
Juga, dokumen berguna ketika Anda harus menyerahkan skrip Anda kepada seorang peneliti yang tidak ahli dalam pemrograman. Beberapa orang merasa sangat sulit untuk memahami bagaimana unittests disusun; di sisi lain, dokumen adalah contoh sederhana penggunaan, sehingga orang dapat menyalin dan menempelkannya untuk melihat cara menggunakannya.
Jadi, untuk melanjutkan jawaban saya: dokumen berguna ketika Anda harus menulis skrip kecil, dan ketika Anda harus meneruskannya atau menunjukkannya kepada peneliti yang bukan ilmuwan komputer.
Jika Anda baru memulai dengan ide pengujian unit, saya akan memulainya doctest
karena sangat mudah digunakan. Ini juga secara alami menyediakan beberapa tingkat dokumentasi. Dan untuk pengujian yang lebih komprehensif doctest
, Anda dapat menempatkan tes dalam file eksternal sehingga tidak mengacaukan dokumentasi Anda.
Saya menyarankan unittest
jika Anda berasal dari latar belakang telah menggunakan JUnit atau yang serupa, di mana Anda ingin dapat menulis unit test pada umumnya dengan cara yang sama seperti yang Anda lakukan di tempat lain.
doctest
untuk mulai dengan), tetapi akhirnya menyesalinya. Untuk kasus uji non-sepele, saya kehilangan penyorotan sintaksis dan penyelesaian otomatis editor saya. Ketika tes berada di file terpisah, saya tidak bisa lagi menjalankannya langsung dari editor - saya harus mengubah konteks kembali ke file sumber yang sesuai setiap waktu.
Saya menggunakan unittest secara eksklusif; Saya pikir doctest mengacaukan modul utama terlalu banyak. Ini mungkin ada hubungannya dengan menulis tes menyeluruh.
Menggunakan keduanya adalah opsi yang valid dan agak sederhana. The doctest
modul menyediakan DoctTestSuite
danDocFileSuite
metode yang membuat testsuite unittest-kompatibel dari modul atau file, masing-masing.
Jadi saya menggunakan keduanya dan biasanya menggunakan doctest untuk tes sederhana dengan fungsi yang memerlukan sedikit atau tanpa pengaturan (tipe sederhana untuk argumen). Saya benar-benar berpikir beberapa tes doctest membantu mendokumentasikan fungsi, daripada mengurangi darinya.
Tetapi untuk kasus yang lebih rumit, dan untuk serangkaian kasus uji yang lebih komprehensif, saya menggunakan unittest yang memberikan lebih banyak kontrol dan fleksibilitas.
Saya tidak menggunakan doctest sebagai pengganti unittest. Meskipun sedikit tumpang tindih, kedua modul tidak memiliki fungsi yang sama:
Saya menggunakan unittest
sebagai kerangka kerja pengujian unit, yang berarti membantu saya menentukan dengan cepat dampak dari modifikasi apa pun pada sisa kode.
Saya menggunakan doctest
sebagai jaminan bahwa komentar (yaitu docstrings) masih relevan dengan versi kode saat ini.
Manfaat yang didokumentasikan secara luas dari pengembangan yang didorong oleh tes yang saya dapatkan unittest
. doctest
memecahkan bahaya yang jauh lebih halus karena komentar yang ketinggalan zaman menyesatkan pemeliharaan kode.
Saya hampir tidak pernah menggunakan dokumen. Saya ingin kode saya menjadi dokumentasi diri, dan dokumen menyediakan dokumentasi kepada pengguna. IMO menambahkan ratusan baris tes ke modul membuat dokumen jauh lebih mudah dibaca. Saya juga menemukan tes unit lebih mudah untuk dimodifikasi saat diperlukan.
Doctest
beberapa kali dapat menyebabkan hasil yang salah. Terutama ketika output berisi urutan melarikan diri. Sebagai contoh
def convert():
"""
>>> convert()
'\xe0\xa4\x95'
"""
a = '\xe0\xa4\x95'
return a
import doctest
doctest.testmod()
memberi
**********************************************************************
File "hindi.py", line 3, in __main__.convert
Failed example:
convert()
Expected:
'क'
Got:
'\xe0\xa4\x95'
**********************************************************************
1 items had failures:
1 of 1 in __main__.convert
***Test Failed*** 1 failures.
Juga tidak memeriksa jenis output. Itu hanya membandingkan string output. Misalnya ia telah membuat beberapa tipe rasional yang mencetak seperti integer jika bilangan bulat. Maka anggaplah Anda memiliki fungsi yang mengembalikan rasional. Jadi, doctest tidak akan membedakan jika outputnya bilangan bulat rasional atau bilangan bulat.
r""" ... """
) untuk memperbaiki masalah pertama.
'\\xe0\\xa4\\x95'
di docstring Anda.
Saya lebih suka sistem berbasis penemuan ("hidung" dan "py.test", menggunakan mantan saat ini).
doctest bagus ketika tes juga baik sebagai dokumentasi, jika tidak mereka cenderung terlalu banyak mengacaukan kode.