From cc605b471bff7d371a031f52ff783b43f4d93b72 Mon Sep 17 00:00:00 2001 From: jkhanGitHub Date: Mon, 19 Jan 2026 12:27:18 +0100 Subject: [PATCH] all steps solved, i know this is a bad commit message, but the steps are described in @python_testing_exercise.md and the solutions are clear off that --- .coverage | Bin 0 -> 110592 bytes __pycache__/diffusion2d.cpython-314.pyc | Bin 0 -> 7259 bytes diffusion2d.py | 10 +- python_testing_exercise.md | 86 ++++++++++++++++++ requirements.txt | 4 + ...t_diffusion2d.cpython-314-pytest-9.0.2.pyc | Bin 0 -> 5231 bytes tests/integration/test_diffusion2d.py | 49 ++++++++-- ...n2d_functions.cpython-314-pytest-9.0.2.pyc | Bin 0 -> 5683 bytes tests/unit/test_diffusion2d_functions.py | 12 +++ tox.toml | 9 ++ 10 files changed, 161 insertions(+), 9 deletions(-) create mode 100644 .coverage create mode 100644 __pycache__/diffusion2d.cpython-314.pyc create mode 100644 python_testing_exercise.md create mode 100644 requirements.txt create mode 100644 tests/integration/__pycache__/test_diffusion2d.cpython-314-pytest-9.0.2.pyc create mode 100644 tests/unit/__pycache__/test_diffusion2d_functions.cpython-314-pytest-9.0.2.pyc create mode 100644 tox.toml diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..96a04f720dc6ba50f5d193fcce5dfaa8ba2c303b GIT binary patch literal 110592 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. +- As these are unit tests, in each test, only the call to the respective function needs to be made. No other function from `diffusion2d.py` must be called. If another function call is required to define some member variables, mock it or directly define the internal variables. +- As an example, let us look at how we can write a unit test for the function `initialize_domain`. + - When the function `initialize_domain` is being tested, you need to first identify which variables are being calculated in this function. + - In this case they are the variables `nx` and `ny`. Now choose some values for the variables `w`, `h`, `dx`, and `dy` which are different from the default values. For these values, manually calculate the values of `nx` and `ny`. These manually calculated values are the expected values in this test. + - Now call the function `initialize_domain` with the chosen values of `w`, `h`, `dx`, and `dy` and using an assertion statement, check if the values of `nx` and `ny` in the class member variables are equal to your expected values. + - Note that you have the object of the class `SolveDiffusion2D` and hence you can access member variables, for example `solver.nx` and `solver.ny`. This is useful to check the actual values. +- Using a similar workflow, complete the other two unit tests. +- Sometimes pytest is not able to find the tests. One reason is the way pytest is installed, which is typically either using pip or apt. Refer to the [corresponding section](https://github.com/Simulation-Software-Engineering/Lecture-Material/blob/main/05_testing_and_ci/python_testing_demo.md#pytest) in the demo for more details. If such errors occur, then try to explicitly point pytest to the relevant test file in the following way: + +```bash +pytest tests/unit/test_diffusion2d_functions.py +``` + +- How can you make sure that you have written correct tests? By breaking them purposely! + - Introduce a bug in a function on purpose and then re-run the test to see if the test fails. + - Lets try this in the function `initialize_domain`. In line 42 of `diffusion2d.py`, change the calculation from `self.nx = int(w / dx)` to `self.nx = int(h / dx)`. This is clearly a mistake and our test should catch it. + - Now run the tests again. Did the test catch the bug? If yes, then you have written the test correctly. If the test does not catch the bug, try to think why did it not? Is your choice of values for the parameters `w`, `h`, `dx` and `dy` responsible for it? If the test is run with `w = h` then this bug will not be caught. What do we learn from this? We learn that the test fixture should be as general as possible and we should ensure that we are not testing special scenarios. A domain with `w = h` is a square domain which is a special case of a rectangular domain with arbitrary values for `w` and `h`. + +- If you are writing tests with unittest, start by creating a class `TestDiffusion2D` which is derived from the class `unittest.TestCase`. Migrate all the tests inside the class and change them to be member functions of the class. Note that the parameter `self` needs to be used in the input parameters of all member functions and also while defining and using member variables. +- Identify the common steps necessary in all the tests and transfer the functionality to the function `setUp`. One example of this is the definition of the object of class `SolveDiffusion2D`. +- The main change is in the assertion statements. Change the assertion statements to the format as required by `unittest`. Refer to the lecture demo for an example on how to do this. + +## Step 4 - Writing Integration Tests + +- Write integration tests will be written for the functions `initialize_physical_parameters` and `set_initial_conditions`. As these are integration tests, each test should check how different functions from `SolveDiffusion2D` work together. +- For example, let us look at how the test for `initialize_physical_parameters` will look like. + - First step is to select some values for the input parameters to the function `initialize_physical_parameters` and also the function `initialize_domain`. + - Looking at the functionality in `initialize_physical_parameters` we understand that the most relevant variable being calculated is `dt`. + - Based on the choice of all input parameters, manually compute the value of `dt` for the test. This is the expected result. + - Call the function `initialize_domain` and then the function `initialize_physical_parameters`. + - Compare the value of the member variable `dt` with the manually computed `dt` using an assertion statement. +- Now also write a similar integration test for `set_initial_conditions`. Note that this will be the most extensive test from the whole set. The field variable `u` is computed in `set_initial_conditions`, which is a 2D array. The test should have a computation which computes a similar `u` array for a user-defined set of initial parameters. This computed `u` is the expected result. +- Using the same logic as in the previous steps, intentionally break the tests to make sure that the tests are constructed correctly. + +## Step 5 - Checking Test Coverage + +- Using the coverage tool generate a HTML report of the code coverage of all the tests. +- Open the report file in a browser and print the report to a file called `coverage-report.pdf`. Add this file to the repository. + +## Step 6 - Automation Using tox + +- Write a `tox.toml` file such that by running the command `tox`, the tests are run using pytest and/or unittest in separate virtual environments. +- Use the `requirements.txt` file to send all the dependencies information to tox. + +## Step 7 - Submission + +- Open a pull request titled `[] Adding tests` (for example: `[desaiin] Adding tests`) from your fork to the main branch of the exercise repository. \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8f87fb4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +numpy +matplotlib +pytest +coverage \ No newline at end of file diff --git a/tests/integration/__pycache__/test_diffusion2d.cpython-314-pytest-9.0.2.pyc b/tests/integration/__pycache__/test_diffusion2d.cpython-314-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74dfb5719d504945f2882273e6f70b840a6a9a2f GIT binary patch literal 5231 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 literal 0 HcmV?d00001 diff --git a/tests/unit/test_diffusion2d_functions.py b/tests/unit/test_diffusion2d_functions.py index c4277ff..558b96a 100644 --- a/tests/unit/test_diffusion2d_functions.py +++ b/tests/unit/test_diffusion2d_functions.py @@ -10,6 +10,9 @@ def test_initialize_domain(): Check function SolveDiffusion2D.initialize_domain """ solver = SolveDiffusion2D() + solver.initialize_domain(w=20., h=40., dx=0.2, dy=0.5) + assert solver.nx == 100, "nx is not correctly set" + assert solver.ny == 80, "ny is not correctly set" def test_initialize_physical_parameters(): @@ -17,6 +20,11 @@ def test_initialize_physical_parameters(): Checks function SolveDiffusion2D.initialize_domain """ solver = SolveDiffusion2D() + solver.initialize_domain(w=60., h=60., dx=0.2, dy=0.3) + solver.initialize_physical_parameters(d=6., T_cold=200., T_hot=400.) + + # Expected dt = 0.04 * 0.09 / (2 * 6 * (0.04 + 0.09)) = 0.0036 / 1.56 = 0.00230769 + assert abs(solver.dt - 0.00230769) < 1e-7, "dt is not correctly set" def test_set_initial_condition(): @@ -24,3 +32,7 @@ def test_set_initial_condition(): Checks function SolveDiffusion2D.get_initial_function """ solver = SolveDiffusion2D() + solver.initialize_domain(w=60., h=60., dx=0.2, dy=0.3) + solver.initialize_physical_parameters(d=6., T_cold=200., T_hot=400.) + u0 = solver.set_initial_condition() + assert u0.shape == (300, 200), "Initial condition array has wrong shape" \ No newline at end of file diff --git a/tox.toml b/tox.toml new file mode 100644 index 0000000..4eee444 --- /dev/null +++ b/tox.toml @@ -0,0 +1,9 @@ +[tox] +env_list = py314, py310, py311 +skipsdist = True + +[testenv] +deps = -rrequirements.txt +commands = + pytest tests/unit/test_diffusion2d_functions.py + pytest tests/integration/test_diffusion2d.py