如何使用Pytest测试生成随机样本的函数?

Col*_*in9 6 random numpy pytest python-3.x random-seed

假设我在使用 pytest 的 test_func.py 脚本中使用 np.random.normal() 生成一些输入 numpy 数组数据。

现在我想调用我正在测试的 func.py 函数。我怎样才能获得可测试的结果?如果我在 test_func.py 脚本中设置种子,它不会对应于 func.py 函数中生成的随机数据,对吗?

我希望能够在 test_func.py 中创建一些参考数据,然后测试 func.py 脚本中生成的随机性是否与我创建的参考数据相当(因此,测试 func.py 函数的随机性和功能) 。

谢谢你!

编辑:这是一些示例代码来描述我的过程:

# func.py
import numpy as np
# I send in a numpy array signal, generate noise, and append noise to signal
def generate_random_noise(signal):
    noise = np.random.normal(0, 5, signal.shape)
    signal_w_noise = signal + noise
    return signal_w_noise


# test_func.py
import pytest
import numpy as np
import func
def test_generate_random_noise():
    # create reference signal
    # ...
    np.random.seed(5)
    reference_noise = np.random.normal(0, 5, ref_signal.shape)
    ref_signal_w_noise = ref_signal + reference_noise

    # assert manually created signal and noise and 
    assert all(np.array_equal(x, y) for x, y in zip(generate_random_noise(reference_signal), ref_signal_w_noise))
Run Code Online (Sandbox Code Playgroud)

Jea*_*lle 3

当使用随机的东西时,你可以有两种测试方法:

  • 使用已知种子来确保函数根据随机分布按预期执行:使用已知种子,您可以将函数行为与预先已知的行为进行比较。
  • 根据随机分布验证函数的统计行为。在这里,您需要对函数“结果”的预期分布进行一些数学计算,并使用一些统计指标作为成功/失败标准,例如,测试函数与其预期目标相匹配的平均值、偏差等。这可以使用非冻结种子来完成,但需要收集许多函数调用以获得足够的数据来进行有意义的统计。

  • 关于你的第一个要点。如何从位于另一个脚本中的函数获得相同的种子结果?我将在原来的答案中发布一些示例代码,看看这是否有意义。我不太确定如何设置我的代码以使其工作。 (2认同)