本文主要关于我们小组的工程focuslifer的测试计划和tester的当前进度。
测试计划
focuslifer主要分为3层,分别是数据、逻辑和UI层。基本上来说,我们的测试分为三部分:
-- 底层测试:对数据层和逻辑层的测试,这是我们第一阶段要进行的测试。它包含几个方面:一是对数据层和逻辑层的单独测试(Functional Test);在单层测过之后,进行集成测试(Integration Test),通过对逻辑层操作和对对数据库的检查来测试这两层的整体功能;最后可以进行场景测试,根据我们提出的场景编写测试脚本。对于底层测试,我已实现了一个读脚本的tester,并打算再写一个脚本生成器,这样基本上可以实现在LiferInterface上的自动测试。
--UI测试:这是第二阶段(还没开始),主要是为了测试UI和逻辑层的连接是否有问题,以及UI是否达到了用户的需求(简洁性、美观性、易用性)。关于测试UI与逻辑层的连接,目前还没想到有什么自动化的方法.....打算手工操作UI,然后监视逻辑层的调用和数据库的改变,以及UI是否按照希望的方式更新。关于间接性、美观性、易用性,这个大家多提一些意见,以及找一些其它人来调查。同时,在UI测试阶段的最后也要有场景测试。
--其它:有关其它,我想主要是负载、压力测试,比如我们可以生成一个非常大的测试脚本,然后看程序的效能,比如添加task的延时,搜寻的延时,等。或者手工在UI上狂点(。。。)看看会不会崩溃。
测试实现
这里主要说一下当前的进度和实现。当前是底层测试阶段,主要集中在对LiferInterface上的接口的测试。当前已实现一个tester,它读取一个测试脚本,也就是一个操作的序列,同时记录数据库和逻辑层数据结构的变化,和测试脚本的标准输出对比;通过这种方法,可以找到Bug的症状(Symptom),再进一步将症状报告给各模块的负责人。这样做的好处是:
-- 方便了大量的测试,以后底层测试只需要编写测试的脚本即可,当前打算编写几个脚本生成器。
-- 模块分的很清楚,可以很容易知道是逻辑层还是数据层出了问题。
因为tester是通过System.Reflection(反射)实现的,所以操作名称和参数排列和LiferInterface完全一样,用分号隔开,如下是一个操作序列脚本:
AddTask; 04/24/2011 24:00;NORMAL;finish test report;finish test report;0;0;0;
AddTask;04/24/2011 24:00;NORMAL;write blog;write blog;1;0;0
SetDoneTask;1;1
SetDoneTask;2;1
它分别调用了LiferInterface的两个函数
ITask AddTask(DateTime dueDate, PriorityType priority, string title, string description, int parentID, int position, int tag);
和
void SetDoneTask(int taskID, bool isDone);
以上脚本的调用序列如下:
AddTask(new DateTime(2011, 4, 24, 24, 0, 0), LiferInterface.PriorityType.NORMAL, "finish test report", "finish test report", 0, 0, 0);
AddTask(new DateTime(2011, 4, 24, 24, 0, 0), LiferInterface.PriorityType.NORMAL, "write blog", "write blog", 1, 0, 0);
SetDoneTask(1, 1);
SetDoneTask(2, 1);
同时我们需要一个标准输出来监视逻辑层和数据层的数据,标准输出是xml文件,也是用System.Reflection实现,因此属性名和对应数据类型的域名是相同的,这个脚本的标准输出是
<task ID = 0, DueDate = "04/24/2011 24:00", Title = "finish test report", Description = "finish test reprot", Priority = NORMAL, IsDone = 1, Tag = 0>
<task ID = 1, DueDate = "04/24/2011 24:00", Title = "write blog", Description = "write blog", Priority = NORMAL, IsDone = 1, Tag = 0>
</task>
通过Xml格式可以读取task的树形结构,再与内存中的task树对比。