mata utama
Pengenalan kepada ujian perisian
Ujian perisian adalah proses memeriksa tingkah laku produk perisian untuk menilai dan mengesahkan bahawa mereka mematuhi spesifikasi. Produk perisian mungkin mengandungi beribu -ribu baris kod dan beratus -ratus komponen yang berfungsi bersama. Jika garis kod tidak berfungsi dengan betul, ralat boleh menyebarkan dan menyebabkan kesilapan lain. Oleh itu, untuk memastikan bahawa program berjalan seperti yang diharapkan, ia mesti diuji.Oleh kerana perisian moden boleh menjadi agak rumit, terdapat pelbagai tahap ujian untuk menilai aspek yang berbeza dari ketepatan. Menurut sukatan pelajaran asas ujian iSTQB, terdapat empat tahap ujian perisian:
Ujian hanya boleh membuktikan kewujudan kecacatan, tetapi tidak dapat membuktikan ketiadaan kecacatan.Dengan kata lain, walaupun semua ujian yang anda jalankan tidak menunjukkan sebarang kegagalan, ia tidak akan membuktikan bahawa sistem perisian anda bebas daripada kesilapan, atau kes ujian lain tidak akan menemui sebarang kelemahan dalam tingkah laku perisian anda.-
iSTQB CTFL Syllabus 2018
Ini adalah tahap ujian pertama, juga dikenali sebagai ujian komponen. Dalam bahagian ini, satu komponen perisian diuji. Bergantung pada bahasa pengaturcaraan, unit perisian mungkin kelas, fungsi, atau kaedah. Sebagai contoh, jika anda mempunyai kelas Java yang dipanggil aritmeticoperations yang mengandungi pelbagai dan membahagikan kaedah, ujian unit kelas aritmetik perlu untuk menguji tingkah laku yang betul dari kaedah membiak dan membahagikan.
Ujian unit biasanya dilakukan oleh penguji perisian. Untuk menjalankan ujian unit, penguji perisian (atau pemaju) perlu mengakses kod sumber kerana kod sumber itu sendiri adalah objek yang diuji. Oleh itu, kaedah ujian perisian ini yang secara langsung menguji kod sumber dipanggil ujian kotak putih.
Anda mungkin tertanya -tanya mengapa anda perlu bimbang tentang ujian perisian dan sama ada ia berbaloi. Di bahagian seterusnya, kami akan menganalisis motivasi di sebalik sistem perisian ujian.
Kelebihan utama ujian perisian ialah meningkatkan kualiti perisian. Kualiti perisian adalah penting, terutamanya di dunia di mana perisian mengendalikan semua jenis perkara dalam aktiviti harian kami. Meningkatkan kualiti perisian masih menjadi matlamat yang terlalu samar -samar. Mari cuba untuk menggambarkan dengan lebih baik apa yang kita panggil kualiti perisian. Menurut ISO/IEC Standard 9126-1 ISO 9126, kualiti perisian termasuk faktor berikut:
Jika anda memiliki sebuah syarikat, maka anda harus mempertimbangkan dengan teliti aktiviti ujian perisian kerana ia akan mempengaruhi perniagaan anda. Sebagai contoh, pada bulan Mei 2022, Tesla teringat 130,000 kereta kerana masalah dengan sistem infotainment kenderaan. Masalah ini kemudian diselesaikan melalui kemas kini perisian yang diedarkan "di udara". Kegagalan ini telah menyebabkan masa dan wang kepada syarikat dan juga menyebabkan masalah bagi pelanggan, kerana mereka tidak dapat menggunakan kereta mereka untuk seketika. Perisian ujian tidak memerlukan wang, tetapi syarikat juga boleh menjimatkan berjuta -juta sokongan teknikal.
Ujian unit memberi tumpuan kepada memeriksa bahawa perisian berjalan dengan betul, yang bermaksud memeriksa bahawa pemetaan antara input dan output dilakukan dengan betul. Sebagai aktiviti ujian peringkat rendah, ujian unit membantu mengenal pasti kesilapan awal supaya mereka tidak menyebarkannya ke tahap sistem perisian yang lebih tinggi.
Kelebihan ujian unit lain termasuk:
Strategi ujian reka bentuk
Sekarang mari kita lihat cara merancang strategi ujian.
Sebelum mula merancang strategi ujian anda, terdapat soalan penting untuk dijawab. Bahagian sistem perisian apa yang ingin anda uji?
Ini adalah isu utama, kerana ujian menyeluruh adalah mustahil. Oleh itu, anda tidak boleh menguji semua kemungkinan input dan output, tetapi anda harus mengutamakan ujian berdasarkan risiko yang terlibat.
Beberapa faktor perlu dipertimbangkan apabila menentukan skop ujian:
Sebaik sahaja anda telah menentukan skop ujian (menentukan apa yang harus anda uji dan apa yang anda tidak patut menguji), anda boleh membincangkan ciri -ciri yang harus dimiliki oleh ujian unit yang baik.
Langkah hilang sebelum menyelidiki ujian unit di Python. Bagaimanakah kita mengatur ujian untuk menjadikannya bersih dan boleh dibaca? Kami menggunakan corak yang dipanggil penyediaan, pelaksanaan, dan pernyataan (AAA).
Corak Penyediaan, Pelaksanaan, dan Penegasan (AAA) adalah strategi yang sama untuk menulis dan menganjurkan ujian unit. Ia berfungsi seperti berikut:
Strategi ini menyediakan cara yang bersih untuk menganjurkan ujian unit dengan memisahkan semua bahagian utama ujian (persediaan, pelaksanaan, dan pengesahan). Di samping itu, ujian unit lebih mudah dibaca kerana mereka semua mengikuti struktur yang sama.
Ujian unit di Python: Unittest atau Pytest?
Kami kini akan membincangkan dua kerangka ujian unit yang berbeza di Python. Kedua -dua kerangka ini tidak tercemar dan pittest.
Perpustakaan piawai Python mengandungi rangka kerja ujian unit yang paling unittest. Rangka kerja ini diilhamkan oleh Junit, yang merupakan rangka kerja ujian unit di Jawa.
Seperti yang dinyatakan dalam dokumentasi rasmi, Unittest menyokong beberapa konsep penting yang akan kita sebutkan dalam siaran ini:
Unittest mempunyai cara sendiri untuk menulis ujian. Khususnya, kita perlukan:
Sejak Unittest telah dipasang, kami sudah bersedia untuk menulis ujian unit pertama kami!
Katakan kita mempunyai kelas BankAccount:
import unittest class BankAccount: def __init__(self, id): self.id = id self.balance = 0 def withdraw(self, amount): if self.balance >= amount: self.balance -= amount return True return False def deposit(self, amount): self.balance += amount return True
Kami tidak dapat mengeluarkan wang yang melebihi jumlah deposit yang tersedia, jadi mari menguji jika kod sumber kami mengendalikan keadaan ini dengan betul.
Dalam fail python yang sama, kita boleh menambah kod berikut:
class TestBankOperations(unittest.TestCase): def test_insufficient_deposit(self): # Arrange a = BankAccount(1) a.deposit(100) # Act outcome = a.withdraw(200) # Assert self.assertFalse(outcome)
Kami mencipta kelas yang dipanggil TestBankOperations yang merupakan subclass of Unittest.testcase. Dengan cara ini, kami membuat kes ujian baru.
Di kelas ini, kita menentukan fungsi ujian tunggal yang kaedahnya bermula dengan ujian. Ini penting kerana setiap kaedah ujian mesti bermula dengan ujian perkataan.
kami mengharapkan kaedah ujian ini untuk mengembalikan palsu, yang bermaksud operasi gagal. Untuk menegaskan hasilnya, kami menggunakan kaedah penegasan khas yang dipanggil AsseCsionFalse ().
Kami sudah bersedia untuk melakukan ujian. Mari jalankan arahan ini pada baris arahan:
python -m unittest example.py
di sini, contoh.py adalah nama fail yang mengandungi semua kod sumber. Output sepatutnya kelihatan seperti ini:
<code>. ---------------------------------------------------------------------- Ran 1 test in 0.001s OK</code>
sangat bagus! Ini bermakna ujian kami berjaya. Sekarang mari kita lihat bagaimana output kelihatan ketika ada kegagalan. Kami menambah ujian baru ke kelas sebelumnya. Mari cuba mendepositkan jumlah negatif, yang pastinya mustahil. Adakah kod kita akan menangani keadaan ini?
Ini adalah kaedah ujian baru kami:
def test_negative_deposit(self): # Arrange a = BankAccount(1) # Act outcome = a.deposit(-100) # Assert self.assertFalse(outcome)
kita boleh menggunakan mod terperinci Unittest untuk melaksanakan ujian ini dengan menggunakan bendera -v:
python -m unittest -v example.py
output berbeza sekarang:
<code>test_insufficient_deposit (example.TestBankOperations) ... ok test_negative_deposit (example.TestBankOperations) ... FAIL ====================================================================== FAIL: test_negative_deposit (example.TestBankOperations) ---------------------------------------------------------------------- Traceback (most recent call last): File "example.py", line 35, in test_negative_deposit self.assertFalse(outcome) AssertionError: True is not false ---------------------------------------------------------------------- Ran 2 tests in 0.002s FAILED (failures=1)</code>
Dalam kes ini, logo terperinci memberi kita lebih banyak maklumat. Kami tahu bahawa test_negative_deposit gagal. Khususnya, AssertionError memberitahu kita bahawa hasil yang diharapkan harus palsu, tetapi benar tidak palsu, yang bermaksud bahawa kaedah itu kembali benar.
Rangka Kerja Unittest menyediakan kaedah penegasan yang berbeza mengikut keperluan kita:
Sekarang kita mempunyai pemahaman asas tentang cara menulis ujian unit menggunakan kerangka unittest, mari kita lihat satu lagi rangka kerja python yang dipanggil pytest.
Rangka Kerja PyTest adalah rangka kerja ujian unit python yang mempunyai beberapa ciri yang berkaitan:
Sejak PYTest tidak dipasang secara lalai, kita mesti memasangnya terlebih dahulu. Perhatikan bahawa Pytest memerlukan Python 3.7.
Memasang pytest sangat mudah. Anda hanya perlu menjalankan arahan berikut:
import unittest class BankAccount: def __init__(self, id): self.id = id self.balance = 0 def withdraw(self, amount): if self.balance >= amount: self.balance -= amount return True return False def deposit(self, amount): self.balance += amount return True
kemudian periksa bahawa semuanya dipasang dengan betul dengan menaip:
class TestBankOperations(unittest.TestCase): def test_insufficient_deposit(self): # Arrange a = BankAccount(1) a.deposit(100) # Act outcome = a.withdraw(200) # Assert self.assertFalse(outcome)
output sepatutnya kelihatan seperti ini:
python -m unittest example.py
sangat bagus! Mari tulis ujian pertama menggunakan PYTest.
kami akan menggunakan kelas BankAccount yang kami tulis sebelum ini dan kami akan menguji kaedah yang sama seperti dahulu. Dengan cara ini, lebih mudah untuk membandingkan usaha yang diperlukan untuk menulis ujian menggunakan kedua -dua kerangka ini.
untuk menggunakan pytest untuk ujian, kita perlukan:
jadi kami membuat fail bernama test_bank.py dan masukkannya ke dalam folder. Inilah fungsi ujian pertama kami seperti:
<code>. ---------------------------------------------------------------------- Ran 1 test in 0.001s OK</code>
Seperti yang anda perhatikan, satu -satunya perubahan berbanding dengan versi Unittest ialah bahagian menegaskan. Di sini kita menggunakan kaedah penegasan python biasa.
sekarang kita dapat melihat fail test_bank.py:
def test_negative_deposit(self): # Arrange a = BankAccount(1) # Act outcome = a.deposit(-100) # Assert self.assertFalse(outcome)
Untuk menjalankan ujian ini, mari kita buka command prompt dalam folder yang mengandungi fail test_bank.py. Kemudian, jalankan perintah berikut:
python -m unittest -v example.py
output akan kelihatan seperti ini:
<code>test_insufficient_deposit (example.TestBankOperations) ... ok test_negative_deposit (example.TestBankOperations) ... FAIL ====================================================================== FAIL: test_negative_deposit (example.TestBankOperations) ---------------------------------------------------------------------- Traceback (most recent call last): File "example.py", line 35, in test_negative_deposit self.assertFalse(outcome) AssertionError: True is not false ---------------------------------------------------------------------- Ran 2 tests in 0.002s FAILED (failures=1)</code>
Dalam kes ini, kita dapat melihat betapa mudahnya menulis dan melaksanakan ujian. Selain itu, kita dapat melihat bahawa kita menulis kurang kod daripada Unittest. Hasil ujian juga mudah difahami.
mari kita terus melihat ujian yang gagal!
Kami menggunakan kaedah kedua yang kami tulis sebelum ini, yang dipanggil test_negative_deposit. Kami refactor bahagian menegaskan dan hasilnya adalah seperti berikut:
pip install -U pytest
Kami menjalankan ujian seperti dahulu, yang sepatutnya menjadi output:
pytest --version
dengan menghuraikan output kita boleh membaca 2 item yang dikumpulkan, yang bermaksud bahawa dua ujian telah dilakukan. Tatal ke bawah dan kita dapat melihat ralat berlaku semasa menguji kaedah test_negative_deposit. Khususnya, kesilapan berlaku semasa menilai dakwaan. Di samping itu, laporan itu juga menyatakan bahawa nilai pemboleh ubah hasil adalah benar, yang bermaksud bahawa kaedah deposit mengandungi kesilapan.
Sejak Pytest menggunakan kata kunci penegasan python lalai, kita dapat membandingkan apa -apa output yang kita dapat dengan pembolehubah lain yang menyimpan hasil yang diharapkan. Semua ini tidak memerlukan kaedah penegasan khas.
Kesimpulan
Semua dalam artikel ini, kami memperkenalkan asas -asas ujian perisian. Kami mendapati mengapa ujian perisian adalah penting dan mengapa semua orang perlu menguji kod mereka. Kami membincangkan ujian unit dan bagaimana untuk mereka bentuk dan melaksanakan ujian unit mudah di Python.
Kami menggunakan dua kerangka python yang dipanggil Unittest dan Pytest. Kedua -duanya mempunyai ciri -ciri yang berguna, dan mereka adalah dua rangka kerja yang paling biasa digunakan dalam ujian unit Python.
Akhirnya, kita melihat dua kes ujian asas untuk memberi anda idea bagaimana menulis ujian sebagai persiapan, pelaksanaan, dan corak penegasan.
Saya harap saya telah meyakinkan anda tentang pentingnya ujian perisian. Pilih rangka kerja, seperti Unittest atau Pytest, dan mula ujian - kerana usaha tambahan adalah berbaloi!
Jika anda suka artikel ini, anda juga boleh mencari yang berikut berguna:
Soalan Lazim Mengenai Ujian Unit Python
Apakah ujian unit di Python? Ujian unit di Python adalah teknik ujian perisian di mana satu unit atau komponen program diuji diuji untuk memastikan setiap unit berfungsi seperti yang diharapkan.
Mengapa ujian unit penting dalam pembangunan python? Ujian unit membantu memastikan ketepatan komponen individu dalam program Python. Ia membantu untuk mengesan kesilapan awal, menyediakan jaring yang selamat untuk perubahan kod, dan menyokong pemeliharaan kod.
Bagaimana menulis ujian unit di Python? Ujian unit di Python sering ditulis menggunakan modul terbina dalam. Anda membuat kelas ujian yang diwarisi dari Unittest.Testcase dan menulis kaedah ujian dalam kelas ini. Kaedah ujian biasanya bermula dengan "ujian".
apa rangka kerja lain yang boleh saya gunakan untuk ujian unit python selain Unittest? Ya, selain Unittest ada rangka kerja ujian Python yang popular seperti Pytest dan Hidung. Rangka kerja ini menyediakan ciri -ciri dan sintaks yang berbeza, yang membolehkan pemaju memilih yang paling sesuai dengan keperluan mereka.
Apakah peranan perlawanan dalam ujian unit python? Perlawanan adalah cara untuk menetapkan prasyarat dalam Python dan membersihkan selepas ujian. Mereka membantu memastikan ujian bebas dan boleh berjalan secara bebas.
Apakah liputan ujian dan mengapa ia penting? Perlindungan ujian mengukur peratusan kod asas ujian anda dilaksanakan. Ia membantu mengenal pasti kod yang belum diuji dan memastikan ujian anda komprehensif, dengan itu mengurangkan kemungkinan kesilapan yang ditemui.
Apakah amalan terbaik untuk menulis ujian unit yang berkesan di Python? Ya, beberapa amalan terbaik termasuk menulis ujian bebas dan terpencil, menggunakan nama kaedah ujian deskriptif, dan situasi sempadan ujian. Di samping itu, cuba dapatkan liputan ujian yang baik dan jalankan ujian dengan kerap.
Atas ialah kandungan terperinci Panduan untuk ujian unit python dengan unittest dan pytest. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!