Различия между версиями 2 и 5 (по 3 версиям)
Версия 2 от 2019-04-19 00:01:09
Размер: 2166
Редактор: FrBrGeorge
Комментарий:
Версия 5 от 2019-04-29 12:46:49
Размер: 4910
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 13: Строка 13:
[[py3doc:doctest]]:
 * Идея: тест = диалог с python-интерпретатором
[[py3doc:doctest]]: тест = диалог с python-интерпретатором
 1.#0 Модуль
 {{{#!python
def moo(oos=2, end=""):
    '''Издать мычание длиной oos с end в конце'''
    return "M"+"o"*oos+end
 }}}
 1. Тестируем вручную:
 {{{#!python
george@inspiron:~/src/moo> python3 -i Moo.py
>>> moo()
'Moo'
>>> moo(4)
'Moooo'
>>> moo(0)
'M'
>>> moo(end='!')
'Moo!'
>>> moo(0,'?')
'M?'
}}}
 1. Добавляем тесты в docstring:
 {{{#!pytnon
def moo(oos=2, end=""):
    '''Издать мычание длиной oos с end в конце
    Оба параметра необязательны:
>>> moo()
'Moo'
Строка 16: Строка 42:
    Первый задаёт количество букв 'o' в слове 'Moo'
>>> moo(4)
'Mooooo'

    Букв 'o' может и не быть
>>> moo(0)
'M'

    Второй задаёт символ после всех 'o'
    (по умолчанию — ничего)
>>> moo(end='!')
'Moo!'
>>> moo(0,'?')
'M?'

    '''
    return "M"+"o"*oos+end
}}}
 1. Тестирование:
 {{{#!sh
george@inspiron:~/src/moo> python3 -m doctest Moo.py
**********************************************************************
File "/home/george/src/moo/Moo.py", line 13, in Moo.moo
Failed example:
    moo(4)
Expected:
    'Mooooo'
Got:
    'Moooo'
**********************************************************************
1 items had failures:
   1 of 5 in Moo.moo
***Test Failed*** 1 failures.
}}}
 1. Отчёт (с успешными тестами):
 {{{#!sh
george@inspiron:~/src/moo> python3 -m doctest -v Moo.py
Trying:
    moo()
Expecting:
    'Moo'
ok
Trying:
    moo(4)
Expecting:
    'Mooooo'
**********************************************************************
File "/home/george/src/moo/Moo.py", line 13, in Moo.moo
Failed example:
    moo(4)
Expected:
    'Mooooo'
Got:
    'Moooo'
Trying:
    moo(0)
Expecting:
    'M'
ok
Trying:
    moo(end='!')
Expecting:
    'Moo!'
ok
Trying:
    moo(0,'?')
Expecting:
    'M?'
ok
1 items had no tests:
    Moo
**********************************************************************
1 items had failures:
   1 of 5 in Moo.moo
5 tests in 2 items.
4 passed and 1 failed.
***Test Failed*** 1 failures.
}}}
'''TODO'''
Строка 17: Строка 122:
 * py.test  * py.test , nose
 * '''[[https://tox.readthedocs.io/en/latest/|tox]]'''
Строка 29: Строка 135:
'''TODO'''  * Осознать, что нуждается в unit-тестировании
 * Оснастить код семестрового проекта unit-тестами (любой фреймворк)
  * Зафиксировать в документации, как их запускать
 * Подумать над тестированием UI
  * например, с помощью порождения событий `tkinter`

Тестирование

  • Место тестирования в жизненном цикле программного продукта
  • Виды тестирования

    • Уровни (unit / integration / system )
    • Тестирование только новых функций или старых тоже (регрессионное тестирование)
    • Ручное, автоматизированное, автоматическое
  • green test trap: Тестирование может доказать наличие дефектов, но не их отсутствие
  • red test trap: Не всякие проваленные тесты означают дефекты. Могут означать пробел в требованиях, в том числе нефункциональных
  • Полезные ≠ друг другу термины: ошибка программиста при написании программы может привести к дефекту (багу) в программе, который в свою очередь может проявиться (или не проявиться) в виде программного сбоя

  • Стоимость исправления дефекта возрастает пропорционально его «возрасту»
  • Непрерывная интеграция

Модульное тестирование в Python

doctest: тест = диалог с python-интерпретатором

  1. Модуль
       1 def moo(oos=2, end=""):
       2     '''Издать мычание длиной oos с end в конце'''
       3     return "M"+"o"*oos+end
    
  2. Тестируем вручную:
       1 george@inspiron:~/src/moo> python3 -i Moo.py
       2 >>> moo()
       3 'Moo'
       4 >>> moo(4)
       5 'Moooo'
       6 >>> moo(0)
       7 'M'
       8 >>> moo(end='!')
       9 'Moo!'
      10 >>> moo(0,'?')
      11 'M?'
    
  3. Добавляем тесты в docstring:
    def moo(oos=2, end=""):
        '''Издать мычание длиной oos с end в конце
        Оба параметра необязательны:
    >>> moo()
    'Moo'
    
        Первый задаёт количество букв 'o' в слове 'Moo'
    >>> moo(4)
    'Mooooo'
    
        Букв 'o' может и не быть
    >>> moo(0)
    'M'
    
        Второй задаёт символ после всех 'o'
        (по умолчанию — ничего)
    >>> moo(end='!')
    'Moo!'
    >>> moo(0,'?')
    'M?'
    
        '''
        return "M"+"o"*oos+end
  4. Тестирование:
    george@inspiron:~/src/moo> python3 -m doctest Moo.py
    **********************************************************************
    File "/home/george/src/moo/Moo.py", line 13, in Moo.moo
    Failed example:
        moo(4)
    Expected:
        'Mooooo'
    Got:
        'Moooo'
    **********************************************************************
    1 items had failures:
       1 of   5 in Moo.moo
    ***Test Failed*** 1 failures.
  5. Отчёт (с успешными тестами):
    george@inspiron:~/src/moo> python3 -m doctest -v Moo.py
    Trying:
        moo()
    Expecting:
        'Moo'
    ok
    Trying:
        moo(4)
    Expecting:
        'Mooooo'
    **********************************************************************
    File "/home/george/src/moo/Moo.py", line 13, in Moo.moo
    Failed example:
        moo(4)
    Expected:
        'Mooooo'
    Got:
        'Moooo'
    Trying:
        moo(0)
    Expecting:
        'M'
    ok
    Trying:
        moo(end='!')
    Expecting:
        'Moo!'
    ok
    Trying:
        moo(0,'?')
    Expecting:
        'M?'
    ok
    1 items had no tests:
        Moo
    **********************************************************************
    1 items had failures:
       1 of   5 in Moo.moo
    5 tests in 2 items.
    4 passed and 1 failed.
    ***Test Failed*** 1 failures.

TODO

  • unittest
  • py.test , nose
  • tox

  • Показатель покрытия кода тестами (coverage)

TDD

  • Разработка_через_тестирование

    1. сначала пишется тест и заглушка
    2. код падает (иначе бесполезен)

    3. под тест пишется код
    4. код не падает
    5. код подчищается и не падает

Д/З

  • Осознать, что нуждается в unit-тестировании
  • Оснастить код семестрового проекта unit-тестами (любой фреймворк)
    • Зафиксировать в документации, как их запускать
  • Подумать над тестированием UI
    • например, с помощью порождения событий tkinter

LecturesCMC/PythonDevelopment2019/09_Testing (последним исправлял пользователь FrBrGeorge 2019-04-29 12:46:49)