如何正确使用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, ...),更符合单元测试的语法习惯
二、测试随机分布的均匀性
随机分布的测试属于统计类测试,无法通过单次结果验证,需要通过大量样本的统计特征来判断(这里假设目标是均匀分布):
实现思路
- 生成足够多的3×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
相关产品推荐
相关产品推荐

