Skip to content

Menkalian/testing-python-exercise-wt2425

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Python code to solve the diffusion equation in 2D

Please follow the instructions in python_testing_exercise.md.

Test logs (for submission)

pytest log

(After swapping w for h in the calculation of nx)

============================= test session starts ==============================
collecting ... collected 6 items

integration/test_diffusion2d.py::test_initialize_physical_parameters 
integration/test_diffusion2d.py::test_set_initial_condition 
unit/test_diffusion2d_functions.py::test_initialize_domain PASSED [ 16%]PASSED       [ 33%]
unit/test_diffusion2d_functions.py::test_initialize_domain_testcase_2 
unit/test_diffusion2d_functions.py::test_initialize_physical_parameters 
unit/test_diffusion2d_functions.py::test_set_initial_condition 

========================= 2 failed, 4 passed in 0.22s ==========================
FAILED        [ 50%]
unit/test_diffusion2d_functions.py:9 (test_initialize_domain)
5 != 10

Expected :10
Actual   :5
<Click to see difference>

def test_initialize_domain():
        """
        Check function SolveDiffusion2D.initialize_domain
        """
        solver = SolveDiffusion2D()
        # Arrange test values
        w = 20.
        h = 10.
        dx = 2.
        dy = 0.2
    
        # Act (= Perform test action)
        solver.initialize_domain(w, h, dx, dy)
    
        # Assert
        # "cheap" assertions
        assert solver.w == w
        assert solver.h == h
        assert solver.dx == dx
        assert solver.dy == dy
        # Calculated values
>       assert solver.nx == 10
E       assert 5 == 10
E        +  where 5 = <diffusion2d.SolveDiffusion2D object at 0x7fed47f79490>.nx

unit/test_diffusion2d_functions.py:31: AssertionError
FAILED [ 66%]
unit/test_diffusion2d_functions.py:34 (test_initialize_domain_testcase_2)
6 != 5

Expected :5
Actual   :6
<Click to see difference>

def test_initialize_domain_testcase_2():
        """
        Second testcase for function SolveDiffusion2D.initialize_domain
        """
        solver = SolveDiffusion2D()
        # Arrange test values
        # "unschöne" values
        w = 15.2
        h = 17.1
        dx = 2.7
        dy = 0.29
    
        # Act (= Perform test action)
        solver.initialize_domain(w, h, dx, dy)
    
        # Assert
        # "cheap" assertions
        assert solver.w == w
        assert solver.h == h
        assert solver.dx == dx
        assert solver.dy == dy
        # Calculated values
>       assert solver.nx == 5
E       assert 6 == 5
E        +  where 6 = <diffusion2d.SolveDiffusion2D object at 0x7fed47f79a90>.nx

unit/test_diffusion2d_functions.py:57: AssertionError
PASSED [ 83%]dt = 0.0011428571428571432
PASSED    [100%]
Process finished with exit code 1

(After changing the formula for dt: dx2, dy2 = self.dx * self.dy, self.dx * self.dy)

============================= test session starts ==============================
collecting ... collected 6 items

integration/test_diffusion2d.py::test_initialize_physical_parameters PASSED [ 16%]
integration/test_diffusion2d.py::test_set_initial_condition PASSED       [ 33%]
unit/test_diffusion2d_functions.py::test_initialize_domain PASSED        [ 50%]
unit/test_diffusion2d_functions.py::test_initialize_domain_testcase_2 PASSED [ 66%]
unit/test_diffusion2d_functions.py::test_initialize_physical_parameters FAILED [ 83%]dt = 0.001428571428571429

unit/test_diffusion2d_functions.py:60 (test_initialize_physical_parameters)
0.001428571428571429 != 0.001142 ± 1.0e-06

Expected :0.001142 ± 1.0e-06
Actual   :0.001428571428571429
<Click to see difference>

def test_initialize_physical_parameters():
        """
        Checks function SolveDiffusion2D.initialize_domain
        """
        solver = SolveDiffusion2D()
        # Arrange
        d = 3.5
        T_cold = 342.4
        T_hot = 723.15
        solver.dx = 0.1
        solver.dy = 0.2
    
        # Act
        solver.initialize_physical_parameters(d, T_cold, T_hot)
    
        # Assert
        assert solver.D == d
        assert solver.T_cold == T_cold
        assert solver.T_hot == T_hot
