diff --git a/coverage-report.pdf b/coverage-report.pdf new file mode 100644 index 0000000..22ccb57 Binary files /dev/null and b/coverage-report.pdf differ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e9479e1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +numpy +matplotlib +pytest +coverage +tox + diff --git a/tests/integration/__pycache__/test_diffusion2d.cpython-38-pytest-8.3.5.pyc b/tests/integration/__pycache__/test_diffusion2d.cpython-38-pytest-8.3.5.pyc new file mode 100644 index 0000000..44eec07 Binary files /dev/null and b/tests/integration/__pycache__/test_diffusion2d.cpython-38-pytest-8.3.5.pyc differ diff --git a/tests/integration/test_diffusion2d.py b/tests/integration/test_diffusion2d.py index fd026b4..b856704 100644 --- a/tests/integration/test_diffusion2d.py +++ b/tests/integration/test_diffusion2d.py @@ -1,19 +1,64 @@ """ Tests for functionality checks in class SolveDiffusion2D """ +import numpy as np +import pytest from diffusion2d import SolveDiffusion2D def test_initialize_physical_parameters(): """ - Checks function SolveDiffusion2D.initialize_domain + Integration test: + initialize_domain + initialize_physical_parameters + 检查 dt 是否按公式正确计算 """ solver = SolveDiffusion2D() + # 先初始化计算域 + w, h = 3.0, 2.0 + dx, dy = 0.5, 0.25 + solver.initialize_domain(w=w, h=h, dx=dx, dy=dy) + + # 再初始化物理参数 + d = 4.0 + T_cold = 300.0 + T_hot = 700.0 + solver.initialize_physical_parameters(d=d, T_cold=T_cold, T_hot=T_hot) + + # 手算 dt + dx2, dy2 = dx * dx, dy * dy + expected_dt = dx2 * dy2 / (2 * d * (dx2 + dy2)) + + assert np.isclose(solver.dt, expected_dt) + def test_set_initial_condition(): """ - Checks function SolveDiffusion2D.get_initial_function + Integration test: + initialize_domain + initialize_physical_parameters + set_initial_condition + 检查整个初始温度场 u 是否正确 """ solver = SolveDiffusion2D() + + # 完整工作流 + w, h = 3.0, 2.0 + dx, dy = 0.5, 0.25 + solver.initialize_domain(w=w, h=h, dx=dx, dy=dy) + solver.initialize_physical_parameters(d=4.0, T_cold=300.0, T_hot=700.0) + + u0 = solver.set_initial_condition() + + # 构造 expected_u(和源码逻辑完全一致) + expected_u = solver.T_cold * np.ones((solver.nx, solver.ny), dtype=float) + + r, cx, cy = 2, 5, 5 + r2 = r ** 2 + for i in range(solver.nx): + for j in range(solver.ny): + p2 = (i * solver.dx - cx) ** 2 + (j * solver.dy - cy) ** 2 + if p2 < r2: + expected_u[i, j] = solver.T_hot + + assert np.allclose(u0, expected_u) + diff --git a/tests/unit/__pycache__/test_diffusion2d_functions.cpython-38-pytest-8.3.5.pyc b/tests/unit/__pycache__/test_diffusion2d_functions.cpython-38-pytest-8.3.5.pyc new file mode 100644 index 0000000..e81cae0 Binary files /dev/null and b/tests/unit/__pycache__/test_diffusion2d_functions.cpython-38-pytest-8.3.5.pyc differ diff --git a/tests/unit/test_diffusion2d_functions.py b/tests/unit/test_diffusion2d_functions.py index c4277ff..78f2c8f 100644 --- a/tests/unit/test_diffusion2d_functions.py +++ b/tests/unit/test_diffusion2d_functions.py @@ -1,6 +1,8 @@ """ Tests for functions in class SolveDiffusion2D """ +import numpy as np +import pytest from diffusion2d import SolveDiffusion2D @@ -11,16 +13,63 @@ def test_initialize_domain(): """ solver = SolveDiffusion2D() + w, h = 3.0, 2.0 + dx, dy = 0.5, 0.25 + + solver.initialize_domain(w=w, h=h, dx=dx, dy=dy) + + assert solver.w == w + assert solver.h == h + assert solver.dx == dx + assert solver.dy == dy + + assert solver.nx == int(w / dx) + assert solver.ny == int(h / dy) + def test_initialize_physical_parameters(): """ - Checks function SolveDiffusion2D.initialize_domain + Checks function SolveDiffusion2D.initialize_physical_parameters """ solver = SolveDiffusion2D() + solver.dx = 0.5 + solver.dy = 0.25 + + d = 4.0 + T_cold = 300.0 + T_hot = 700.0 + + solver.initialize_physical_parameters(d=d, T_cold=T_cold, T_hot=T_hot) + + assert solver.D == d + assert solver.T_cold == T_cold + assert solver.T_hot == T_hot + + dx2, dy2 = solver.dx * solver.dx, solver.dy * solver.dy + expected_dt = dx2 * dy2 / (2 * solver.D * (dx2 + dy2)) + assert np.isclose(solver.dt, expected_dt) + def test_set_initial_condition(): """ - Checks function SolveDiffusion2D.get_initial_function + Checks function SolveDiffusion2D.set_initial_condition """ solver = SolveDiffusion2D() + + solver.nx = 30 + solver.ny = 20 + solver.dx = 0.5 + solver.dy = 0.25 + solver.T_cold = 300.0 + solver.T_hot = 700.0 + + u0 = solver.set_initial_condition() + + assert isinstance(u0, np.ndarray) + assert u0.shape == (solver.nx, solver.ny) + assert np.issubdtype(u0.dtype, np.floating) + + assert np.isclose(u0.min(), solver.T_cold) + assert np.isclose(u0.max(), solver.T_hot) + diff --git a/tox.toml b/tox.toml new file mode 100644 index 0000000..17539d0 --- /dev/null +++ b/tox.toml @@ -0,0 +1,7 @@ +[tox] +env_list = ["py"] + +[testenv] +deps = ["-rrequirements.txt"] +commands = [["python", "-m", "pytest"]] +