处理输入参数为空字符串的情况
问题
如何测试传给待测API方法的参数为空字符串的情况
设计
使用一个特殊的字符串标记来表示测试用例文件中的空字符串,并且在测试套件中加入相应的逻辑处理分支,把真正的空字符串作为参数传给待测API方法。
方案
创建如下测试用例数据:
0001:SubString:put:computer:true
0002:SubString:xyz:computer:false
0003:SubString:emptystring:computer:true
在测试套件中加入特殊的逻辑处理代码处理"emptystring"这个标记:
tokens = line.Split(':'); if (tokens[2] == "emptystring")//特殊输入 arg1 = " "; else arg1 = tokens[2]; bool actual = StringLib.Methods.SubString(arg1, tokens[3]); if (actual == bool.Parse(tokens[4])) Console.WriteLine("Pass"); else Console.WriteLine("*FAIL*"); |
注解
当测试以字符串为参数的API方法时,应该总是测试字符串为空的情况。一种方法是,在测试用例文件里存储一个特殊的字符串标记,比如"emptystring",然后在程序读到这个标记的时候转入相应的处理分支。例如,设想正在测试一个名为StringLib的程序库,它包含一个SubString()方法,这个方法接受两个字符串参数,如果第二个字符串包含第一个字符串,则返回true。在设计的时候,规定:如果传给它的第一个参数是空字符串,那么SubString()方法返回true。
与输入值为null的情况不同,我们可以间接地在测试用例数据文件里存储空字符串。例如,如下测试用例数据:
0003:SubString::computer:true
当通过String.Split()解析成一个名为tokens的字符串数组的时候,tokens[2]存储的就是一个空字符串,因为有两个相邻的的冒号中间没有值。但是,通常来说,最好还是存储一个特殊的字符串,因为这样可以例测试用例数据更容易读懂并且易于通过程序进行验证。
在测试用例数据文件里嵌入特殊字符串标记来处理空字符串输入,这种同样可以应用到测试其他不常用的输入数据。例如,设想正在测试一个以字符为输入参数的方法。你需要测试控制字符,比如"<CR>"和"<LF>",并且比较ASII字符和Unicode字符。可以在测试用例数据存储一些像"<cr>","<lf>"以及"\n0041“这样的字符串,并且在测试套件里加入特殊的处理逻辑来处理它们:
char input if(tokens[2] == "<CR>") //特殊输入 input = '\x000d'; else input = char.Parse(tokens[2]); |
如果测试用例数据文件经常有许多特殊字符,可以写一个叫作Map()的辅助方法,Map方法把从测试用例数据文件读到输入值转换成合适的参数值,这样测试套件代码就更为简洁并且易于扩展或裁减。例如,可以把Map()写成这样:
private static char Map(string token) { if(token == "<CR>") return '\x000d"; else if (token == "<LF>") return '\x000a'; //etc else return char.Parse(token) } |
然后就可以在测试套件里这么使用它:
char input = Map(token[2]);
相关阅读: