如何用组合提高软件测试用例的生成
测试一直是软件开发过程中的一个重要过程,而三个因素使得它扮演了更重要的角色。首先,微软.Net的环境已经显著地提高了程序员编写自定义自动化测试的能力,以前需要两周时间创建的测试项目,现在在.Net Framework下只用几个小时便可完成。第二,程序和系统越趋于复杂,所需的测试就越精密。最后,软件安全性已不再是程序开发最后才考虑的问题,它是绝对必要的。在以前有可能存在一款软件没有经过完整的测试就已向外发布的情况,但如今这已不再可行。为了帮助你满足现今的测试挑战,我将在这个栏目里每隔几个月就向你展示软件测试的最佳方法、原则和技术。
这个月我将从组合在软件测试中的角色开始说起。编程产生组合的能力,能够为你的测试用例输出提供强有力的方法。首先我谈谈我所说的组合的意思:如果你现在正在写一个扑克牌的程序,需要你手动输入5张牌牌型的所有可能情况,你一定不会乐意。但如果你用这个栏目里的代码来处理,你将能够在几分钟内做好这件事:
组合
数学组合的三个基本操作如 Figure 2 所示。输出告诉你当 n = 4,k = 2 时,有六种组合:
{ 0, 1 } { 1, 2 }
{ 0, 2 } { 1, 3 }
{ 0, 3 } { 2, 3 }
从这个例子你可以看到我需要建立某种组合,给定条目总数和子集大小来计算全部组合元素的总数,并且确定某个特定组合元素的后继者以便我能列出所有组合元素。
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个字符。用户可能会输入"ABCDEFGHIJ",或者是")(*&^%$#@!",你想知道共有多少种测试的用例。假定你要求输入字符的可选类型等于20种(这可能根据系统要求的不同而不同,比如从大写的'A'到'Z',或者是从0到9等等)。
要特别强调的是,你必须从20个不同的字符中一次性选取10个,即Choose(20,10)——这个函数我会在稍后解释。请注意,这里我其实简化了问题。实际上,你可能还需要考虑每个边界条件和其他测试概念的排列组合。
现在,我将会创建一个C#语言写的的组合类,并向你展示怎样用组合来提高测试的性能。我想你一定会认为理解并运用组合及其相关的理论是有价值的。
图1 Combinations Demo
贴上截图是让你能够跟上我思路的最好方式。图1是一个Windows@-based 应用程序的截图,它演示了组合的应用。正如你所看见的,组合就是一组元素的无序子集。在这个例子中我们有5个元素——Adam,Barb,Carl,Dave和Eric——我只对3个元素的组合感兴趣。从5个元素中一次性选出3个,共有10种不同组合:
注意,无序子集的意思是,{Carl,Barb,Adam}和{Adam,Barb,Carl}是等价的,两者都代表同一个子集。图1还说明了一点,在用给定的元素集合大小和子集大小生成组合时,我们还需要计算出不同组合的总数。
数学中组合的定义是:n是从整数0到n-1的集合,从4个元素的集合中一次选取2个的6种组合即是:
{ 0, 2 } { 1, 3 }
{ 0, 3 } { 2, 3 }
正如我之前所说,组合在软件测试、开发、管理等各种领域中都有着很大的作用。组合在数学领域中是古典而又深刻的,但我发现有很多程序员对它的理解都不够彻底,现有网络中的一些与组合相关的代码不是写错了,就是执行效率低下。
组合在规划和执行配置的测试中有着不可替代的作用,特别是在一些互动分析的分支领域。假如你需要在一台机器上测试多种浏览器和媒体播放器来安装你的产品,你想要你的系统从8种浏览器中选择3种安装,并从6个媒体播放器中选择2个安装,一共有多少种可能的配置?你能否用程序列举出所有的配置?本文的程序能够让你轻松得到结果:Choose(8,3)*Choose(6,2)=840,并且你可以列举出所有的组合类型。
组合在检查和测试执行路径时很有用。 我讲一个经典的执行路径分析的例子(这类问题经常在微软面试软件测试工程师时出现)。假设你正在开发一个游戏,玩家从有瓷砖地板的西南角房间进入,他们必须移动到房间的东北角,而要移动过去,必须通过把瓷砖向东或向北移动(换句话说,玩家必须移动向他们要去的方向,而不能回头)。如果房间很小——只有10个瓷砖能水平移动,6个瓷砖能竖直移动——共有多少种路径可供玩家选择?你能够列举出所有正确路径么?假定向东移动用英文字母E表示,向北用N,一种可能的路径是,先向东走到头,再向北走到头:
还有一种不同的走法:
显然,无论玩家怎么走,他都只会走16步,而且走的方式只有“E”和“非E”两种。你可以在脑海中构造一个16个连续的空格,你必须要在这16个空格中填充入10个“E”(因为剩下的必须填“N”)。所以,这个问题的答案便是Choose(16,10)=8080种可能的路径,你可以通过本片的代码轻松得到结果。
正如我之前所说,测试在软件开发中具有非常重要的作用,跟着我一起,你可以把这些优化加入在你的测试过程中。
文章来源于领测软件测试网 https://www.ltesting.net/