>       assert solver.dt == pytest.approx(0.001142, abs=1e-6)
E       assert 0.001428571428571429 == 0.001142 ± 1.0e-06
E         
E         comparison failed
E         Obtained: 0.001428571428571429
E         Expected: 0.001142 ± 1.0e-06

unit/test_diffusion2d_functions.py:80: AssertionError

unit/test_diffusion2d_functions.py::test_set_initial_condition PASSED    [100%]

========================= 1 failed, 5 passed in 0.22s ==========================

Process finished with exit code 1

(After introducing an error into set_initial_condition (wrong shape): u = self.T_cold * np.ones((self.nx, self.nx)))

============================= test session starts ==============================
collecting ... collected 6 items

integration/test_diffusion2d.py::test_initialize_physical_parameters 
integration/test_diffusion2d.py::test_set_initial_condition 
unit/test_diffusion2d_functions.py::test_initialize_domain PASSED [ 16%]PASSED       [ 33%]
unit/test_diffusion2d_functions.py::test_initialize_domain_testcase_2 
unit/test_diffusion2d_functions.py::test_initialize_physical_parameters 
unit/test_diffusion2d_functions.py::test_set_initial_condition 

========================= 1 failed, 5 passed in 0.22s ==========================
PASSED        [ 50%]PASSED [ 66%]PASSED [ 83%]dt = 0.0007142857142857145
FAILED    [100%]
unit/test_diffusion2d_functions.py:82 (test_set_initial_condition)
100 != 50

Expected :50
Actual   :100
<Click to see difference>

def test_set_initial_condition():
        """
        Checks function SolveDiffusion2D.get_initial_function
        """
        solver = SolveDiffusion2D()
        # Arrange
        solver.nx = 100
        solver.ny = 50
        solver.dx = 0.1
        solver.dy = 0.2
        solver.T_cold = 100.
        solver.T_hot = 600.
    
        # Act
        u: np.ndarray = solver.set_initial_condition()
    
        # Assert
        # Domain has expected dimensions
        assert u.shape[0] == solver.nx
>       assert u.shape[1] == solver.ny
E       assert 100 == 50
E        +  where 50 = <diffusion2d.SolveDiffusion2D object at 0x7fc72874d340>.ny

unit/test_diffusion2d_functions.py:102: AssertionError

Process finished with exit code 1

(After introducing an error into set_initial_condition (inverse values): if not p2 < r2:)

============================= test session starts ==============================
collecting ... collected 6 items

integration/test_diffusion2d.py::test_initialize_physical_parameters 
integration/test_diffusion2d.py::test_set_initial_condition 
unit/test_diffusion2d_functions.py::test_initialize_domain PASSED [ 16%]PASSED       [ 33%]
unit/test_diffusion2d_functions.py::test_initialize_domain_testcase_2 
unit/test_diffusion2d_functions.py::test_initialize_physical_parameters 
unit/test_diffusion2d_functions.py::test_set_initial_condition 

========================= 1 failed, 5 passed in 0.21s ==========================
PASSED        [ 50%]PASSED [ 66%]PASSED [ 83%]dt = 0.0007142857142857145
FAILED    [100%]
unit/test_diffusion2d_functions.py:82 (test_set_initial_condition)
np.float64(600.0) != 100.0

Expected :100.0
Actual   :np.float64(600.0)
<Click to see difference>

def test_set_initial_condition():
        """
        Checks function SolveDiffusion2D.get_initial_function
        """
        solver = SolveDiffusion2D()
        # Arrange
        solver.nx = 100
        solver.ny = 50
        solver.dx = 0.1
        solver.dy = 0.2
        solver.T_cold = 100.
        solver.T_hot = 600.
    
        # Act
        u: np.ndarray = solver.set_initial_condition()
    
        # Assert
        # Domain has expected dimensions
        assert u.shape[0] == solver.nx
        assert u.shape[1] == solver.ny
        # Border is cold, center is hot
>       assert u[0][0] == 100.
E       assert np.float64(600.0) == 100.0

unit/test_diffusion2d_functions.py:104: AssertionError

Process finished with exit code 1

unittest log

(After swapping w for h in the calculation of nx)

============================= test session starts ==============================
collecting ... collected 4 items

test_diffusion2d_functions.py::TestDiffusion2D::test_initialize_domain FAILED [ 25%]
test_diffusion2d_functions.py:16 (TestDiffusion2D.test_initialize_domain)
10 != 5

Expected :5
Actual   :10
<Click to see difference>

