python笛卡尔积

Posted by Tesla9527 on August 12, 2021

在软件测试过程中,有时候会遇到多种组合条件的情况。比如一个查询功能,有5个查询字段,每个查询字段都有不同的可选项,这样组合起来的查询条件就非常多了。手工一个个写,那是绝对不可能的。一层层的for循环,看上去又太丑。这个时候python内置的模块itertools就派上用处了。

举例如下

1
2
3
4
5
6
7
8
9
10
import itertools

a = [0, 1]
b = [1, 2, 3, 4]
c = [0, 1]
d = [1, 2, 5, 17]

query = list(itertools.product(a, b, c, d))
print(query)
print(len(query))

运行结果如下

1
2
[(0, 1, 0, 1), (0, 1, 0, 2), (0, 1, 0, 5), (0, 1, 0, 17), (0, 1, 1, 1), (0, 1, 1, 2), (0, 1, 1, 5), (0, 1, 1, 17), (0, 2, 0, 1), (0, 2, 0, 2), (0, 2, 0, 5), (0, 2, 0, 17), (0, 2, 1, 1), (0, 2, 1, 2), (0, 2, 1, 5), (0, 2, 1, 17), (0, 3, 0, 1), (0, 3, 0, 2), (0, 3, 0, 5), (0, 3, 0, 17), (0, 3, 1, 1), (0, 3, 1, 2), (0, 3, 1, 5), (0, 3, 1, 17), (0, 4, 0, 1), (0, 4, 0, 2), (0, 4, 0, 5), (0, 4, 0, 17), (0, 4, 1, 1), (0, 4, 1, 2), (0, 4, 1, 5), (0, 4, 1, 17), (1, 1, 0, 1), (1, 1, 0, 2), (1, 1, 0, 5), (1, 1, 0, 17), (1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 5), (1, 1, 1, 17), (1, 2, 0, 1), (1, 2, 0, 2), (1, 2, 0, 5), (1, 2, 0, 17), (1, 2, 1, 1), (1, 2, 1, 2), (1, 2, 1, 5), (1, 2, 1, 17), (1, 3, 0, 1), (1, 3, 0, 2), (1, 3, 0, 5), (1, 3, 0, 17), (1, 3, 1, 1), (1, 3, 1, 2), (1, 3, 1, 5), (1, 3, 1, 17), (1, 4, 0, 1), (1, 4, 0, 2), (1, 4, 0, 5), (1, 4, 0, 17), (1, 4, 1, 1), (1, 4, 1, 2), (1, 4, 1, 5), (1, 4, 1, 17)]
64

如果觉得组合场景太多,可以使用python内置的random模块,随机选一部分组合。这样就能很好地用到测试工作中了。而且这样写起来也清晰,后期维护也方便。