使用组合改进软件测试用例的生成 1

测试已经成为软件开发过程中一个至关重要的部分,但近来有三个因素使之扮演了一个甚至更加重要的角色。第一,Microsoftreg;.NET 开发环境的 诞生戏剧性地改进了开发人员编写定制测试自动化的能力。那些在 .NET 框架面世以前需要花费数周时间创建的测试程序现在仅用几小时就可以写好。第二,正在建立的日益复杂的系统需要更精益求精的测试。最后,软件安全在软件开发过程中已不再是事后才 关注的事情,它已成为一个绝对要素。曾经一度推出可能没有经过完全测试的产品,但这已不再是一个生存选择。为了帮助你迎接当今测试的挑战,本专栏将在随后几个月的 内容里讨论一些关于软件测试的原则、技巧和最佳实践。

  本月我将从组合在软件测试中的作用讲起。通过编程产生组合的能力使你能有一种强有力的方法来生成测试用例输入。为了弄清楚什么是组合,现在假定你正在写一个扑克 牌游戏程序。用手工生成所有可能的五张套测试输入将是一件令人很不爽的事情。但是用本文的示例代码,你便可以在分分钟内做好它:

  以下是引用片段:

    string[] deck = new string[] { "Ac", "Ad", "Ah", "As", "Kc", (...) };

    Combination c = new Combination(52,5); // 52 cards, 5 at a time

    string[] pokerHand = new string[5];

    while (c != null)

    {

    pokerHand = c.ApplyTo(deck);

    PrintHand(pokerHand);

    c = c.Successor();

    }

  一旦你谙熟组合之道,它在许多测试自动化场合极其有用。另外有一个例子,假定你正在测试某个系统,接收用户输入到一个容纳10个字符的文本框(textbox)。输入可能是“ABCDEFGHIJ”,同时另一个可能是“!@#$%^&*()”。你想知道这里有多少个不同的测试用例。让我们假设你已决定让字符输入 含在20个等价类中——也就是你的系统所关心的等价分类范畴。一个等价类可能是大写字母A到Z,而另一个等价类可能是数字0到9。
注意你必须选择10个字符,同时每个字符必须来自于20个分类中的一个。因此你要一次从20条中选出10个,或 Choose(20,10)——这个函数我将在本 文稍后讨论。注意我已经简化了这个场景。在实践中,你可能还需要综合考虑每一组合的排列以及边界条件和许多其它测试概念。

  在此我将用 C# 建立一个组合类,并示范如何使用组合提高测试效果。我想你会发现理解和应用组合及其相关算法是很有裨益的。

  



  Figure 1 组合演示

  屏幕的截屏是最佳示范方式。Figure 1 是一个基于 Windowsreg; 的应用程序屏幕,它演示了组合的使用。正如你所看到的,条目(items)的组合是这些条目的一个子集,它们的顺序并不重要。在这个例子中我有5个条目——名字 分别为 Adam、Barb、Carl、Dave 和 Eric,——而我感兴趣的是大小为3的组合。这里5选3有10种可能的子集:

  { Adam, Barb, Carl }, { Adam, Barb, Dave }, . . . { Carl, Dave, Eric }

  注意既然顺序并不重要,那么我不考虑 { Carl, Barb, Adam } 这样的子集,因为我认为它和 { Adam, Barb, Carl } 是相同的。Figure 1中所示的例子除了生成组合外,还举例说明了,我需要计算一个特定大小的条目集和子集能有多少种组合。

  数学上的组合是对这种子集思路的概括。取代了任意条目的子集的情况,序列n的一个数学组合是从0到n-1的整数的一个子集。因此一次从4个条目中取2个的数学组合 结果是6个元素(译注:element为组合中的一组):

  { 0, 1 }{ 1, 2 } { 0, 2 } { 1, 3 } { 0, 3 } { 2, 3 }

  正如我所说的,组合在软件测试自动化、开发、管理等的方方面面有着非常重要的作用。虽然组合背后的数学概念是古老而艰深,我最近发现,从一般意义上来说,组合 的概念并没有被软件工程师们很好地理解,同时,那些可以在 Internet 上获得的与组合有关的代码例子多半都是非常低效的,或者在许多情况下,简直就是错误的。

  组合

  数学组合的三个基本操作如 Figure 2 所示。输出告诉你当 n = 4,k = 2 时,有六种组合:

  { 0, 1 } { 1, 2 } { 0, 2 } { 1, 3 } { 0, 3 } { 2, 3 }

posted @ 2008-07-14 16:12  广陵散仙(www.cnblogs.com/junzhongxu/)  阅读(171)  评论(0编辑  收藏  举报