self = <test_diffusion2d_functions.TestDiffusion2D testMethod=test_initialize_domain>

    def test_initialize_domain(self):
        """
        Check function SolveDiffusion2D.initialize_domain
        """
        # Arrange test values
        w = 20.
        h = 10.
        dx = 2.
        dy = 0.2
    
        # Act (= Perform test action)
        self.solver.initialize_domain(w, h, dx, dy)
    
        # Assert
        # "cheap" assertions
        self.assertEqual(self.solver.w, w)
        self.assertEqual(self.solver.h, h)
        self.assertEqual(self.solver.dx, dx)
        self.assertEqual(self.solver.dy, dy)
        # Calculated values
>       self.assertEqual(self.solver.nx, 10)

test_diffusion2d_functions.py:37: AssertionError

test_diffusion2d_functions.py::TestDiffusion2D::test_initialize_domain_testcase_2 FAILED [ 50%]
test_diffusion2d_functions.py:39 (TestDiffusion2D.test_initialize_domain_testcase_2)
5 != 6

Expected :6
Actual   :5
<Click to see difference>

self = <test_diffusion2d_functions.TestDiffusion2D testMethod=test_initialize_domain_testcase_2>

    def test_initialize_domain_testcase_2(self):
        """
        Second testcase for function SolveDiffusion2D.initialize_domain
        """
        # Arrange test values
        # "unschöne" values
        w = 15.2
        h = 17.1
        dx = 2.7
        dy = 0.29
    
        # Act (= Perform test action)
        self.solver.initialize_domain(w, h, dx, dy)
    
        # Assert
        # "cheap" assertions
        self.assertEqual(self.solver.w, w)
        self.assertEqual(self.solver.h, h)
        self.assertEqual(self.solver.dx, dx)
        self.assertEqual(self.solver.dy, dy)
        # Calculated values
>       self.assertEqual(self.solver.nx, 5)

test_diffusion2d_functions.py:61: AssertionError

test_diffusion2d_functions.py::TestDiffusion2D::test_initialize_physical_parameters PASSED [ 75%]dt = 0.0011428571428571432

test_diffusion2d_functions.py::TestDiffusion2D::test_set_initial_condition PASSED [100%]

========================= 2 failed, 2 passed in 0.21s ==========================

Process finished with exit code 1

(After changing the formula for dt: dx2, dy2 = self.dx * self.dy, self.dx * self.dy)

============================= test session starts ==============================
collecting ... collected 4 items

test_diffusion2d_functions.py::TestDiffusion2D::test_initialize_domain PASSED [ 25%]
test_diffusion2d_functions.py::TestDiffusion2D::test_initialize_domain_testcase_2 PASSED [ 50%]
test_diffusion2d_functions.py::TestDiffusion2D::test_initialize_physical_parameters FAILED [ 75%]dt = 0.001428571428571429

test_diffusion2d_functions.py:63 (TestDiffusion2D.test_initialize_physical_parameters)
self = <test_diffusion2d_functions.TestDiffusion2D testMethod=test_initialize_physical_parameters>

    def test_initialize_physical_parameters(self):
        """
        Checks function SolveDiffusion2D.initialize_domain
        """
        # Arrange
        d = 3.5
        T_cold = 342.4
        T_hot = 723.15
        self.solver.dx = 0.1
        self.solver.dy = 0.2
    
        # Act
        self.solver.initialize_physical_parameters(d, T_cold, T_hot)
    
        # Assert
        self.assertEqual(self.solver.D, d)
        self.assertEqual(self.solver.T_cold, T_cold)
        self.assertEqual(self.solver.T_hot, T_hot)
        # unittest assumes rounding here, so the last decimal differs from pytest.
>       self.assertAlmostEqual(self.solver.dt, 0.001143, 6)
E       AssertionError: 0.001428571428571429 != 0.001143 within 6 places (0.0002855714285714291 difference)

test_diffusion2d_functions.py:83: AssertionError

test_diffusion2d_functions.py::TestDiffusion2D::test_set_initial_condition PASSED [100%]

========================= 1 failed, 3 passed in 0.22s ==========================

Process finished with exit code 1

(After introducing an error into set_initial_condition (inverse values): if not p2 < r2:)

============================= test session starts ==============================
collecting ... collected 4 items

