如何用pytest测试无参数Python函数?无需重构现有代码
测试无参数
extrusion_calculation函数的方案 因为函数依赖Prime_Line类的静态属性,无需重构现有代码,直接在测试用例中修改类属性值即可完成测试,具体步骤如下:
- 导入
pytest、math、目标函数以及Prime_Line类 - 每个测试用例里,先给
Prime_Line的nozzle_diameter、line_width_factor、layer_height、line_length设置已知测试值 - 调用
extrusion_calculation()获取结果,和手动计算的预期值做断言对比
示例测试代码
import pytest import math from your_module import extrusion_calculation, Prime_Line def test_extrusion_basic_case(): # 设置测试属性值 Prime_Line.nozzle_diameter = 0.4 Prime_Line.line_width_factor = 1.0 Prime_Line.layer_height = 0.2 Prime_Line.line_length = 100.0 # 手动计算预期结果 D = 0.4 W = 1.0 * D T = 0.2 L = 100.0 expected_e = ((math.pi * T**2) / 4 + T * W - T**2) * L # 断言函数输出与预期一致 assert extrusion_calculation() == pytest.approx(expected_e) def test_extrusion_different_params(): # 另一组测试参数 Prime_Line.nozzle_diameter = 0.6 Prime_Line.line_width_factor = 1.2 Prime_Line.layer_height = 0.3 Prime_Line.line_length = 50.0 D = 0.6 W = 1.2 * D T = 0.3 L = 50.0 expected_e = ((math.pi * T**2) / 4 + T * W - T**2) * L assert extrusion_calculation() == pytest.approx(expected_e)
额外注意事项
- 用
pytest.approx()做浮点数断言,避免因精度误差导致测试失败 - 如果担心测试用例间的属性值互相干扰,可以用自动执行的fixture在测试前后重置
Prime_Line的属性:
@pytest.fixture(autouse=True) def reset_prime_line_attrs(): # 保存原始属性值 original_values = { 'nozzle_diameter': Prime_Line.nozzle_diameter, 'line_width_factor': Prime_Line.line_width_factor, 'layer_height': Prime_Line.layer_height, 'line_length': Prime_Line.line_length } yield # 测试结束后恢复原始值 for attr, val in original_values.items(): setattr(Prime_Line, attr, val)
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

