Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python testing

Python testing

Talk presented at Python Lima meetup

Avatar for Erick Navarro

Erick Navarro

November 22, 2018

Other Decks in Technology

Transcript

  1. Who am I? >>> import erick { "full_name": "Erick Navarro",

    "email": "[email protected]", "twitter": "@erickgnavar" } Testing in Python - Erick Navarro - @erickgnavar 2
  2. Why don't we do tests? 4 Lazyness Testing in Python

    - Erick Navarro - @erickgnavar 5
  3. Why don't we do tests? 4 Lazyness 4 Deadlines Testing

    in Python - Erick Navarro - @erickgnavar 5
  4. Why don't we do tests? 4 Lazyness 4 Deadlines 4

    Think they are useless Testing in Python - Erick Navarro - @erickgnavar 5
  5. Code without tests is broken as designed. 1 Jacob Kaplan-Moss

    Testing in Python - Erick Navarro - @erickgnavar 6
  6. Why testing? 4 Ensure code behaviour 4 To be sure

    (mostly) your changes don't break other modules Testing in Python - Erick Navarro - @erickgnavar 7
  7. Why testing? 4 Ensure code behaviour 4 To be sure

    (mostly) your changes don't break other modules 4 Notice bugs "easily" Testing in Python - Erick Navarro - @erickgnavar 7
  8. Why testing? 4 Ensure code behaviour 4 To be sure

    (mostly) your changes don't break other modules 4 Notice bugs "easily" 4 Make maintainable software Testing in Python - Erick Navarro - @erickgnavar 7
  9. Why testing? 4 Ensure code behaviour 4 To be sure

    (mostly) your changes don't break other modules 4 Notice bugs "easily" 4 Make maintainable software 4 Be kind with future developers Testing in Python - Erick Navarro - @erickgnavar 7
  10. Some terms you might have heard about 4 Unit test

    Testing in Python - Erick Navarro - @erickgnavar 8
  11. Some terms you might have heard about 4 Unit test

    4 Integration test Testing in Python - Erick Navarro - @erickgnavar 8
  12. Some terms you might have heard about 4 Unit test

    4 Integration test 4 TDD Testing in Python - Erick Navarro - @erickgnavar 8
  13. Some terms you might have heard about 4 Unit test

    4 Integration test 4 TDD 4 BDD Testing in Python - Erick Navarro - @erickgnavar 8
  14. Some terms you might have heard about 4 Unit test

    4 Integration test 4 TDD 4 BDD 4 Mock Testing in Python - Erick Navarro - @erickgnavar 8
  15. Some terms you might have heard about 4 Unit test

    4 Integration test 4 TDD 4 BDD 4 Mock 4 Stubs Testing in Python - Erick Navarro - @erickgnavar 8
  16. Some terms you might have heard about 4 Unit test

    4 Integration test 4 TDD 4 BDD 4 Mock 4 Stubs 4 Coverage Testing in Python - Erick Navarro - @erickgnavar 8
  17. # simple_test.py def sum(a, b): return a + b assert

    sum(1, 2) == 3, "Your math is wrong!" Run the "test" $ python simple_test.py Testing in Python - Erick Navarro - @erickgnavar 12
  18. Dummy test case # test_dummy.py import unittest class DummyTestCase(unittest.TestCase): def

    test_dummy(self): self.assertEqual(1, 1) Testing in Python - Erick Navarro - @erickgnavar 14
  19. Dummy test case # test_dummy.py import unittest class DummyTestCase(unittest.TestCase): def

    test_dummy(self): self.assertEqual(1, 1) Testing in Python - Erick Navarro - @erickgnavar 14
  20. Dummy test case # test_dummy.py import unittest class DummyTestCase(unittest.TestCase): def

    test_dummy(self): self.assertEqual(1, 1) Testing in Python - Erick Navarro - @erickgnavar 14
  21. Dummy test case # test_dummy.py import unittest class DummyTestCase(unittest.TestCase): def

    test_dummy(self): self.assertEqual(1, 1) Testing in Python - Erick Navarro - @erickgnavar 14
  22. Dummy test case # test_dummy.py import unittest class DummyTestCase(unittest.TestCase): def

    test_dummy(self): self.assertEqual(1, 1) Testing in Python - Erick Navarro - @erickgnavar 14
  23. Dummy test case # test_dummy.py import unittest class DummyTestCase(unittest.TestCase): def

    test_dummy(self): self.assertEqual(1, 1) Testing in Python - Erick Navarro - @erickgnavar 14
  24. # beer.py def fetch_weather(city): # make a request to some

    API def calculate_beer_price(): temp = fetch_weather("Lima") if temp > 25.0: return 10.5 else: return 8.0 Testing in Python - Erick Navarro - @erickgnavar 19
  25. # beer.py def fetch_weather(city): # make a request to some

    API def calculate_beer_price(): temp = fetch_weather("Lima") if temp > 25.0: return 10.5 else: return 8.0 Testing in Python - Erick Navarro - @erickgnavar 19
  26. # beer.py def fetch_weather(city): # make a request to some

    API def calculate_beer_price(): temp = fetch_weather("Lima") if temp > 25.0: return 10.5 else: return 8.0 Testing in Python - Erick Navarro - @erickgnavar 19
  27. # beer.py def fetch_weather(city): # make a request to some

    API def calculate_beer_price(): temp = fetch_weather("Lima") if temp > 25.0: return 10.5 else: return 8.0 Testing in Python - Erick Navarro - @erickgnavar 19
  28. # beer.py def fetch_weather(city): # make a request to some

    API def calculate_beer_price(): temp = fetch_weather("Lima") if temp > 25.0: return 10.5 else: return 8.0 Testing in Python - Erick Navarro - @erickgnavar 19
  29. Simple example from unittest import mock @mock.patch("utils.sum") def test_dummy(self, mock_sum):

    mock_sum.return_value = 10 value = sum(1, 2) self.assertEqual(value, 10) Testing in Python - Erick Navarro - @erickgnavar 22
  30. Simple example from unittest import mock @mock.patch("utils.sum") def test_dummy(self, mock_sum):

    mock_sum.return_value = 10 value = sum(1, 2) self.assertEqual(value, 10) Testing in Python - Erick Navarro - @erickgnavar 22
  31. Simple example from unittest import mock @mock.patch("utils.sum") def test_dummy(self, mock_sum):

    mock_sum.return_value = 10 value = sum(1, 2) self.assertEqual(value, 10) Testing in Python - Erick Navarro - @erickgnavar 22
  32. Simple example from unittest import mock @mock.patch("utils.sum") def test_dummy(self, mock_sum):

    mock_sum.return_value = 10 value = sum(1, 2) self.assertEqual(value, 10) Testing in Python - Erick Navarro - @erickgnavar 22
  33. Simple example from unittest import mock @mock.patch("utils.sum") def test_dummy(self, mock_sum):

    mock_sum.return_value = 10 value = sum(1, 2) self.assertEqual(value, 10) Testing in Python - Erick Navarro - @erickgnavar 22
  34. Simple example from unittest import mock @mock.patch("utils.sum") def test_dummy(self, mock_sum):

    mock_sum.return_value = 10 value = sum(1, 2) self.assertEqual(value, 10) Testing in Python - Erick Navarro - @erickgnavar 22
  35. Testing beer.py # test_beer.py import unittest from unittest import mock

    from beer import calculate_beer_price class BeerTestCase(unittest.TestCase): def test_calculate_price_on_sunny_day(self): ... def test_calculate_price_on_cloudy_day(self): ... Testing in Python - Erick Navarro - @erickgnavar 23
  36. Testing beer.py # test_beer.py import unittest from unittest import mock

    from beer import calculate_beer_price class BeerTestCase(unittest.TestCase): def test_calculate_price_on_sunny_day(self): ... def test_calculate_price_on_cloudy_day(self): ... Testing in Python - Erick Navarro - @erickgnavar 23
  37. Testing beer.py # test_beer.py import unittest from unittest import mock

    from beer import calculate_beer_price class BeerTestCase(unittest.TestCase): def test_calculate_price_on_sunny_day(self): ... def test_calculate_price_on_cloudy_day(self): ... Testing in Python - Erick Navarro - @erickgnavar 23
  38. Testing beer.py # test_beer.py import unittest from unittest import mock

    from beer import calculate_beer_price class BeerTestCase(unittest.TestCase): def test_calculate_price_on_sunny_day(self): ... def test_calculate_price_on_cloudy_day(self): ... Testing in Python - Erick Navarro - @erickgnavar 23
  39. Testing beer.py # test_beer.py import unittest from unittest import mock

    from beer import calculate_beer_price class BeerTestCase(unittest.TestCase): def test_calculate_price_on_sunny_day(self): ... def test_calculate_price_on_cloudy_day(self): ... Testing in Python - Erick Navarro - @erickgnavar 23
  40. Testing beer.py # test_beer.py import unittest from unittest import mock

    from beer import calculate_beer_price class BeerTestCase(unittest.TestCase): def test_calculate_price_on_sunny_day(self): ... def test_calculate_price_on_cloudy_day(self): ... Testing in Python - Erick Navarro - @erickgnavar 23
  41. Testing beer.py # test_beer.py import unittest from unittest import mock

    from beer import calculate_beer_price class BeerTestCase(unittest.TestCase): def test_calculate_price_on_sunny_day(self): ... def test_calculate_price_on_cloudy_day(self): ... Testing in Python - Erick Navarro - @erickgnavar 23
  42. @mock.patch("beer.fetch_weather") def test_calculate_price_on_sunny_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 30 price = calculate_beer_price()

    self.assertEqual(price, 10.5) @mock.patch("beer.fetch_weather") def test_calculate_price_on_cloudy_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 15 price = calculate_beer_price() self.assertEqual(price, 8.0) Testing in Python - Erick Navarro - @erickgnavar 24
  43. @mock.patch("beer.fetch_weather") def test_calculate_price_on_sunny_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 30 price = calculate_beer_price()

    self.assertEqual(price, 10.5) @mock.patch("beer.fetch_weather") def test_calculate_price_on_cloudy_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 15 price = calculate_beer_price() self.assertEqual(price, 8.0) Testing in Python - Erick Navarro - @erickgnavar 24
  44. @mock.patch("beer.fetch_weather") def test_calculate_price_on_sunny_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 30 price = calculate_beer_price()

    self.assertEqual(price, 10.5) @mock.patch("beer.fetch_weather") def test_calculate_price_on_cloudy_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 15 price = calculate_beer_price() self.assertEqual(price, 8.0) Testing in Python - Erick Navarro - @erickgnavar 24
  45. @mock.patch("beer.fetch_weather") def test_calculate_price_on_sunny_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 30 price = calculate_beer_price()

    self.assertEqual(price, 10.5) @mock.patch("beer.fetch_weather") def test_calculate_price_on_cloudy_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 15 price = calculate_beer_price() self.assertEqual(price, 8.0) Testing in Python - Erick Navarro - @erickgnavar 24
  46. @mock.patch("beer.fetch_weather") def test_calculate_price_on_sunny_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 30 price = calculate_beer_price()

    self.assertEqual(price, 10.5) @mock.patch("beer.fetch_weather") def test_calculate_price_on_cloudy_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 15 price = calculate_beer_price() self.assertEqual(price, 8.0) Testing in Python - Erick Navarro - @erickgnavar 24
  47. @mock.patch("beer.fetch_weather") def test_calculate_price_on_sunny_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 30 price = calculate_beer_price()

    self.assertEqual(price, 10.5) @mock.patch("beer.fetch_weather") def test_calculate_price_on_cloudy_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 15 price = calculate_beer_price() self.assertEqual(price, 8.0) Testing in Python - Erick Navarro - @erickgnavar 24
  48. @mock.patch("beer.fetch_weather") def test_calculate_price_on_sunny_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 30 price = calculate_beer_price()

    self.assertEqual(price, 10.5) @mock.patch("beer.fetch_weather") def test_calculate_price_on_cloudy_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 15 price = calculate_beer_price() self.assertEqual(price, 8.0) Testing in Python - Erick Navarro - @erickgnavar 24
  49. @mock.patch("beer.fetch_weather") def test_calculate_price_on_sunny_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 30 price = calculate_beer_price()

    self.assertEqual(price, 10.5) @mock.patch("beer.fetch_weather") def test_calculate_price_on_cloudy_day(self, mock_fetch_weather): mock_fetch_weather.return_value = 15 price = calculate_beer_price() self.assertEqual(price, 8.0) Testing in Python - Erick Navarro - @erickgnavar 24
  50. # beer.py v2 def fetch_weather(city): """Returns None if there is

    no network""" # make a request to some API def calculate_beer_price(): temp = fetch_weather("Lima") if temp is None: return 9.0 elif temp > 25.0: return 10.5 else: return 8.0 Testing in Python - Erick Navarro - @erickgnavar 28
  51. # beer.py v2 def fetch_weather(city): """Returns None if there is

    no network""" # make a request to some API def calculate_beer_price(): temp = fetch_weather("Lima") if temp is None: return 9.0 elif temp > 25.0: return 10.5 else: return 8.0 Testing in Python - Erick Navarro - @erickgnavar 28
  52. # beer.py v2 def fetch_weather(city): """Returns None if there is

    no network""" # make a request to some API def calculate_beer_price(): temp = fetch_weather("Lima") if temp is None: return 9.0 elif temp > 25.0: return 10.5 else: return 8.0 Testing in Python - Erick Navarro - @erickgnavar 28
  53. Testing beer.py v2 import unittest from unittest import mock from

    beer import calculate_beer_price class BeerTestCase(unittest.TestCase): def test_calculate_price_on_sunny_day(self): ... def test_calculate_price_on_cloudy_day(self): ... def test_calculate_price_with_no_weather(self): ... Testing in Python - Erick Navarro - @erickgnavar 29
  54. Testing side effects @mock.patch("beer.fetch_weather") def test_calculate_price_with_no_weather(self, mock_fetch_weather): mock_fetch_weather.side_effect = NetworkError()

    price = calculate_beer_price() self.assertEqual(price, 9.0) Testing in Python - Erick Navarro - @erickgnavar 30
  55. Testing side effects @mock.patch("beer.fetch_weather") def test_calculate_price_with_no_weather(self, mock_fetch_weather): mock_fetch_weather.side_effect = NetworkError()

    price = calculate_beer_price() self.assertEqual(price, 9.0) Testing in Python - Erick Navarro - @erickgnavar 30
  56. Testing side effects @mock.patch("beer.fetch_weather") def test_calculate_price_with_no_weather(self, mock_fetch_weather): mock_fetch_weather.side_effect = NetworkError()

    price = calculate_beer_price() self.assertEqual(price, 9.0) Testing in Python - Erick Navarro - @erickgnavar 30
  57. Testing side effects @mock.patch("beer.fetch_weather") def test_calculate_price_with_no_weather(self, mock_fetch_weather): mock_fetch_weather.side_effect = NetworkError()

    price = calculate_beer_price() self.assertEqual(price, 9.0) Testing in Python - Erick Navarro - @erickgnavar 30
  58. Testing side effects @mock.patch("beer.fetch_weather") def test_calculate_price_with_no_weather(self, mock_fetch_weather): mock_fetch_weather.side_effect = NetworkError()

    price = calculate_beer_price() self.assertEqual(price, 9.0) Testing in Python - Erick Navarro - @erickgnavar 30
  59. Final thoughts 4 We don't have to test the whole

    application Testing in Python - Erick Navarro - @erickgnavar 32
  60. Final thoughts 4 We don't have to test the whole

    application 4 Testing helps you to do better code Testing in Python - Erick Navarro - @erickgnavar 32
  61. Final thoughts 4 We don't have to test the whole

    application 4 Testing helps you to do better code 4 100% test coverage doesn't ensure the code is free of bugs Testing in Python - Erick Navarro - @erickgnavar 32
  62. Final thoughts 4 We don't have to test the whole

    application 4 Testing helps you to do better code 4 100% test coverage doesn't ensure the code is free of bugs 4 One test at time Testing in Python - Erick Navarro - @erickgnavar 32