test_diffusion2d_functions.py::TestDiffusion2D::test_initialize_domain 
test_diffusion2d_functions.py::TestDiffusion2D::test_initialize_domain_testcase_2 
test_diffusion2d_functions.py::TestDiffusion2D::test_initialize_physical_parameters 
test_diffusion2d_functions.py::TestDiffusion2D::test_set_initial_condition 

========================= 1 failed, 3 passed in 0.22s ==========================
PASSED [ 25%]PASSED [ 50%]PASSED [ 75%]dt = 0.0011428571428571432
FAILED [100%]
test_diffusion2d_functions.py:84 (TestDiffusion2D.test_set_initial_condition)
100.0 != np.float64(600.0)

Expected :np.float64(600.0)
Actual   :100.0
<Click to see difference>

self = <test_diffusion2d_functions.TestDiffusion2D testMethod=test_set_initial_condition>

    def test_set_initial_condition(self):
        """
        Checks function SolveDiffusion2D.get_initial_function
        """
        # Arrange
        self.solver.nx = 100
        self.solver.ny = 50
        self.solver.dx = 0.1
        self.solver.dy = 0.2
        self.solver.T_cold = 100.
        self.solver.T_hot = 600.
    
        # Act
        u: np.ndarray = self.solver.set_initial_condition()
    
        # Assert
        # Domain has expected dimensions
        self.assertEqual(u.shape[0], self.solver.nx)
        self.assertEqual(u.shape[1], self.solver.ny)
        # Border is cold, center is hot
>       self.assertEqual(u[0][0], 100.)

test_diffusion2d_functions.py:105: AssertionError

Process finished with exit code 1

pytest-log for Integration-Tests

(breaking test_initialize_physical_parameters by taking dx2*dx2)

============================= test session starts ==============================
collecting ... collected 1 item

test_diffusion2d.py::test_initialize_physical_parameters FAILED          [100%]dt = 0.006666666666666669

test_diffusion2d.py:8 (test_initialize_physical_parameters)
0.006666666666666669 != 0.001666 ± 1.0e-06

Expected :0.001666 ± 1.0e-06
Actual   :0.006666666666666669
<Click to see difference>

def test_initialize_physical_parameters():
        """
        Checks function SolveDiffusion2D.initialize_domain
        """
        solver = SolveDiffusion2D()
        solver.initialize_domain(10., 20., 0.2, 0.1)
        solver.initialize_physical_parameters(2.4, 0., 1.)
        # dx2 = 0.04
        # dy2 = 0.01
        # dt = 0.0004 / (2*2.4*0.05) = 1/600 = 0.0016666
>       assert solver.dt == pytest.approx(0.001666, abs=1e-6)
E       assert 0.006666666666666669 == 0.001666 ± 1.0e-06
E         
E         comparison failed
E         Obtained: 0.006666666666666669
E         Expected: 0.001666 ± 1.0e-06

test_diffusion2d.py:19: AssertionError


============================== 1 failed in 0.21s ===============================

Process finished with exit code 1

(breaking test_set_initial_condition by cubing instead of squaring)

============================= test session starts ==============================
collecting ... collected 1 item

test_diffusion2d.py::test_set_initial_condition FAILED                   [100%]dt = 0.09259259259259259

test_diffusion2d.py:21 (test_set_initial_condition)
0.0 != np.float64(1.0)

Expected :np.float64(1.0)
Actual   :0.0
<Click to see difference>

def test_set_initial_condition():
        """
        Checks function SolveDiffusion2D.get_initial_function
        """
        solver = SolveDiffusion2D()
        solver.initialize_domain(10., 10., 1., 1.)
        solver.initialize_physical_parameters(2.7, 0., 1.)
        u = solver.set_initial_condition()
    
        expected_array= [
            [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 1., 1., 1., 0., 0., 0.],
            [0., 0., 0., 0., 1., 1., 1., 0., 0., 0.],
            [0., 0., 0., 0., 1., 1., 1., 0., 0., 0.],
            [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
        ]
    
        for x in range(u.shape[0]):
            for y in range(u.shape[1]):
>               assert expected_array[x][y] == u[x, y], f"Values at {x}, {y} do not match"
E               AssertionError: Values at 0, 0 do not match
E               assert 0.0 == np.float64(1.0)

test_diffusion2d.py:46: AssertionError


============================== 1 failed in 0.21s ===============================

Process finished with exit code 1

Citing

The code used in this exercise is based on Chapter 7 of the book "Learning Scientific Programming with Python".

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages