Home Accessibility Courses Twitter The Mouth Facebook Resources Site Map About Us Contact
 
For 2023 (and 2024 ...) - we are now fully retired from IT training.
We have made many, many friends over 25 years of teaching about Python, Tcl, Perl, PHP, Lua, Java, C and C++ - and MySQL, Linux and Solaris/SunOS too. Our training notes are now very much out of date, but due to upward compatability most of our examples remain operational and even relevant ad you are welcome to make us if them "as seen" and at your own risk.

Lisa and I (Graham) now live in what was our training centre in Melksham - happy to meet with former delegates here - but do check ahead before coming round. We are far from inactive - rather, enjoying the times that we are retired but still healthy enough in mind and body to be active!

I am also active in many other area and still look after a lot of web sites - you can find an index ((here))
The principle of mocking - and the Python Mock package

When I'm writing code, or updating existing code, I need to test it before I release it as generally available.

There are lots of tests I might want to perform, to ensure that all conditions are checked, and that all past bugs have been fixed and have not re-appeared. And indeed as I develop the application, it's a good idea starting off with working out what it should do. All this lot comes under the enormous subject of "unittesting", "Test Driven Development" and "Behaviour Driven Development". For not only do you want to write good and thorough tests, but you also want to be able to run the all consistently, efficiently (= automatically) and have a system in place for managing the results of the tests so you can get a very quick "yes, all is fine" or a much more detailed "you have the following problems" report. Keywords / key packages in this business include things like unit test in Python and Cucumber and Gherkin in Ruby - though those latter form part of a system that you can use to test (web sites) no matter what language they're written in.

But one of the problems you have when testing is - its just that - TESTING. You don't want database changes that would result from your tests to actually appear in the live databases, and you want to get consistent results from the system even if it calls up data which is distincly inconsistent over time. For example, I look after a web application which displays train cancellations across the South West and I need to test it ... without having to wait for a train to be cancelled to do so (99.5% of services run!)

So - at the front of the application I'll use something like unittest and at the back I'll use mock objects. A mock object / mock method is where I replace the production API (application / programmer interface) of my database or remote data access class with another method of the same name, but one which does something much simpler and different for testing purposes. As long as the call is consistent and the returned results work in the narrow circumstanced that I need, it'll all work nicely and sweetly for testing, and the same code can work later on the real databse / connection.

Recent versions of Python (from 3.3) include a unittest.Mock class which allows you to define mocks through a provided structure. Within mock objects / methods you can include coverage checking (to make sure that all your calls have been exercised), call logging, and patches for individual methods rather than total class replacement - for example, my database accessors could remain unaltereed except that commit calls got replaces internally by rollbacks - allowing data read of live data during testing, but no changes being made to the database.

I've written a tiny ("hello mocking world") demo [here] in which I have mocked out the random number generator in favour of returing a single known fixed value. The source code for my application:

  import random
  
  def value():
    return random.randint(0,100)
  
  for k in range(6):
    print (value())


and when run, it might return something like:

  WomanWithCat:flask grahamellis$ python3 mzz
  47
  99
  46
  17
  33
  89
  WomanWithCat:flask grahamellis$


Add in a mock method to replace random.randint:

  import sys
  from unittest.mock import Mock
  random.randint = Mock(return_value = 456)


and when I run that now, I get a consistent result:

  WomanWithCat:flask grahamellis$ python3 mzz
  456
  456
  456
  456
  456
  456
  WomanWithCat:flask grahamellis$


A very simple example, but it gets you started. You can now embed that code in your application, add testing on the front

The Mock library is documented [here]. There is a LOT more you can do ...
(written 2015-10-17)

 
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
Q456 - Object Orientation and General technical topics - Test Driven Development and Behaviour Driven Development
  [4326] Learning to program - comments, documentation and test code - (2014-11-22)
  [4336] Test Driven Development - a first example of principle in C - (2014-12-01)
  [4346] A behaviour driven example of writing a Java program - (2014-12-09)
  [4374] Test driven development, and class design, from first principles (using C++) - (2014-12-30)
  [4380] Behaviour Driven Development / Ruby and Cucumber - (2015-01-02)
  [4387] Regression Testing my website - Cucumber and Watir - (2015-01-07)
  [4457] Test framework for TCL - Tcltest - some examples - (2015-03-11)
  [4634] Regression testing - via a very short C testing framework - (2016-01-29)
  [4652] Testing new algorithms in PHP - (2016-02-20)

Y212 - Python - Code testing, patterns, profiles and optimisation.
  [235] Preparation for a day's work - (2005-03-04)
  [1140] Python GTK - Widget, Packing, Event and Feedback example - (2007-04-09)
  [1146] __new__ v __init__ - python constructor alternatives? - (2007-04-14)
  [1148] Python decorators - wrapping a method call in extra code - (2007-04-15)
  [1555] Advanced Python, Perl, PHP and Tcl training courses / classes - (2008-02-25)
  [2123] Using Python with OpenOffice - (2009-04-09)
  [2616] Defining a static method - Java, Python and Ruby - (2010-02-01)
  [3441] Pressing ^C in a Python program. Also Progress Bar. - (2011-09-15)
  [3442] A demonstration of how many Python facilities work together - (2011-09-16)
  [3464] Passing optional and named parameters to python methods - (2011-10-04)
  [3478] Testing your Python classes with the unittest package - how to - (2011-10-14)
  [3658] Using Make for a distribution - (2012-03-17)
  [4090] Test Driven Development in Python - Customer Comes First - (2013-05-16)
  [4344] Python base and inherited classes, test harness and unit testing - new examples - (2014-12-07)
  [4446] Combining tests into suites, and suites into bigger suites - Python and unittest - (2015-03-01)
  [4470] Testing in Python 3 - unittest, doctest and __name__ == __main__ too. - (2015-04-21)
  [4538] Flask and unittest - hello web app test world - (2015-10-15)
  [4540] Unittest of a Flask application including forms - (2015-10-15)
  [4617] Pytest - starting example - (2016-01-07)
  [4618] Pytest - second example beyond hello world - (2016-01-08)
  [4716] Profiling your Python program - (2016-11-01)


Back to
Setting up and tearing down with the Python with keyword
Previous and next
or
Horse's mouth home
Forward to
Saturday morning at Well House Manor
Some other Articles
Is the RUH hopper a limited, duplicate service running unnecessarily and at high cost?
Method, Class, Module, Package - how to they relate in Python?
RSpec - Ruby testing (stand alone example / no cucumber)
Saturday morning at Well House Manor
The principle of mocking - and the Python Mock package
Setting up and tearing down with the Python with keyword
TransWilts public transport corridor
example of SQLite using a local database file through SQLalchemy
4759 posts, page by page
Link to page ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96 at 50 posts per page


This is a page archived from The Horse's Mouth at http://www.wellho.net/horse/ - the diary and writings of Graham Ellis. Every attempt was made to provide current information at the time the page was written, but things do move forward in our business - new software releases, price changes, new techniques. Please check back via our main site for current courses, prices, versions, etc - any mention of a price in "The Horse's Mouth" cannot be taken as an offer to supply at that price.

Link to Ezine home page (for reading).
Link to Blogging home page (to add comments).

You can Add a comment or ranking to this page

© WELL HOUSE CONSULTANTS LTD., 2024: 48 Spa Road • Melksham, Wiltshire • United Kingdom • SN12 7NY
PH: 01144 1225 708225 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho

PAGE: http://www.wellho.net/mouth/4542_.html • PAGE BUILT: Sun Oct 11 16:07:41 2020 • BUILD SYSTEM: JelliaJamb