diff --git a/module05_testing_your_code/05_00_introduction.ipynb b/module05_testing_your_code/05_00_introduction.ipynb index cdd7d50e3..48e253438 100644 --- a/module05_testing_your_code/05_00_introduction.ipynb +++ b/module05_testing_your_code/05_00_introduction.ipynb @@ -18,7 +18,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Introduction" + "## Introduction\n", + "\n", + "As we write code, we want to be sure that it does behaves the way we'd like it to - so we test it. Testing (and re-testing) our code is something that needs to be done regularly (ideally after every change to the code), comprehensively, quickly and reliably. In short testing is an task that is ideally suited to automation. \n", + "\n", + "We write additional code to test the behaviour for our main code. We use these terms to distinguish between the two types of code:\n", + "\n", + "* \"Production code\" - the code that fulfills the purpose of the software, and is run by the end user.\n", + "* \"Test code\" - additional code only used by software development team\n", + "\n", + "**For this module we are focusing on _automated testing_.**" ] }, { @@ -63,18 +72,14 @@ "source": [ "### Not a panacea\n", "\n", - "> Trying to improve the quality of software by doing more testing is like trying to lose weight by\n", - "> weighting yourself more often.\n", - " - Steve McConnell" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " * Testing won't corrrect a buggy code\n", - " * Testing will tell you were the bugs are...\n", - " * ... if the test cases *cover* the bugs" + "> \"Trying to improve the quality of software by doing more testing is like trying to lose weight by\n", + "> weighting yourself more often.\" - Steve McConnell\n", + "\n", + "* Testing won't correct a buggy code\n", + "* Testing will tell you were the bugs are...\n", + "* ... if (and only if) the test cases *cover* the scenarios that cause the bugs or occur.\n", + "\n", + "Also, automated tests only test a narrow interpretation of quality software development. They do *not* help test that your software is _useful_ and help solves a users' problem. We will touch on this again in Module 06.\n" ] }, { @@ -83,15 +88,15 @@ "source": [ "### Tests at different scales\n", "\n", - "Level of test | Area covered by test\n", - "----------------------- | ---------------------------------------------------------\n", - "**Unit testing** | smallest logical block of work (often < 10 lines of code)\n", - "**Component testing** | several logical blocks of work together\n", - "**Integration testing** | all components together / whole program\n", + "Level of test | Area covered by test | Notes\n", + "----------------------- | --------------------------------------------------------- | ---------------------\n", + "**Unit testing** | smallest logical block of work (often < 10 lines of code) | Unit tests should run fast (eg ~1/100th sec) so that they can be re-run regularly (eg every git commit). To achieve this they should not invoke network access or substantial disk access. \n", + "**Component testing** | several logical blocks of work together | These can be useful where you need to tease out the expected/useful behaviour of 3rd party libraries.\n", + "**Integration testing** | all components together / whole program | These can take longer to run, and can be run less often.\n", "\n", "\n", - "* Always start at the smallest scale! \n", - "* If a unit test is too complicated, go smaller." + "* When writing new code (see below) always start by creating tests at the smallest scale (unit tests). \n", + "* If a unit test is too complicated to write, then consider adjusting your production code (possibly by breaking it down into smaller, individually testable functions). Ensuring that your production code is easy to test is a healthy habit." ] }, { @@ -167,7 +172,7 @@ "display_name": "Testing Basics" }, "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3.10.0 64-bit ('3.10.0')", "language": "python", "name": "python3" }, @@ -181,7 +186,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.9" + "version": "3.10.0" + }, + "vscode": { + "interpreter": { + "hash": "44f733b714c696d9811e1e4790628c0e5019891ced3dbb8112bc5b951948cffb" + } } }, "nbformat": 4, diff --git a/module05_testing_your_code/05_01_how_to_test.ipynb b/module05_testing_your_code/05_01_how_to_test.ipynb index 80c878468..f9a8e63e4 100644 --- a/module05_testing_your_code/05_01_how_to_test.ipynb +++ b/module05_testing_your_code/05_01_how_to_test.ipynb @@ -18,7 +18,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Equivalence partitioning" + "## Choosing the scenarios to test - \"Equivalence partitioning\"" ] }, { @@ -83,14 +83,12 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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Z80HAMxgJX91AgAwUdY6AQDSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSCA0AII3QAADSlBwanZ2dsX379lixYkVUVVXFyZMnE8YCAGaDkkNjZGQk1q1bF4cOHcqYBwCYReaVesK2bdti27ZtEz6+WCxGsVgc3x4aGir1kiTrG4io21PuKQBu1jdQ7gmYCiWHRqna29ujra0t+zLchtGxiCv/KPcUAMxG6aHR2toaLS0t49tDQ0NRX1+ffVkmYNmyZeUeAeB/8t+qmS09NAqFQhQKhezLMAnd3d3lHgGAWc6ftwIAaYQGAJCm5K9OhoeH49KlS+PbH330UfT29saiRYuioaFhSocDAGa2kkOju7s7HnvssfHtLx/03L17dxw9enTKBgMAZr6SQ2PLli0xNjaWMQsAMMt4RgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASCM0AIA0QgMASDOp0Dh06FB861vfigULFsTmzZvjT3/601TPBQDMAiWHxuuvvx4tLS2xb9++OH/+fKxbty6+973vxdWr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\n", "text/plain": [ - "
" + "
" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -157,7 +155,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -186,7 +184,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -282,7 +280,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -304,7 +302,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW0AAAD8CAYAAAC8TPVwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKNklEQVR4nO3cQail9XnH8d/TGUvCxJJFp0EcwS6KEgKN7cUuLKUVEmwiaZeRJKvAbNpiSCE0yyy6Ddl00UsjbYmNBIxQLE0rxCBCorljNFUnLSERqghzpQ3RTYrm6eIemcG503OmuWfeeWY+H7jMOc7f68PL9evre/7/qe4OADP80tIDALA50QYYRLQBBhFtgEFEG2AQ0QYY5Pgmi6rqpSSvJ3kryZvdvbPNoQA43EbRXvmD7n5ta5MAsJbHIwCD1CYnIqvqx0n+O0kn+evu3j1kzekkp5PkxIkTv3377bcf8agA164zZ8681t0n163bNNo3d/crVfVrSR5L8mfd/cSl1u/s7PTe3t5lDQxwPauqM5t8XrjR45HufmX167kkjyS58xcbD4D/j7XRrqoTVXXj26+TfDjJ89seDICLbbJ75H1JHqmqt9f/Q3d/Y6tTAXCotdHu7h8l+c0rMAsAa9jyBzCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg2wc7ao6VlXfq6pHtzkQAJd2OXfa9yc5u61BAFjv+CaLqupUko8m+cskn93qRNeQqlp6BLjqdffSI4yy6Z32l5J8LsnPL7Wgqk5X1V5V7e3v7x/FbAC8w9o77aq6N8m57j5TVb9/qXXdvZtkN0l2dnb8p/MC/eDSEyyrPvH2Kz8WycH/fV3vPxPJhT8XXI5N7rTvSvKxqnopyUNJ7q6qr2x1KgAOtTba3f357j7V3bcm+XiSb3b3J7c+GQAXsU8bYJCNdo+8rbu/leRbW5kEgLXcaQMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg6yNdlW9q6qerqrnquqFqvrClRgMgIsd32DNz5Lc3d1vVNUNSZ6sqn/u7u9seTYA3mFttLu7k7yxenvD6qu3ORQAh9vomXZVHauqZ5OcS/JYdz91yJrTVbVXVXv7+/tHPCYAyYbR7u63uvuDSU4lubOqPnDImt3u3ununZMnTx7xmAAkl7l7pLt/kuTxJPdsZRoA/k+b7B45WVXvXb1+d5IPJfnBlucC4BCb7B65KcnfVdWxHET+a9396HbHAuAwm+we+X6SO67ALACs4UQkwCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMsjbaVXVLVT1eVS9W1QtVdf+VGAyAix3fYM2bSf68u5+pqhuTnKmqx7r7xS3PBsA7rI12d7+a5NXV69er6mySm5OINpeplh4AxrusZ9pVdWuSO5I8dcjvna6qvara29/fP6LxALjQJo9HkiRV9Z4kDyf5THf/9J2/3927SXaTZGdnp49sQsbrB5eeAK4dG91pV9UNOQj2g9399e2OBMClbLJ7pJJ8OcnZ7v7i9kcC4FI2udO+K8mnktxdVc+uvj6y5bkAOMQmu0eejI/9Aa4KTkQCDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOsjXZVPVBV56rq+SsxEACXtsmd9t8muWfLcwCwgePrFnT3E1V16xWY5ZpVn1h6AuBacWTPtKvqdFXtVdXe/v7+UX1bAC6w9k57U929m2Q3SXZ2dvqovu9k3S4DcLTsHgEYRLQBBtlky99Xk3w7yW1V9XJVfXr7YwFwmE12j9x3JQYBYD2PRwAGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYJCNol1V91TVv1fVD6vqL7Y9FACHWxvtqjqW5K+S/GGS9ye5r6rev+3BALjYJnfadyb5YXf/qLv/J8lDSf5ou2MBcJjjG6y5Ocl/XvD+5SS/885FVXU6yenV259V1fO/+HjXhF9N8trSQ1wFXIfzXIvzXIvzbttk0SbR3kh37ybZTZKq2uvunaP63pO5Fgdch/Nci/Nci/Oqam+TdZs8HnklyS0XvD+1+msAXGGbRPu7SX6jqn69qn45yceT/ON2xwLgMGsfj3T3m1X1p0n+JcmxJA909wtr/rbdoxjuGuFaHHAdznMtznMtztvoWlR3b3sQAI6IE5EAg4g2wCBHGm3H3Q9U1QNVdc5e9aSqbqmqx6vqxap6oaruX3qmpVTVu6rq6ap6bnUtvrD0TEurqmNV9b2qenTpWZZUVS9V1b9V1bPrtv4d2TPt1XH3/0jyoRwcwPlukvu6+8Uj+QcMUlW/l+SNJH/f3R9Yep4lVdVNSW7q7meq6sYkZ5L88XX6c1FJTnT3G1V1Q5Ink9zf3d9ZeLTFVNVnk+wk+ZXuvnfpeZZSVS8l2enutQeNjvJO23H3le5+Isl/LT3H1aC7X+3uZ1avX09yNgenbK87feCN1dsbVl/X7U6AqjqV5KNJ/mbpWSY5ymgfdtz9uvyXk8NV1a1J7kjy1MKjLGb1OODZJOeSPNbd1+21SPKlJJ9L8vOF57gadJJ/raozqz8S5JJ8EMkVUVXvSfJwks9090+Xnmcp3f1Wd38wByeL76yq6/LxWVXdm+Rcd59ZeparxO9292/l4E9T/ZPVI9ZDHWW0HXfnUKvntw8nebC7v770PFeD7v5JkseT3LPwKEu5K8nHVs9yH0pyd1V9ZdmRltPdr6x+PZfkkRw8bj7UUUbbcXcusvrw7ctJznb3F5eeZ0lVdbKq3rt6/e4cfGj/g0WHWkh3f767T3X3rTloxTe7+5MLj7WIqjqx+pA+VXUiyYeTXHLn2ZFFu7vfTPL2cfezSb62wXH3a1JVfTXJt5PcVlUvV9Wnl55pQXcl+VQO7qSeXX19ZOmhFnJTkser6vs5uMl5rLuv661uJEnel+TJqnouydNJ/qm7v3GpxY6xAwzig0iAQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhjkfwHsmSuCzQqqIwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -326,7 +324,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW0AAAD8CAYAAAC8TPVwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKQ0lEQVR4nO3dQaild3nH8d/TmRRlTHHRqYRMIF2UBBFq6iVdpJQ2oKQabJcGdSXMpi0RC6JLF92Kmy461NAWU4MQAyWltgEjIaCJd2Jik4wtYgNNEOaGVkw2lsSni3vChMwdz0k9Z955Zj4fuNxzZt658/Ay85133vP/31PdHQBm+JWlBwBgc6INMIhoAwwi2gCDiDbAIKINMMjxTQ6qqheSvJLk9SSvdffeLocC4GgbRXvlD7v75Z1NAsBabo8ADFKb7Iisqv9M8j9JOslfd/eZI445neR0kpw4ceIDt95665ZHBdi+s2fPLj3CG17u7pPrDto02jd290tV9RtJHkny59392KWO39vb6/39/bc1LcASqmr1aMlv6VFJcnaT1ws3uj3S3S+tPp9P8lCS23+Z8QD4/1kb7ao6UVXXv/E4yYeSPLvrwQC42CarR96T5KHVfyGOJ/mH7v7GTqcC4Ehro93dP0ry25dhFgDWsOQPYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEG2eRNEACuAbX+kCuAK22AQVxpA9e07iXfhf2CC+8K/4u50gYYRLQBBhFtgEFEG2AQ0QYYRLQBBhFtgEFEG2AQ0QYYRLQBBhFtgEFEG2AQ0QYYRLQBBhFtgEFEG2AQ0QYYZONoV9WxqvpeVT28y4EAuLS3c6V9b5JzuxoEgPU2eo/IqjqV5CNJ/jLJZ3Y60VVk0/d8g2vZlfIejVNseqX9pSSfTfLzSx1QVaerar+q9g8ODrYxGwBvsfZKu6ruTnK+u89W1R9c6rjuPpPkTJLs7e35p/NN+v6lJ4ArT3186Qlm2uRK+44kH62qF5I8kOTOqvrKTqcC4Ehro93dn+/uU919c5KPJflmd39i55MBcBHrtAEG2Wj1yBu6+1tJvrWTSQBYy5U2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTCIaAMMItoAg4g2wCCiDTDI2mhX1Tuq6smqeqaqnquqL1yOwQC42PENjvlZkju7+9Wqui7J41X1z939nR3PBsBbrI12d3eSV1dPr1t99C6HAuBoG93TrqpjVfV0kvNJHunuJ4445nRV7VfV/sHBwZbHBCDZMNrd/Xp3vz/JqSS3V9X7jjjmTHfvdffeyZMntzwmAMnbXD3S3T9J8miSu3YyDQC/0CarR05W1btXj9+Z5INJfrDjuQA4wiarR25I8ndVdSyHkf9adz+827EAOMomq0e+n+S2yzALAGvYEQkwiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOsjXZV3VRVj1bV81X1XFXdezkGA+Bixzc45rUkf9HdT1XV9UnOVtUj3f38jmcD4C3WXml394+7+6nV41eSnEty464HA+Bib+uedlXdnOS2JE8c8XOnq2q/qvYPDg62NB4Ab7ZxtKvqXUkeTPLp7v7pW3++u89091537508eXKbMwKwslG0q+q6HAb7/u7++m5HAuBSNlk9Ukm+nORcd39x9yMBcCmbXGnfkeSTSe6sqqdXHx/e8VwAHGHtkr/ufjxJXYZZAFjDjkiAQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYBDRBhhEtAEGEW2AQUQbYJC10a6q+6rqfFU9ezkGAuDSNrnS/tskd+14DgA2cHzdAd39WFXdfBlmuWrVx5eeALhabO2edlWdrqr9qto/ODjY1pcF4E3WXmlvqrvPJDmTJHt7e72trztZt9MAbJfVIwCDiDbAIJss+ftqkm8nuaWqXqyqT+1+LACOssnqkXsuxyAArOf2CMAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDCLaAIOINsAgog0wiGgDDLJRtKvqrqr696r6YVV9btdDAXC0tdGuqmNJ/irJHyV5b5J7quq9ux4MgIttcqV9e5IfdvePuvt/kzyQ5I93OxYARzm+wTE3JvmvNz1/McnvvvWgqjqd5PTq6c+q6tlffryrwq8neXnpIa4AzsMFzsUFzsUFt2xy0CbR3kh3n0lyJkmqar+797b1tSdzLg45Dxc4Fxc4FxdU1f4mx21ye+SlJDe96fmp1Y8BcJltEu3vJvmtqvrNqvrVJB9L8o+7HQuAo6y9PdLdr1XVnyX5lyTHktzX3c+t+WVntjHcVcK5OOQ8XOBcXOBcXLDRuaju3vUgAGyJHZEAg4g2wCBbjbbt7oeq6r6qOm+telJVN1XVo1X1fFU9V1X3Lj3TUqrqHVX1ZFU9szoXX1h6pqVV1bGq+l5VPbz0LEuqqheq6t+q6ul1S/+2dk97td39P5J8MIcbcL6b5J7ufn4rv8EgVfX7SV5N8vfd/b6l51lSVd2Q5Ibufqqqrk9yNsmfXKN/LirJie5+taquS/J4knu7+zsLj7aYqvpMkr0kv9bddy89z1Kq6oUke929dqPRNq+0bXdf6e7Hkvz30nNcCbr7x9391OrxK0nO5XCX7TWnD726enrd6uOaXQlQVaeSfCTJ3yw9yyTbjPZR292vyb+cHK2qbk5yW5InFh5lMavbAU8nOZ/kke6+Zs9Fki8l+WySny88x5Wgk/xrVZ1dfUuQS/JCJJdFVb0ryYNJPt3dP116nqV09+vd/f4c7iy+vaquydtnVXV3kvPdfXbpWa4Qv9fdv5PD76b6p6tbrEfaZrRtd+dIq/u3Dya5v7u/vvQ8V4Lu/kmSR5PctfAoS7kjyUdX93IfSHJnVX1l2ZGW090vrT6fT/JQDm83H2mb0bbdnYusXnz7cpJz3f3FpedZUlWdrKp3rx6/M4cv2v9g0aEW0t2f7+5T3X1zDlvxze7+xMJjLaKqTqxepE9VnUjyoSSXXHm2tWh392tJ3tjufi7J1zbY7n5VqqqvJvl2kluq6sWq+tTSMy3ojiSfzOGV1NOrjw8vPdRCbkjyaFV9P4cXOY909zW91I0kyXuSPF5VzyR5Msk/dfc3LnWwbewAg3ghEmAQ0QYYRLQBBhFtgEFEG2AQ0QYYRLQBBvk/jvsxVU+l0igAAAAASUVORK5CYII=\n", + "image/png": "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", "text/plain": [ "
" ] @@ -348,7 +346,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -370,7 +368,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -408,7 +406,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -440,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -449,7 +447,7 @@ "1.0" ] }, - "execution_count": 12, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -469,12 +467,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "But we can do better, we can write code which **raises an error** if it gets an unexpected answer:" + "But we can do better - we don't want to have to manually check our results. We can use the `assert` statement for this:\n", + "```\n", + "assert \n", + "```\n", + "If `` evaluate to `True` carry on. If not, raise an error." ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -483,7 +485,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -492,7 +494,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -501,7 +503,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 9, "metadata": { "tags": [ "raises-exception" @@ -515,7 +517,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/var/folders/q7/nl3w6z854711jwsdy0hj7sxhwypcgh/T/ipykernel_66962/4204330994.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32massert\u001b[0m \u001b[0moverlap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4.0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m4.5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4.5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0.0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "Cell \u001b[0;32mIn [9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m overlap((\u001b[38;5;241m1.0\u001b[39m, \u001b[38;5;241m1.0\u001b[39m, \u001b[38;5;241m4.0\u001b[39m, \u001b[38;5;241m4.0\u001b[39m), (\u001b[38;5;241m4.5\u001b[39m, \u001b[38;5;241m4.5\u001b[39m, \u001b[38;5;241m5\u001b[39m, \u001b[38;5;241m5\u001b[39m)) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0.0\u001b[39m\n", "\u001b[0;31mAssertionError\u001b[0m: " ] } @@ -526,7 +528,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -543,19 +545,17 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "
" + "
" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -579,7 +579,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -607,7 +607,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -628,7 +628,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -697,7 +697,9 @@ "## Positive *and* negative tests\n", "\n", "* **Positive tests**: code should give correct answer with various inputs\n", - "* **Negative tests**: code should crash as expected given invalid inputs, rather than lying\n", + "* **Negative tests**: code should behave appropriately* given invalid inputs, rather than lying\n", + "\n", + "*(It is up to you to decide what is \"appropriate\" behaviour in your context.)\n", "\n", "
\n", "Bad input should be expected and should fail early and explicitly.\n", @@ -780,7 +782,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "There are standard \"Exception\" types, like `ValueError` we can `raise`" + "There are standard \"Exception\" types, like `ValueError` we can `raise` (more on this in Module 08.03)" ] }, { @@ -807,11 +809,26 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "## A note on Test-Driven Development (TDD)\n", + "\n", + "In the overlapping fields example above we planned some of our test scenarios _before_ writing the `overlap` function. This is an example of \"Test-Driven Development (TDD)\". This was a particularly fashionable approach to development a few years ago. Some TDD advocates have taken an uncompromising approach which has led to it slightly falling out of favour more recently. However, it is worth retaining the benefits that caused its initial popularity.\n", + "\n", + "In its \"purest\"/uncompromising form:\n", + "\n", + "* Always write and commit your tests _before_ the related production code.\n", + "* Always write tests to cover every line of your production code (we'll cover how to measure this in the next module).\n", + "\n", + "A more pragmatic interpretation might be:\n", + "\n", + "* Write your tests simultaneously with your production code.\n", + "* Allow your tests to affect the design of your production code - i.e. ensure that your production code is _testable_.\n", + "* When you are stuck, break down the problem into smaller, testable stages.\n", + "* Ensure that your tests cover (i) the core function of the software and (ii) any input sanity checking.\n", + "\n" + ] } ], "metadata": { @@ -833,9 +850,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.9" + "version": "3.8.13" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } diff --git a/module05_testing_your_code/05_02_testing_frameworks.ipynb b/module05_testing_your_code/05_02_testing_frameworks.ipynb index bf3519801..3f13801f6 100644 --- a/module05_testing_your_code/05_02_testing_frameworks.ipynb +++ b/module05_testing_your_code/05_02_testing_frameworks.ipynb @@ -215,9 +215,9 @@ "output_type": "stream", "text": [ "============================= test session starts ==============================\n", - "platform darwin -- Python 3.9.9, pytest-7.1.2, pluggy-1.0.0\n", - "rootdir: /Users/jroberts/GitHub/rse-course/module05_testing_your_code/saskatchewan\n", - "plugins: anyio-3.6.1, cov-3.0.0\n", + "platform darwin -- Python 3.8.13, pytest-7.2.0, pluggy-1.0.0\n", + "rootdir: /Users/a.smith/code/teaching/rse-course/module05_testing_your_code/saskatchewan\n", + "plugins: cov-4.0.0, anyio-3.6.2, pylama-8.4.1\n", "collected 3 items\n", "\n", "test_overlap.py ..F [100%]\n", @@ -233,7 +233,7 @@ "test_overlap.py:13: AssertionError\n", "=========================== short test summary info ============================\n", "FAILED test_overlap.py::test_no_overlap - assert 0.25 == 0.0\n", - "========================= 1 failed, 2 passed in 0.07s ==========================\n", + "========================= 1 failed, 2 passed in 0.08s ==========================\n", "Tests failed\n" ] } @@ -280,6 +280,31 @@ "* run only tests for a given feature: `pytest -k foo` # tests with 'foo' in the test name" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Coverage reports\n", + "\n", + "Using `pytest` it is possisble to see, which lines of code have or haven't been execuded by you tests.\n", + "\n", + "The command below will produce a html files which highlights the coverage of your tests." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "#%%cmd #(windows)\n", + "cd saskatchewan\n", + "pytest --cov=. --cov-report=html || echo \"Tests failed\"\n", + "# MacOS:\n", + "# open htmlcov/index.html" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -533,9 +558,14 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.9" + "version": "3.8.13" + }, + "vscode": { + "interpreter": { + "hash": "44f733b714c696d9811e1e4790628c0e5019891ced3dbb8112bc5b951948cffb" + } } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 }