Exceptions

&&

Unit Tests Python

Exceptions

  • SyntaxError
  • TypeError
  • NameError
  • ValueError

Raising Exceptions

raise statement

Handling exceptions

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("division by zero!")
    else:
        print("result is", result)
    finally:
        print("executing finally clause")
def divide(x, y):
    try:
        result = x / y
        return result
    except ZeroDivisionError:
        print("division by zero!")
    finally:
        print("executing finally clause")
def divide():
    while True:
        try:
            x = int(input("Please enter x: "))
            y = int(input("Please enter y: "))
            result = x / y
            return result
        except ZeroDivisionError:
            print("division by zero!")
        except ValueError:
            print("Please enter a valid number")
        finally:
            print("executing finally clause")

Handling exceptions(2)

assert statement

def divide(x, y):
    assert y is not 0
    assert type(y) is int
    assert type(x) is int

    return x / y

Защо пишем тестове?

  • да знаем във всеки момент кое от кода работи и кое не

  • по-удобен начин за тестване на програмата

  • по-лесна поддръжка(промяна) на кода

  • по-надежден софтуер

  • ... и още много причини

Как тестваме в Python? (1)

import unittest

from solution import gas_stations


class GasStationTests(unittest.TestCase):
    def test_works_correctly(self):
        self.assertEqual(gas_stations(320,
                                      90,
                                      [50, 80, 140, 180, 220, 290]),
                         [80, 140, 220, 290])
        self.assertEqual(gas_stations(390,
                                      80,
                                      [70, 90, 140, 210, 240, 280, 350]),
                         [70, 140, 210, 280, 350])

    def test_raise_value_error(self):
        with self.assertRaises(ValueError):
            gas_stations(320, -10, [50, 80, 140, 180, 220, 290])

if __name__ == '__main__':
    unittest.main()
  • импортваме unittest библиотеката
  • импортваме функционалностите (class- ве, методи) , които ще тестваме
  • създаме тестов class, който наследява unittest.TestCas

Как тестваме в Python? (2)

  • дефинираме методи (тестове), които са независими 1 от друг
  • в тестове използваме методите, които наследяваме от unittest - assertEqual(), assertTrue(), assertFalse() и т.н.

.... (3)

if __name__ == '__main__':
    unittest.main()
  • задължително поставяме накрая на тестовия файл

Как пускаме тестовете?

slavyana@slavyana-Inspiron-3537:~/A/week1$ python3 tests_week01_dive_into_python.py 
..........
----------------------------------------------------------------------
Ran 10 tests in 0.002s

OK
slavyana@slavyana-Inspiron-3537:~/A/week1$ watch python3 tests_week01_dive_into_python.py 
Every 2,0s: python3 tests_week01_dive_into_python.py  
-------------------------------------------------------------------
Ran 10 tests in 0.002s

OK

Правила

Добри практики

Всеки метод трябва да прави точно едно нещо!

Всеки тест трябва да проверява точно едно нещо!

И още ...

  • Тестовете трябва да са независими един от друг
  • Точни и ясни имена на тестовете
  • Тест за  всяко парче код
  • Хващане на частни случаи

Тестовете са най-добрия ви приятел !

Python101-2018 Testing

By Hack Bulgaria

Python101-2018 Testing

  • 1,227