Python’da docstring’lerde test kodu yazmak için doctest nasıl yazılır ve kullanılır.

Python, bir belge dizisinin içeriğini test eden, belge dizisine girdi ve çıktı örnekleri yazmayı kolaylaştıran ve belgelerin anlaşılmasını kolaylaştıran standart bir belge testi modülü ile birlikte gelir.

Aşağıdaki bilgiler burada verilmiştir.

  • doctest ile basit bir test örneği
    • hata yoksa
    • bir hata varsa
  • Çıktı sonuçlarını seçeneklere ve bağımsız değişkenlere göre kontrol edin
    • -vSeçenek
    • verboseargüman (ör. fonksiyon, program, program)
  • doctest modülünü komut satırından çalıştırın
  • Harici bir metin dosyasında testler yazma
    • Metin dosyası nasıl yazılır
    • py dosyasından çağrılır
    • Bir metin dosyasını doğrudan yürütün

doctest ile basit bir test örneği

Belge dizisi, aşağıdakilerden birinin içine alınmış bir dizedir: (1) test edilecek işlevin adı, (2) test edilecek işlevin adı ve (3) Python etkileşimli modunda beklenen çıktı değeri.

  • """
  • ''

hata yoksa

İşlev ve belge içeriğindeki kodun doğru olduğundan emin olun.

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    15
    '''

    return a + b


if __name__ == '__main__':
    import doctest
    doctest.testmod()

Bu dosyayı çalıştırın.

$ python3 doctest_example.py

Hata yoksa, hiçbir şey çıkmayacaktır.

if __name__ == '__main__'Bu, “sonraki işlemleri yalnızca ilgili komut dosyası komut satırından yürütüldüğünde yürütün.

bir hata varsa

Aşağıdaki yanlış kodu oluşturup çalıştırırsanız, bir hata çıkacaktır.

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    10
    '''

    return a * b


if __name__ == '__main__':
    import doctest
    doctest.testmod()
$ python3 doctest_example_error.py
**********************************************************************
File "doctest_example_error.py", line 3, in __main__.add
Failed example:
    add(1, 2)
Expected:
    3
Got:
    2
**********************************************************************
File "doctest_example_error.py", line 5, in __main__.add
Failed example:
    add(5, 10)
Expected:
    10
Got:
    50
**********************************************************************
1 items had failures:
   2 of   2 in __main__.add
***Test Failed*** 2 failures.

Aşağıdaki gibi gösterilir.

Doctest’te yazılan beklenen çıktı değerleri.Expected
Gerçek çıkış değeriGot

Çıktı sonuçlarını seçeneklere ve bağımsız değişkenlere göre kontrol edin

-vSeçenek

Çıktı sonuçlarının hata olmadığında dahi görüntülenmesini istiyorsanız, komut satırında -v seçeneği ile komutu çalıştırın.

$ python3 doctest_example.py -v
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

verboseargüman (ör. fonksiyon, program, program)

Çıktı sonuçlarını her zaman görüntülemek istiyorsanız, py dosyasındaki doctest.testmod() içinde verbose=True bağımsız değişkenini belirtin.

if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

Çıktı sonuçları, çalışma zamanında her zaman -v seçeneği olmadan görüntülenecektir.

$ python3 doctest_example_verbose.py
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

doctest modülünü komut satırından çalıştırın

if __name__ == '__main__'İçinde başka bir şey yapmak istiyorsanız, py dosyasında doctest.testmod() öğesini çağırmadan doğrudan komut satırından doctest modülünü çalıştırabilirsiniz.

Örneğin, aşağıdaki durumlarda

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    15
    '''

    return a + b


if __name__ == '__main__':
    import sys
    result = add(int(sys.argv[1]), int(sys.argv[2]))
    print(result)

Komut satırı argümanlarını alabilir ve işlemi her zamanki gibi yürütebilir.

$ python3 doctest_example_without_import.py 3 4
7

doctest’i -m seçeneğiyle bir komut dosyası olarak çalıştırırsanız, test, doctest’in yazıldığı fonksiyona karşı çalıştırılacaktır. Çıktı sonuçlarını görüntülemek istiyorsanız, önceki gibi -v ekleyin.

$ python3 -m doctest doctest_example_without_import.py

$ python3 -m doctest -v doctest_example_without_import.py
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items had no tests:
    doctest_example_without_import
1 items passed all tests:
   2 tests in doctest_example_without_import.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

Harici bir metin dosyasında testler yazma

Test kodunu, belge dizisi yerine harici bir metin dosyasına da yazabilirsiniz.

Metin dosyası nasıl yazılır

docstring’de açıklandığı gibi Python etkileşimli mod biçiminde yazın. Kullanılacak fonksiyonların import edilmesi gerekmektedir.

Metin dosyasını test edilecek .py dosyasıyla aynı dizine koymak istiyorsanız, aşağıdaki gibi içe aktarmanız yeterlidir.

>>> from doctest_example import add
>>> add(1, 2)
3
>>> add(5, 10)
15

py dosyasından çağrılır

Test için başka bir .py dosyasında doctest.testfile() öğesini çağırın.

doctest.testfile() argümanı olarak test kodunun yazıldığı metin dosyasının yolunu belirtin.

import doctest
doctest.testfile('doctest_text.txt')

Bu py dosyasını çalıştırın.

$ python3 doctest_example_testfile.py -v
Trying:
    from doctest_example import add
Expecting nothing
ok
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items passed all tests:
   3 tests in doctest_text.txt
3 tests in 1 items.
3 passed and 0 failed.
Test passed.

Bir metin dosyasını doğrudan yürütün

py dosyasına sahip olmasanız bile, metin dosyasını doğrudan komut satırından okuyabilir ve testleri çalıştırabilirsiniz.

doctest’i komut dosyası olarak çalıştırmak için Python komutunu -m seçeneğiyle çalıştırın. Metin dosyası yolunu komut satırı argümanı olarak belirtebilirsiniz.

$ python3 -m doctest -v doctest_text.txt
Trying:
    from doctest_example import add
Expecting nothing
ok
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items passed all tests:
   3 tests in doctest_text.txt
3 tests in 1 items.
3 passed and 0 failed.
Test passed.