Tes Unit Python: Mulai Cepat

Terjemahan artikel disiapkan khusus untuk siswa kursus Python QA Engineer .


Pengujian kode unit merupakan bagian integral dari siklus hidup pengembangan perangkat lunak. Tes unit juga membentuk dasar untuk melakukan pengujian regresi, yaitu, mereka menjamin bahwa sistem akan berperilaku sesuai dengan skenario ketika fitur baru ditambahkan atau yang sudah ada berubah.

Pada artikel ini, saya akan menunjukkan ide dasar pengujian unit dalam satu kelas. Dalam praktiknya, Anda harus menulis banyak test case, menambahkannya ke test suite, dan menjalankan semuanya. Manajemen kasus uji akan dibahas dalam artikel berikutnya.

Hari ini kita akan fokus pada pengujian backend. Artinya, pengembang telah mengimplementasikan beberapa proyek sesuai dengan spesifikasi (misalnya, Calculator.py), dan tugas Anda adalah memastikan bahwa kode yang dikembangkan benar-benar cocok dengan mereka (misalnya, menggunakan TestCalculator.py ).

Misalkan Anda menulis kelas Kalkulator untuk melakukan fungsi komputasi dasar: penjumlahan, pengurangan, perkalian, dan pembagian.

Kode untuk ini ada di sini ( Calculator.py ):

 #A simple calculator class Calculator: #empty constructor def __init__(self): pass #add method - given two numbers, return the addition def add(self, x1, x2): return x1 + x2 #multiply method - given two numbers, return the #multiplication of the two def multiply(self, x1, x2): return x1 * x2 #subtract method - given two numbers, return the value #of first value minus the second def subtract(self, x1, x2): return x1 - x2 #divide method - given two numbers, return the value #of first value divided by the second def divide(self, x1, x2): if x2 != 0: return x1/x2 

Sekarang saya ingin menjalankan unit test untuk memahami bahwa fungsi di kelas di atas berfungsi seperti yang direncanakan.

Python biasanya datang dengan paket unittest . Jika tidak ada di sistem Anda, gunakan pip untuk menginstalnya.

Tes unit memiliki struktur berikut:



setUp() dan tearDown() adalah metode standar yang datang dengan kerangka kerja unittest (mereka didefinisikan dalam kelas unittest.TestCase). Tergantung pada kasus pengujian Anda, Anda dapat menimpa atau tidak menimpa kedua metode ini secara default.

Saatnya untuk melihat kode kasus uji. Ini file TestCalculator.py .

 import unittest from Calculator import Calculator #Test cases to test Calulator methods #You always create a child class derived from unittest.TestCase class TestCalculator(unittest.TestCase): #setUp method is overridden from the parent class TestCase def setUp(self): self.calculator = Calculator() #Each test method starts with the keyword test_ def test_add(self): self.assertEqual(self.calculator.add(4,7), 11) def test_subtract(self): self.assertEqual(self.calculator.subtract(10,5), 5) def test_multiply(self): self.assertEqual(self.calculator.multiply(3,7), 21) def test_divide(self): self.assertEqual(self.calculator.divide(10,2), 5) # Executing the tests in the above test case class if __name__ == "__main__": unittest.main() 

Meskipun ini tidak perlu, tetapi sebagai aturan saya memanggil kelas uji dengan Uji awalan (dalam kasus kami TestCalculator). Persyaratan utama di kelas ini adalah keberadaan superclass unittest.TestCase .

Setiap kali test case ini dijalankan, metode setUp () dijalankan terlebih dahulu. Dalam kasus kami, kami cukup membuat objek Kalkulator kelas dan menyimpannya sebagai atribut kelas. Ada beberapa metode standar lain di kelas induk, yang akan kita bahas nanti.

Untuk saat ini, semua yang akan Anda lakukan adalah menulis metode test_xxx untuk menguji setiap metode di kelas Kalkulator. Harap dicatat bahwa semua metode pengujian dimulai dengan awalan test_ . Ini memberitahu Python menggunakan kerangka kerja unittest bahwa ini adalah metode pengujian.

Di setiap metode pengujian, saya menggunakan metode assertEqual untuk memeriksa apakah metode kalkulator mengembalikan nilai yang diharapkan. Jika nilai kembali sama dengan nilai yang diharapkan, maka tes berhasil, jika tidak maka gagal.

Ada banyak metode assert yang akan kita bicarakan nanti.

Baris terakhir dalam kode di atas hanya meluncurkan TestCalculator test case. Ini mengeksekusi setiap metode pengujian yang didefinisikan di dalam kelas dan mengembalikan hasilnya.

 python TestCalculator.py -v 


Anda akan melihat kesimpulan yang mirip dengan yang berikut:

 test_add (__main__.TestCalculator) ... ok test_divide (__main__.TestCalculator) ... ok test_multiply (__main__.TestCalculator) ... ok test_subtract (__main__.TestCalculator) ... ok -------------------------------------------------------------------- Ran 4 tests in 0.000s OK 

Bagaimana jika sesuatu tidak berfungsi seperti yang diharapkan? Mari kita ubah nilai yang diharapkan dari test_divide dari 5 menjadi 6 (5 adalah nilai yang benar, sekarang kita akan melihat apa yang terjadi jika gagal. Ini bukan kesalahan dalam kode sumber, tetapi kesalahan di suite tes, Anda mungkin juga memiliki kesalahan dalam suite tes, jadi selalu periksa skrip pengujian untuk kesalahan!)

 import unittest from Calculator import Calculator #Test cases to test Calulator methods #You always create a child class derived from unittest.TestCase class class TestCalculator(unittest.TestCase): #setUp method overridden from the parent class TestCase def setUp(self): self.calculator = Calculator() ... def test_divide(self): self.assertEqual(self.calculator.divide(10,2), 6) # Executing the tests in the above test case class if __name__ == "__main__": unittest.main() 

Ketika Anda menjalankan test case ini, Anda akan mendapatkan hasil berikut:

 test_add (__main__.TestCalculator) ... ok test_divide (__main__.TestCalculator) ... FAIL test_multiply (__main__.TestCalculator) ... ok test_subtract (__main__.TestCalculator) ... ok ==================================================================== FAIL: test_divide (__main__.TestCalculator) -------------------------------------------------------------------- Traceback (most recent call last): File "TestCalculator.py", line 23, in test_divide self.assertEqual(self.calculator.divide(10,2), 6) AssertionError: 5.0 != 6 -------------------------------------------------------------------- Ran 4 tests in 0.001s FAILED (failures=1) 

Dikatakan di sini bahwa 3 dari 4 tes berhasil, tetapi satu gagal. Dalam skenario nyata, diasumsikan bahwa test case Anda benar, yaitu, dengan cara ini membantu mengidentifikasi fungsi yang tidak diterapkan dengan benar.

Source: https://habr.com/ru/post/id481806/


All Articles