Untuk memberikan contoh yang sedikit dibuat-buat, katakanlah saya ingin menguji bahwa suatu fungsi mengembalikan dua angka, dan yang pertama lebih kecil dari yang kedua:
def test_length():
result = my_function()
assert len(result) == 2
def test_order()
a, b = my_function()
assert a < b
Di sini, jika test_length
gagal, maka test_order
akan gagal juga. Apakah ini praktik terbaik untuk menulis test_length
, atau melewatkannya?
EDIT: perhatikan bahwa dalam situasi ini, kedua tes sebagian besar independen satu sama lain, masing-masing dapat dijalankan secara terpisah, atau mereka dapat dijalankan dalam urutan terbalik, ini tidak masalah. Jadi tidak ada satu pun dari pertanyaan-pertanyaan ini sebelumnya
- Bagaimana saya harus menguji fungsionalitas fungsi yang menggunakan fungsi lain di dalamnya?
- Apakah saya perlu tes unit jika saya sudah memiliki tes integrasi?
- Bagaimana menyusun tes di mana satu tes adalah pengaturan tes lain?
- Bagaimana mengelola ketergantungan keberhasilan antara unit test
adalah duplikat dari yang di atas.
unit-testing
Mihai
sumber
sumber
A
panggilanB
dan mengembalikan hasil yang sama, haruskah Anda menguji keduanyaA
danB
". Ini lebih tentang tes yang tumpang tindih daripada fungsi yang diuji. (Meskipun itu membingungkan karena mereka saat ini dinamai).lambda: type('', (), {'__len__': lambda self: 2})()
akan melewati yang pertama, tetapi bukan yang kedua.Jawaban:
Mungkin ada nilai, tetapi ini sedikit bau. Entah tes Anda tidak terisolasi dengan baik (karena
test_order
benar-benar menguji dua hal) atau Anda terlalu dogmatis dalam pengujian Anda (membuat dua tes menguji hal logis yang sama).Dalam contoh ini, saya akan menggabungkan dua tes bersama. Ya, itu berarti Anda memiliki beberapa penegasan. Sangat buruk. Anda masih menguji satu hal - hasil dari fungsi. Terkadang di dunia nyata itu berarti melakukan dua pemeriksaan.
sumber
my_function
tidak mengembalikan tepat dua nilai, tanpa ada penegasan - karena tugas akan menghasilkan pengecualian. Jadi sebenarnya tidak perlu menggunakan beberapa konfirmasi dan dua cek untuk menguji hal yang sama.Tes Anda harus eksplisit. Itu tidak sepenuhnya disimpulkan bahwa jika text_length gagal test_order gagal.
Saya tidak yakin bagaimana hasilnya dalam Python yang telah Anda posting, tetapi jika
len(result)
3 maka yang pertama akan gagal tetapi yang kedua mungkin lewat (dan jika tidak dalam Python, maka dalam bahasa seperti JavaScript pasti).Seperti yang Anda katakan, Anda ingin menguji bahwa fungsi mengembalikan dua angka dan semuanya berurutan. Dua tes itu.
sumber
It's not completely inferred that if text_length fails test_order fails
- dalam Python, itu, akan memberi Anda pengecualian.test_length
menyiratkan kegagalantest_order
. Fakta bahwa sepasang tes serupa yang ditulis dalam Javascript tidak akan berperilaku sama dengan dua tes python ini agak tidak relevan.Satu-satunya nilai di
test_length
sini adalah, jika semuanya lewat, keberadaannya menunjukkan bahwa "panjang" telah diuji.Jadi kedua tes ini tidak perlu dilakukan. Simpan saja
test_order
tetapi pertimbangkan untuk mengganti namatest_length_and_order
.Kebetulan, saya menemukan penggunaan nama yang dimulai dengan
test
sedikit canggung. Saya penganjur nama tes yang kuat yang benar-benar menggambarkan kondisi yang Anda nyatakan.sumber
test
kutil berarti bagi kerangka uji Python. Yang tentu saja tidak perlu mengubah apakah Anda penggemar, tetapi tidak mengubah bobot argumen yang diperlukan untuk menghentikan seseorang menggunakannya ;-)test_that_
, sepertitest_that_return_values_are_in_order
dan sebagainya. Mungkin versi masa depan kerangka uji akan mengatasi persyaratan ini entah bagaimana.Saya akan membiarkan tes-tes ini terpisah jika seperti itulah perkembangan mereka. Ya
test_order
cenderung gagal kapantest_length
saja, tetapi Anda pasti tahu mengapa.Saya juga setuju bahwa jika yang
test_order
pertama muncul dan Anda menemukan kegagalan yang dapat diuji adalah bahwa hasilnya mungkin bukan dua nilai, menambahkan centang itu sebagaiassert
dan menamai ulang tes tersebut menjaditest_length_and_order
masuk akal.Jika Anda juga harus memeriksa jenis nilai yang dikembalikan adalah bilangan bulat, saya akan menyertakannya dalam tes hasil "omnibus" ini.
Tetapi perhatikan sekarang Anda memiliki baterai tes untuk hasilnya
my_function()
. Jika ada beberapa konteks (atau, lebih mungkin, beberapa parameter) untuk menguji ini sekarang dapat menjadi subrutin untuk menguji semua hasilmy_function()
.Namun, ketika saya menulis tes unit, saya biasanya menguji tepi dan kasus buruk secara terpisah dari input yang baik dan output normal (sebagian karena sebagian besar "unit" tes saya sering tes integrasi mini), dan sering dengan beberapa menegaskan, yang hanya rusak menjadi tes terpisah jika gagal dengan cara di mana saya menemukan saya ingin informasi lebih lanjut tanpa debugging.
Jadi saya mungkin akan mulai dengan tes terpisah Anda dan memperluas
test_length
ketest_length_and_types
dan meninggalkantest_order
terpisah, dengan asumsi yang terakhir dianggap "pemrosesan normal".sumber