You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用Python Unittest测试随机二维数组生成函数

问题与解答

原函数与现有测试代码

用户实现了生成指定范围3×3随机二维数组的函数:

import random

def random3by3Matrix(smallest_num, largest_num):
    matrix = [[0 for x in range(3)] for y in range(3)]
    for i in range(3):
        for j in range(3):
            matrix[i][j] = random.randrange(int(smallest_num),
                                            int(largest_num + 1)) if smallest_num != largest_num else smallest_num
    return matrix

print(random3by3Matrix(-10, 10))

返回示例:

[[-6, 10, -4], [-10, -9, 8], [10, 1, 1]]

现有单元测试代码:

import unittest

def isEveryEntryGreaterEqual(list1, list2):
    for i in range(len(list1)):
        for j in range(len(list1[0])):
            if not (list1[i][j] <= list2[i][j]):
                return False
    return True

class TestFunction(unittest.TestCase):
    def test_random3by3Matrix(self):
        lower_bound = [[-10 for x in range(3)] for y in range(3)]
        upper_bound = [[10 for x in range(3)] for y in range(3)]

        self.assertEqual(True, isEveryEntryGreaterEqual(lower_bound, random3by3Matrix(-10,10)))
        self.assertEqual(True, isEveryEntryGreaterEqual(random3by3Matrix(-10,10), upper_bound))

一、更简洁的单元测试实现

可以直接遍历数组元素判断是否在指定范围内,无需构造上下界二维数组,代码更简洁直观,同时覆盖原函数的分支逻辑:

import unittest
import random

def random3by3Matrix(smallest_num, largest_num):
    matrix = [[0 for x in range(3)] for y in range(3)]
    for i in range(3):
        for j in range(3):
            matrix[i][j] = random.randrange(int(smallest_num),
                                            int(largest_num + 1)) if smallest_num != largest_num else smallest_num
    return matrix

class TestFunction(unittest.TestCase):
    def test_matrix_values_in_bounds(self):
        # 测试普通范围场景
        min_val = -10
        max_val = 10
        matrix = random3by3Matrix(min_val, max_val)
        # 用all()结合生成器表达式检查所有元素在区间内
        all_valid = all(min_val <= num <= max_val for row in matrix for num in row)
        self.assertTrue(all_valid)

    def test_matrix_fixed_value(self):
        # 测试上下界相等的场景
        fixed_val = 7
        matrix = random3by3Matrix(fixed_val, fixed_val)
        all_fixed = all(num == fixed_val for row in matrix for num in row)
        self.assertTrue(all_fixed)

if __name__ == '__main__':
    unittest.main()

说明:

  • 去掉了冗余的辅助函数,直接用嵌套生成器遍历所有元素
  • 拆分测试用例,分别测试普通范围和固定值场景,逻辑更清晰
  • 使用self.assertTrue()替代self.assertEqual(True, ...),更符合单元测试的语法习惯

二、测试随机分布的均匀性

随机分布的测试属于统计类测试,无法通过单次结果验证,需要通过大量样本的统计特征来判断(这里假设目标是均匀分布):

实现思路

  1. 生成足够多的3×3矩阵样本,确保每个可能的数值都有足够的出现次数
  2. 统计每个数值的出现频率
  3. 用卡方检验对比观测频率与预期均匀分布的频率,验证是否符合预期

示例代码

import random
from scipy.stats import chisquare

def random3by3Matrix(smallest_num, largest_num):
    matrix = [[0 for x in range(3)] for y in range(3)]
    for i in range(3):
        for j in range(3):
            matrix[i][j] = random.randrange(int(smallest_num),
                                            int(largest_num + 1)) if smallest_num != largest_num else smallest_num
    return matrix

def test_uniform_distribution():
    min_val = -10
    max_val = 10
    # 生成10000个矩阵,共90000个元素,保证统计显著性
    total_elements = 90000
    value_counts = {num: 0 for num in range(min_val, max_val + 1)}

    for _ in range(10000):
        matrix = random3by3Matrix(min_val, max_val)
        for row in matrix:
            for num in row:
                value_counts[num] += 1

    # 均匀分布下每个数值的预期出现次数
    expected_count = total_elements / len(value_counts)
    observed_counts = list(value_counts.values())

    # 执行卡方检验,p值>0.05则认为符合均匀分布
    chi2_stat, p_value = chisquare(observed_counts, [expected_count] * len(value_counts))
    print(f"卡方检验p值: {p_value:.4f}")
    # 断言p值大于0.05,接受均匀分布假设
    assert p_value > 0.05, "生成的数值不符合均匀分布"

test_uniform_distribution()

说明:

  • 样本量要足够大,否则统计结果会有偏差
  • 卡方检验是常用的分布拟合检验方法,p值大于0.05(常用显著性水平)时,我们可以认为生成的数值符合均匀分布
  • 这种测试是统计意义上的验证,无法保证100%准确,但能有效检测随机生成逻辑的合理性

内容的提问来源于stack exchange,提问作者haifisch123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:50:23