Testing ======= First meeting ------------- After this meeting students should: - Understand how assertion statements work - Understand how to write unit tests using assert statements - Understand how to write tests for documentation Testing software ---------------- Discuss how we will write automated tests for the `tsp` library we wrote in the first section. Writing the unit tests ********************** Write the following in a `test_tsp.py` file:: import numpy as np import matplotlib.pyplot as plt import tsp def test_get_tour_with_no_seed(): number_of_stops = 4 tour = tsp.get_tour(number_of_stops=number_of_stops) assert np.array_equal(tour, np.array([0, 1, 2, 3, 0])) def test_get_tour_with_seed_0(): number_of_stops = 4 seed = 0 tour = tsp.get_tour(number_of_stops=number_of_stops, seed=seed) assert np.array_equal(tour, np.array([0, 3, 2, 1, 0])), f"Obtained output is {tour}" def test_get_tour_with_seed_1(): number_of_stops = 4 seed = 1 tour = tsp.get_tour(number_of_stops=number_of_stops, seed=seed) assert np.array_equal(tour, np.array([0, 1, 3, 2, 0])), f"Obtained output is {tour}" def test_swap_cities(): tour = [0, 1, 3, 2, 4, 0] steps = (4, 1) new_tour = tsp.swap_cities(tour=tour, steps=steps) assert new_tour == [0, 4, 2, 3, 1, 0], f"Obtained output is {new_tour}" def test_get_cost(): distance_matrix = np.array(((0, 5, 2, 9), (5, 0, 3, 1), (2, 3, 0, 7), (9, 1, 7, 0))) tour = [0, 1, 2, 3, 0] cost = tsp.get_cost(tour=tour, distance_matrix=distance_matrix) assert cost == 24 def test_run_2_opt_algorithm_with_seed_0(): distance_matrix = np.array(((0, 5, 2, 9), (5, 0, 3, 1), (2, 3, 0, 7), (9, 1, 7, 0))) number_of_stops = 4 seed = 0 iterations = 50 tour = tsp.run_2_opt_algorithm(number_of_stops=number_of_stops, distance_matrix=distance_matrix, seed=seed, iterations=iterations) assert tour == [0, 2, 3, 1, 0], f"Obtained output is {tour}" def test_run_2_opt_algorithm_with_seed_1(): distance_matrix = np.array(((0, 5, 2, 9), (5, 0, 3, 1), (2, 3, 0, 7), (9, 1, 7, 0))) number_of_stops = 4 seed = 1 iterations = 50 tour = tsp.run_2_opt_algorithm(number_of_stops=number_of_stops, distance_matrix=distance_matrix, seed=seed, iterations=iterations) assert tour == [0, 2, 1, 3, 0], f"Obtained output is {tour}" def test_plot_tour(): x = np.array([2, 3]) y = np.array([2, 3]) tour = np.array([0, 1, 0]) plot = tsp.plot_tour(x=x, y=y, tour=tour) assert plot is None test_get_tour_with_no_seed() test_get_tour_with_seed_0() test_get_tour_with_seed_1() test_swap_cities() test_get_cost() test_run_2_opt_algorithm_with_seed_0() test_run_2_opt_algorithm_with_seed_1() test_plot_tour() Run the above tests by running:: $ python test_tsp.py Depending on time now discuss refactoring some of the code. For example: - Modify `swap_cities` to be called `swap_steps` as this name is more generic. - Possibly modify `swap_cities`/`swap_steps` so that it can handle numpy array outputs. At each step modify the source code and then modify the tests. Discuss importance of tests as a debugging tool. Testing the documentation ************************* Modify the documentation in the `README.md` file to use doctests:: # TSP A library for solving instances of the travelling sales agent problem ## Tutorial In this tutorial we will see how to use `tsp` to solve instances of the [Travelling Salesman Problem](https://en.wikipedia.org/wiki/Travelling_salesman_problem) Assuming we have the following distance matrix: ```python >>> import numpy as np >>> distance_matrix = np.array(((0, 5, 2, 9), (5, 0, 3, 1), (2, 3, 0, 7), (9, 1, 7, 0))) ``` We can obtain a tour using the following: ```python >>> import tsp # doctest: +SKIP >>> tour = tsp.run_2_opt_algorithm(number_of_stops=4, distance_matrix=distance_matrix, iterations=1000, seed=0) # doctest: +SKIP >>> tour # doctest: +SKIP [0, 3, 1, 2, 0] ``` The `tsp` library includes further functionality which you can read in the How To guides. **Note** that the doctests are skipped when checked for this documentation. Run the doc tests by typing:: $ python -m doctest README.md Discussion around 3 pillars of software development *************************************************** Specifically look at diagram in further information section: https://vknight.org/pfm/building-tools/07-testing/why/main.html#how-are-modularisation-documentation-and-testing-related After class email ----------------- Send the following email after class:: Hi all, A recording of today's class is available at <>. In this class I went over automated testing. In class we wrote unit and doctests for the Travelling Salesagent Problem. You can find a different example (studying snakes and ladders) here: https://vknight.org/pfm/building-tools/07-testing/tutorial/main.html Please get in touch if I can assist with anything, Vince