测试运行: 字符串排列2012-01-05 MSDN 以编程方式创建和使用字符串排列的能力是一项基本的软件测试技能。字符串排列是一组字符串的重排列。例如,如果您的初始组由三个字符串(apple、banana、cherry)组成,则共有六种排列:
{ "apple", "banana", "cherry" }{ "apple", "cherry", "banana" }{ "banana", "apple", "cherry" }{ "banana", "cherry", "apple" }{ "cherry", "apple", "banana" }{ "cherry", "banana", "apple" }
在软件测试中,排列的典型用途就是为单元、API 和模块测试生成测试案例数据。假设有一个接受三个字符串的方法,且一个测试案例输入为“apple”、“banana”、“cherry”。在大多数情况下,您希望创建使用其他输入排列的其他五个测试案例。在软件测试中,排列有许多其他用途。事实上,在软件工程中排列是如此地重要和流行,以致于有关排列的问题成为 Microsoft 测试工作的最常见的面试问题类型之一。了解我在本月专栏中所述观点的一个好方法是通过屏幕快照。图 1 显示了一个演示程序的运行。(用于生成演示的完整源代码可在本专栏中下载获得。)如图 1 中输出所指出的,与字符串排列相关的三个基本技能是:准确计算给定字符串组的排列数量的能力、生成所有排列的能力以及生成特定排列的能力。

图 1 字符串组合演示由于问题域之间的排列术语稍有不同,因此让我们建立几个在整个专栏中都将使用的关键词汇术语。术语排列元素是指由某个初始组形成的有序字符串组。术语原子意味着排列元素中的任意一个单个字符串。排列的阶是任意元素中的原子数量。我将使用按字典编辑顺序的排列。这意味着初始排列元素(也称为标识元素)的原子会按字典顺序列出。每个排列元素也相对于其他元素进行了排序。这意味着会有一个不同的标识排列元素、一个不同的最后元素,并且每个元素都有一个后续元素和前趋元素(除了第一个元素无前趋元素和最后一个元素无后续元素外)。最后,术语字符串排列仅指其原子为字符串的一个排列元素。我使用此术语的原因是阶 n 的数学排列具有多个整数原子,从 0 到 n-1(例如 { 0, 1, 2 })。阶 n 的排列元素的总数为 n!(读作“n 阶乘”)。例如,有四个原子,则排列元素的总数为:
4! = 4 * 3 * 2 * 1 = 24
其原因应该很容易明白。对于元素中的第一个原子,可选择 n 个原子中的任意一个。对于第二个原子,则可选择剩余的 n-1 个原子中的任意一个。等等。排列与组合密切相关,但有时会与组合混淆。字符串组合是初始字符串组的子集,其中顺序无关紧要。例如,假设初始字符串组由 apple、banana 和 cherry 组成。子集大小 k = 1 时有三个组合元素:
{ "apple" }, { "banana" }, {"cherry" }