Python дээр docstrings дээр тест код бичихийн тулд doctest хэрхэн бичих, ашиглах талаар.

Бизнес эрхэлдэг

Python нь docstring-ийн агуулгыг шалгадаг стандарт doctest модулийн хамт ирдэг бөгөөд энэ нь docstring дээр оролт, гаралтын жишээ бичихэд хялбар болгож, баримт бичгийг ойлгоход хялбар болгодог.

Энд дараах мэдээллийг хүргэж байна.

  • doctest ашиглан тест хийх энгийн жишээ
    • Хэрэв алдаа байхгүй бол
    • Хэрэв алдаа гарвал
  • Гаралтын үр дүнг сонголтууд болон аргументуудаар удирдана
    • -vСонголт
    • verboseаргумент (жишээ нь: функц, програм, програм)
  • Doctest модулийг тушаалын мөрөөс ажиллуулна уу
  • Гадаад текст файлд тест бичих
    • Текст файлыг хэрхэн бичих вэ
    • py файлаас дуудсан
    • Текст файлыг шууд гүйцэтгэнэ

doctest ашиглан тест хийх энгийн жишээ

Docstring нь дараах зүйлсийн аль нэгэнд хавсаргасан мөр юм: (1) турших функцын нэр, (2) турших функцын нэр, (3) Python интерактив горимд хүлээгдэж буй гаралтын утга.

  • """
  • ''

Хэрэв алдаа байхгүй бол

Функц болон баримт бичгийн агуулгад код зөв байгаа эсэхийг шалгаарай.

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

    return a + b


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

Энэ файлыг ажиллуул.

$ python3 doctest_example.py

Хэрэв алдаа байхгүй бол юу ч гарахгүй.

if __name__ == '__main__'Энэ нь “харгалзах скрипт файлыг тушаалын мөрөөс гүйцэтгэх үед л дараагийн боловсруулалтыг гүйцэтгэнэ” гэсэн үг юм.

Хэрэв алдаа гарвал

Хэрэв та дараах буруу кодыг үүсгэн ажиллуулбал алдаа гарна.

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.

Үүнийг дараах байдлаар харуулав.

doctest дээр бичигдсэн хүлээгдэж буй гаралтын утгууд.Expected
Бодит гаралтын утгаGot

Гаралтын үр дүнг сонголтууд болон аргументуудаар удирдана

-vСонголт

Хэрэв та алдаагүй байсан ч гаралтын үр дүнг харуулахыг хүсвэл командын мөрөнд -v сонголттой командыг ажиллуулна уу.

$ 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.

verboseаргумент (жишээ нь: функц, програм, програм)

Хэрэв та гаралтын үр дүнг үргэлж харуулахыг хүсвэл py файлын doctest.testmod() дотор verbose=True аргументыг зааж өгнө үү.

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

Гаралтын үр дүн нь ажиллах үед -v сонголтгүйгээр үргэлж харагдах болно.

$ 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 модулийг тушаалын мөрөөс ажиллуулна уу

if __name__ == '__main__'Хэрэв та үүн дотор өөр зүйл хийхийг хүсвэл py файл дахь doctest.testmod() руу залгахгүйгээр тушаалын мөрөөс шууд doctest модулийг ажиллуулж болно.

Жишээлбэл, дараах тохиолдолд

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)

Энэ нь командын мөрийн аргументуудыг хүлээн авч, процессыг ердийнхөөрөө гүйцэтгэх боломжтой.

$ python3 doctest_example_without_import.py 3 4
7

Хэрэв та doctest-ыг -m сонголттой скрипт хэлбэрээр ажиллуулбал тест нь doctest-ын бичигдсэн функцийн эсрэг ажиллана. Хэрэв та гаралтын үр дүнг харуулахыг хүсвэл өмнөх шигээ -v нэмнэ үү.

$ 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.

Гадаад текст файлд тест бичих

Та мөн тестийн кодыг docstring дотор биш гадаад текст файлд бичиж болно.

Текст файлыг хэрхэн бичих вэ

Docstring-д тайлбарласны дагуу Python интерактив горимын форматаар бичнэ үү. Ашиглах функцүүдийг импортлох шаардлагатай.

Хэрэв та текст файлыг шалгах гэж буй .py файлтай нэг директорт оруулахыг хүсвэл дараах байдлаар импортлоход хангалттай.

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

py файлаас дуудсан

Туршилт хийхийн тулд өөр .py файлд doctest.testfile() руу залгана уу.

Тестийн кодыг doctest.testfile() аргумент болгон бичсэн текст файлын замыг зааж өгнө үү.

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

Энэ py файлыг ажиллуул.

$ 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.

Текст файлыг шууд гүйцэтгэнэ

Танд py файл байхгүй байсан ч гэсэн командын мөрөөс текст файлыг шууд уншиж, тестүүдийг ажиллуулж болно.

Python командыг -m сонголтоор ажиллуулж doctest-ыг скрипт болгон ажиллуул. Та текст файлын замыг командын мөрийн аргумент болгон зааж өгч болно.

$ 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.