8.5 使用存储在内存中的测试用例数据
问题
如何使用存储在内存中的测试用例数据,而不是使用像文本文件或SQL表这样的外部存储。
设计
创建一个类作用域范围内的ArrayList对象,并使用Add()方法插入测试用例数据。通过foreach或for循环遍历这个ArrayList对象。
方案
class Class1
{
static ArrayList testcases = new ArrayList();
static void Main(string[] args)
{
try
{
Console.WriteLine("\nBegin test run\n");
testcases.Add("001:GetTitles:testing:3:Theory");
testcases.Add("002:GetTitles:and:1:Theory");
testcases.Add("003:GetTitles:better:1:Build");
testcases.Add("004:GetTitles:Algorithms:1:Algorithms");
foreach (string testcase in testcases) // 主测试循环
{
string[] tokens = testcase.Split(':');
string id = tokens[0];
string method = tokens[1];
string input = tokens[2];
int expectedCount = int.Parse(tokens[3]);
string hint = tokens[4];
// 调用待测方法
// 比较实际结果与期望结果
// 显示或存储测试结果
}
}
catch(Exception ex)
{
Console.WriteLine("Fatal error: " + ex.Message);
}
}
}
对于轻量级的自动化测试,通常来说外部测试用例存储(以文本文件、XML文件、SQL数据库等形式)比内部存储要好一些。外部测试用例数据可以被不同的测试套件所共享并且易于编辑。但是使用内存中的测试用例数据也有它的优点;把测试用例数据嵌入测试套件,维护起来更容易。把测试用例存储在内存中,最简单的办法是使用一个ArrayList对象。当测试用例个数不多的时候(通常来说,少于100个)或者你想把测试套件作为一个单独的可执行文件供DRT(Developer Regression Test)或BVT(Build Verification Test)使用时,这种方法尤为适用。
注解
如果不使用ArrayList对象来存储测试用例,也可以使用array对象。如果使用array,上面的方案就会变成:
class Class1
{
static string[] testcases =
new string[] { "001:GetTitles:testing:3:Theory",
"002:GetTitles:and:1:Theory",
"003:GetTitles:better:1:Build"
};
static void Main(string[] args)
{
try
{
Console.WriteLine("\nBegin test run\n");
for (int i = 0; i < testcases.Length; ++i) // 主测试循环
{
string[] tokens = testcases[i].Split(':');
string id = tokens[0];
string method = tokens[1];
string input = tokens[2];
int expectedCount = int.Parse(tokens[3]);
string hint = tokens[4];
// 调用待测方法
// 比较实际结果与期望结果
// 显示或存储测试结果
}
}
catch(Exception ex)
{
Console.WriteLine("Fatal error: " + ex.Message);
}
}
}
这种方法给人一种旧的、.NET之前的程序所给人的感觉,但是它基本上与使用ArrayList是等效的。从理论上来说,使用array对象要比ArrayList有更好的运行效率,但是只有当测试用例数据非常多的时候,才有可能体现出来,而如果测试用例非常之多,那可能原本就不该把测试用例存储在内存中。
如果不使用ArrayList对象,还可以使用Queue对象把测试用例数据存储在内存中。使用Queue对象的方案如下:
class Class1
{
static Queue testcases = new Queue();
static void Main(string[] args)
{
try
{
testcases.Enqueue("001:GetTitles:testing:3:Theory");
testcases.Enqueue("002:GetTitles:and:1:Theory");
testcases.Enqueue("003:GetTitles:better:1:Build");
while (testcases.Count > 0)
{
string testcase = (string)testcases.Dequeue();
string[] tokens = testcase.Split(':');
string id = tokens[0];
string method = tokens[1];
string input = tokens[2];
int expectedCount = int.Parse(tokens[3]);
string hint = tokens[4];
// 调用待测方法
// 比较实际结果与期望结果
// 显示或存储测试结果
}
}
catch(Exception ex)
{
Console.WriteLine("Fatal error: " + ex.Message);
}
}
}
选择哪一种数据结构(ArrayList、array、Queue)用来存储测试用例,从技术上来说并没有多大区别。使用ArrayList或array对象可以对测试用例进行随机访问,因为可以通过索引值取出某个特定的测试用例。使用ArrayList或Queue对象,则可以通过ArayList.Add()或Queue.Enqueue()方法在程序中添加测试用例数据。但是,大多数时候,具体选择哪一个是根据个人对编程风格的喜好而定的。







