Kerangka UnitTest - Doctest

Distribusi standar Python berisi modul 'Doctest'. Fungsionalitas modul ini memungkinkan untuk mencari potongan teks yang terlihat seperti sesi Python interaktif, dan menjalankan sesi ini untuk melihat apakah mereka bekerja persis seperti yang ditunjukkan.

Doctest bisa sangat berguna dalam skenario berikut -

  • Untuk memeriksa apakah docstrings modul adalah yang terbaru dengan memverifikasi bahwa semua contoh interaktif masih berfungsi seperti yang didokumentasikan.

  • Untuk melakukan pengujian regresi dengan memverifikasi bahwa contoh interaktif dari file pengujian atau objek pengujian berfungsi seperti yang diharapkan.

  • Untuk menulis dokumentasi tutorial untuk sebuah paket, diilustrasikan secara bebas dengan contoh input-output

Dalam Python, 'docstring' adalah literal string yang muncul sebagai ekspresi pertama dalam kelas, fungsi, atau modul. Ini diabaikan ketika suite dijalankan, tetapi dikenali oleh kompilator dan dimasukkan ke dalam__doc__atribut dari kelas, fungsi atau modul yang melampirkan. Karena tersedia melalui introspeksi, ini adalah tempat kanonik untuk dokumentasi objek.

Ini adalah praktik biasa untuk menempatkan contoh penggunaan berbagai bagian kode Python di dalam docstring. Modul doctest memungkinkan untuk memverifikasi bahwa docstrings ini adalah yang terbaru dengan revisi berkala dalam kode.

Dalam kode berikut, fungsi faktorial didefinisikan diselingi dengan contoh penggunaan. Untuk memverifikasi apakah penggunaan contoh benar, panggil fungsi testmod () dalam modul doctest.

"""
This is the "example" module.

The example module supplies one function, factorial(). For example,

>>> factorial(5)
120
"""

def factorial(x):
   """Return the factorial of n, an exact integer >= 0.
   >>> factorial(-1)
   Traceback (most recent call last):
      ...
   ValueError: x must be >= 0
   """
   
   if not x >= 0:
      raise ValueError("x must be >= 0")
   f = 1
   for i in range(1,x+1):
      f = f*i
   return f
   
if __name__ == "__main__":
   import doctest
   doctest.testmod()

Masukkan dan simpan skrip di atas sebagai FactDocTest.py dan coba jalankan skrip ini dari baris perintah.

Python FactDocTest.py

Tidak ada keluaran yang akan ditampilkan kecuali contoh gagal. Sekarang, ubah baris perintah menjadi berikut -

Python FactDocTest.py –v

Konsol sekarang akan menampilkan keluaran berikut -

C:\Python27>python FactDocTest.py -v
Trying:
   factorial(5)
Expecting:
   120
ok
Trying:
   factorial(-1)
Expecting:
   Traceback (most recent call last):
      ...
   ValueError: x must be >= 0
ok
2 items passed all tests:
   1 tests in __main__
   1 tests in __main__.factorial
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

Sebaliknya, jika kode fungsi factorial () tidak memberikan hasil yang diharapkan dalam docstring, maka hasil kegagalan akan ditampilkan. Misalnya, ubah f = 2 menggantikan f = 1 pada skrip di atas dan jalankan doctest lagi. Hasilnya adalah sebagai berikut -

Trying:
   factorial(5)
Expecting:
   120
**********************************************************************
File "docfacttest.py", line 6, in __main__
Failed example:
factorial(5)
Expected:
   120
Got:
   240
Trying:
   factorial(-1)
Expecting:
   Traceback (most recent call last):
      ...
   ValueError: x must be >= 0
ok
1 items passed all tests:
   1 tests in __main__.factorial
**********************************************************************
1 items had failures:
   1 of 1 in __main__
2 tests in 2 items.
1 passed and 1 failed.
***Test Failed*** 1 failures.

Doctest: Memeriksa Contoh di File Teks

Aplikasi doctest sederhana lainnya adalah menguji contoh-contoh interaktif dalam file teks. Ini bisa dilakukan dengan fungsi testfile ().

Teks berikut disimpan dalam file teks bernama 'example.txt'.

Using ''factorial''
-------------------
This is an example text file in reStructuredText format. First import
''factorial'' from the ''example'' module:
   >>> from example import factorial
Now use it:
   >>> factorial(5)
   120

Isi file diperlakukan sebagai docstring. Untuk memverifikasi contoh dalam file teks, gunakan fungsi testfile () modul doctest.

def factorial(x):
   if not x >= 0:
      raise ValueError("x must be >= 0")
   f = 1
   for i in range(1,x+1):
      f = f*i
   return f
   
if __name__ == "__main__":
   import doctest
   doctest.testfile("example.txt")
  • Seperti testmod (), testfile () tidak akan menampilkan apa pun kecuali sebuah contoh gagal. Jika sebuah contoh gagal, maka contoh yang gagal dan penyebab kegagalan dicetak ke konsol, menggunakan format yang sama seperti testmod ().

  • Dalam kebanyakan kasus, salin dan tempel sesi konsol interaktif berfungsi dengan baik, tetapi doctest tidak mencoba melakukan emulasi yang tepat dari shell Python tertentu.

  • Setiap keluaran yang diharapkan harus segera mengikuti baris '>>>' atau '...' terakhir yang berisi kode, dan keluaran yang diharapkan (jika ada) meluas ke baris '>>>' atau semua spasi kosong berikutnya.

  • Keluaran yang diharapkan tidak boleh berisi baris spasi kosong, karena baris tersebut diambil sebagai sinyal akhir dari keluaran yang diharapkan. Jika keluaran yang diharapkan memang berisi baris kosong, letakkan <BLANKLINE> dalam contoh doctest Anda di setiap tempat yang diharapkan baris kosong.