{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Context\n", "John Doe remarked in [#AP1432](http://www.example.com/justalink) that there may be too much code in our application that isn't used at all. Before migrating the application to the new platform, we have to analyze which parts of the system are still in use and which are not." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Idea\n", "To understand how much code isn't used, we recorded the executed code in production with the coverage tool [JaCoCo](http://www.jacoco.org/). The measurement took place between 21st Oct 2017 and 27st Oct 2017. The results were exported into a CSV file using the JaCoCo command line tool with the following command:\n", "\n", "```bash\n", "java -jar jacococli.jar report \"C:\\Temp\\jacoco.exec\" --classfiles \\\n", "C:\\dev\\repos\\buschmais-spring-petclinic\\target\\classes --csv jacoco.csv\n", "```\n", "\n", "The CSV file contains all lines of code that were passed through during the measurement's time span. We just take the relevant data and add an additional `LINES` column to be able to calculate the ratio between covered and missed lines later on." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PACKAGECLASSLINE_COVEREDLINE_MISSEDLINES
0org.springframework.samples.petclinicPetclinicInitializer24024
\n", "
" ], "text/plain": [ " PACKAGE CLASS LINE_COVERED \\\n", "0 org.springframework.samples.petclinic PetclinicInitializer 24 \n", "\n", " LINE_MISSED LINES \n", "0 0 24 " ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "coverage = pd.read_csv(\"../input/spring-petclinic/jacoco.csv\")\n", "coverage = coverage[['PACKAGE', 'CLASS', 'LINE_COVERED' ,'LINE_MISSED']]\n", "coverage['LINES'] = coverage.LINE_COVERED + coverage.LINE_MISSED\n", "coverage.head(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Analysis\n", "It was stated that whole packages wouldn't be needed anymore and that they could be safely removed. Therefore, we sum up the coverage data per class for each package and calculate the coverage ratio for each package." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LINE_COVEREDLINE_MISSEDLINESRATIO
PACKAGE
org.springframework.samples.petclinic.repository.jdbc01521520.000000
org.springframework.samples.petclinic.util1317300.433333
org.springframework.samples.petclinic.web75401150.652174
org.springframework.samples.petclinic.model75331080.694444
org.springframework.samples.petclinic.repository.jpa217280.750000
org.springframework.samples.petclinic.service162180.888889
org.springframework.samples.petclinic240241.000000
\n", "
" ], "text/plain": [ " LINE_COVERED LINE_MISSED \\\n", "PACKAGE \n", "org.springframework.samples.petclinic.repositor... 0 152 \n", "org.springframework.samples.petclinic.util 13 17 \n", "org.springframework.samples.petclinic.web 75 40 \n", "org.springframework.samples.petclinic.model 75 33 \n", "org.springframework.samples.petclinic.repositor... 21 7 \n", "org.springframework.samples.petclinic.service 16 2 \n", "org.springframework.samples.petclinic 24 0 \n", "\n", " LINES RATIO \n", "PACKAGE \n", "org.springframework.samples.petclinic.repositor... 152 0.000000 \n", "org.springframework.samples.petclinic.util 30 0.433333 \n", "org.springframework.samples.petclinic.web 115 0.652174 \n", "org.springframework.samples.petclinic.model 108 0.694444 \n", "org.springframework.samples.petclinic.repositor... 28 0.750000 \n", "org.springframework.samples.petclinic.service 18 0.888889 \n", "org.springframework.samples.petclinic 24 1.000000 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grouped_by_packages = coverage.groupby(\"PACKAGE\").sum()\n", "grouped_by_packages['RATIO'] = grouped_by_packages.LINE_COVERED / grouped_by_packages.LINES\n", "grouped_by_packages = grouped_by_packages.sort_values(by='RATIO')\n", "grouped_by_packages" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We plot the data for the coverage ratio to get a brief overview of the result." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n1157jYEDBzJ58mT2228/3n77bfr06UPr1q3p2DG7EN/GEzn2mwgzG+hL/B1kZpdYDV+VmFlFfUXr\nXd9bZnaomXUys25mNr2+dG+LmNkLDbnbrZkNimh9EARBEGxajjjiCN5777113xcsWMCKFSv41a9+\nxdixY2ula9iwYfzsZz9bNyl2v/3246qrruLGG2+sV5shHPsgCIIgCIIgWMfatWt59tlnOemkk9ad\nGzduHN/73vc46qijmD9/PkuXLq2xvtdff52uXbuud66kpITXX3+93mzOEY59EARBEARBsM2zcuVK\nOnfuzL//+7+zdOlS+vSp3Mpl7NixfO9736NRo0acdtppPPTQQ5vR0qoJxz4IgiAIgiDY5snl2C9a\ntAgz44477gCgvLyct956iz59+tCqVSvGjRtXq3Sc9u3bM2PGjPXOzZgxgw4dOtSr/RCOfRAEQRAE\nQRCso2nTptx666389re/Zc2aNYwdO5ZBgwZRUVFBRUUFS5YsYcmSJSxatKhG+gYOHMiQIUOoqKgA\noKKiguuvv57//d//rXfbw7EPgiAIgiAIggyHHnooHTt2ZOzYsYwbN45TTz11veunnnoq48aNq5Gu\nzp0785vf/IbvfOc7HHTQQXznO9/hhhtuoHPn+l9tfJtYx9430ik1s2fqWP4S4MfATDM7p16Na2Aa\nep31uiCpgrQp14ebsM7mwNlmNryI3BjSvgHjJY0CbjKzN6qRHwB8Zmb31avB9YCkvYFbzayfb1K1\nt5k91QD1fBMYZmZnFrj2EvA/wFzgQzNrni9TW2Id+yAIgq2PLWEd+y2Br+w69krba8nMvmzgehr7\nrq4bw0VAbzNbnKd7OzNbs5G6GwzfDCtINCeNY7WOfRbfrfb/t3f30VbVdR7H358AvTKgyMNqORKC\nCPmQkoqWhUTpqFjmOKnMRJDmqnFynLI0tVyGsRScmcqMAJWFpJbOJD5ApcmkeBFBeebyIKX4AGqK\naMiDPH/nj9/3eDfHc+89l+49557D97XWWey792/v893f/Tuc3/7t396nqTITmyrTEK+bu/Z2/ab4\nL9Tmft3148BA0i/PFqXY+m1ma4APNOpDCCGEUFqtOhRH0nckLfPXtyX1lrRK0l2kHryPSLpE0p8k\nPSvpDknjCmznGF++WNJSSf18W89J+pWklZLul9TRy78k6WZJC4ELJE2RdH5m2Q2SFkqqk3Skz+8h\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "grouped_by_packages[['RATIO']].plot(kind=\"barh\", figsize=(8,2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Conclusion \n", "The JDBC package `org.springframework.samples.petclinic.repository.jdbc` isn't used at all and can be left out safely when migrating to the new platform." ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.2" }, "toc": { "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "toc_cell": false, "toc_position": {}, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }