系统需求说明书
项目名称:Gogoing
专 业:软件工程
组 号:
小组成员:张晨建、杜永超、郭昊、郎国杰
完成时间:2015-6-18
目录
1. 系统概述
1.1. 系统功能简介
1.2 系统用户角色
2. 理由
3. 项目范围
4. 系统假设
5. 系统定义
6. 用户场景
7. 用户用例
7.1 用户用例步骤
8. 文档历史
1. 系统概述
1.1. 系统功能简介
定位: 首页左上方的小地图表示点开后可以进入百度地图界面,对自己当前所在的位置进行定位,并且可以查看相关路线。
搜索: 首页顶端的搜索栏可以对想去的景点进行查询。
推荐: 搜索栏下面的图片,是推荐的景点图片。
区间: 景区门票区间,共分为四个段位,根据门票的价格进行区分。分为:“0元区”、“1-50元区”、“51-100元区”、“100+区”四个模块;每个区间有最热门的推荐景点,还有距离远近的分类汇总,每个景点信息包括:景点名称,景点位置,景点门票,景点简介,路线安排等等用户需要了解的一切行程规划尽在掌握。
路漫漫而修远兮,吾将上下而求索。
1.2 系统用户角色
表 6-1系统用户角色表
岗位 |
职责 |
系统用户 |
业务需求 |
开发人员 |
开发并负责APP更新与后期维护 |
开发 |
|
审核 |
|||
审核人员 |
审核是否有其他问题 |
审核 |
|
测试人员 |
测试代码是否有BUG |
测试 |
|
2. 理由
对于不能自己挣钱的大学生,穷游是一个很不错的方式,既可以节省钱,又可以走出宿舍,走出网络。Gogoing是由我们“山药蛋团队”基于安卓系统开发完成。该软件针对于我们大学生没有赚钱能力,却又渴望外面的世界,该软件的核心理念的是“穷”游。为当代的大学生提供一个景点推荐或者方案,可以以最省钱的方式去旅游。
见识世界,开拓眼界,读万卷书,行万里路。
3. 项目范围
Gogoing是一款一穷游为主题的APP,其开发主要包括后台数据库的建立、维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的数据库。而对于后者则要求应用程序具有功能完备,易使用等特点。为了使本系统成功达到用户的要求,需要在2015.6.22之前完成本系统的开发测试,并写提交相关的技术文档。通过与用户的沟通,及时获得用户的最新需求以便于本APP的完善。
4. 系统假设
本项目的开发时间为2015-4-22—2015-6-22
开发人员人数:4人
技术文档写作人员人数4人
测试人员人数4人
设备:4台PC
5. 系统定义
问题定义:在智能手机日益普及的今天,使用智能手机管理各种资源无疑给人们提供了很大的方便,对于学生而言,若采用一套行之有效的出行方式,不仅省钱高效,而且减少了跑错地方、吃亏上当的发生。我们即将开发的APP是一功能比较完善的旅游APP,能方便快捷出行。并且具有很好的可移植性,可在应用范围较广的android操作系统上使用。同时,该APP也有很强的安全性。
可行性研究:技术的可行性:目前已经成功的开发出许多旅游 APP,信息技术智能手机软硬件发展已经完全可以满足本APP的技术要求,本方案要求较高,安全性和可靠性较强,但通过前面的综合分析,可以知道从技术上是可行的。
对现有软件不会产生冲突,对使用的操作系统来说有很好的兼容性、稳 定性。
本系统采用Android4.30和Androidsdk进行开发,利用所学技术进行实现功能,技术上很易懂实用。
经济可行性:本APP简单可行,采用所学知识进行开发研究,很经济实用,是经济耐用且好用的一个旅游APP。
运行可行性:我们使用都是安卓智能手机,所以本APP在运行上要求适中,适合学生出游时使用。
需求分析:随着学校规模的不断扩大,学生数量急剧增加,有关学生的各种信息也成倍增加。面对庞大的学生,就需要有旅游APP来帮助学生方便快捷出游。通过这样的APP,可以做到随时出行,快捷出游。现在的时代是网络普及是时代,学生有条件通过网络方便快捷的管理自己的个人生活。所以,
Gogoing可以是学生按去哪、方便、快捷出行。
从自己学习的角度来说:这次APP的制作过程,无疑加深了自身对软件工程专业理论知识的理解,大大提高了理论知识的应用水平,而且增强动手能力,可以说是为毕业设计做了很好准备。面对以后强大的就业压力,没有熟练的动手能力, 光有满脑袋的理论是不行的,因此本次设计的意义显得十分重要。
6. 用户场景
用户场景描述1
系统角色 |
业务需求 |
用户场景 |
用户 |
出去旅游 |
学生发现自己想去玩,但是却一无所知,正好我们的APP为学生提供了价格区间以及路线安排,让学生方便、快捷、省钱出行 |
用户场景描述2
系统角色 |
业务需求 |
用户场景 |
用户 |
找不到地方 |
学生发现自己迷路了,,我们的APP为学生提供了地图,可以定位当前位置,让学生知道自己在那?无论求助还是接着旅游都是很方便、安全的。 |
7. 用户用例
7.1 用户用例步骤
下载好软件,安装后就可正常使用。使用说明如下:
项目名称:GoGoing
软件使用说明:
在主界面是可以点击选择景点门票区间来选择景点,同时也可搜索景点显示信息。
还可以通过定位功能显示附近景点。
点开门票区间后是一些景点的图片和简介,还可以通过距离远近筛选景点。
再点击景点的图片就可以打开景点的介绍,包括景点的名称,位置,介绍,门票价格,距离,交通等信息。
软件的优缺点:优点是可以通过门票价格区间选择想去的地点,缺点是景点介绍没有具体,实际,界面不够美观,也没有节假日的推广活动。
项目总结:GoGoing是一款非常适合大学生节假日穷游的软件,我们致力于让大家用最少的钱享受最美好的旅行生活。
八、文档历史
文档历史
版本 |
修改内容 |
修改日期 |
修改人 |
审阅人 |
V1.0 |
原始版本 |
2015-6-22 |
张晨建 |
杜永超、郭昊、郎国杰 |
V1.1 |
GoGoing概要设计说明书
1引言
1.1编写目的
通过对大学生的需求进行分析,对这款软件进行概要设计。希望能通过这款软件,让大学生能更方便的出门旅游。
1.2背景
这款软件的名称叫GoGoing,通过它可以方便的查询景点信息和大学生穷游推荐。还可以通过定位所在位置来推荐当地的美景。
1.3定义
1.4参考资料
2总体设计
2.1需求规定
由于设计的是手机端的软件,因此用户需要通过点击,滑动等方式,将软件的各种信息显示到手机屏幕上。
2.2运行环境
Android 4.0系统以上
2.3基本设计概念和处理流程
进入软件后,主界面有搜索框,可以搜索景点信息,还有定位功能,可以定位当前的地点,推荐周边景点。搜索框一下是最近有活动的景点推荐,尤其是节日期间。再往下是通过门票价格区间划分的各个景点,用户可以选择进入到第二个界面:景点推荐界面,里面有景点的图片和间接,同时还可以通过筛选条件对景点进行筛选,然后还可以通过点击进入到景点的具体信息的界面。
2.4结构
3接口设计
3.1用户接口
用户通过屏幕点击、滑动触发软件的打开,切换的效果。
3.2外部接口
导入百度地图API
3.3内部接口
通过intent实现界面的跳转,通过参数调用的方式传递值。
4运行设计
4.1运行模块的组合
用户通过前台的点击,软件调用数据库并将信息传输并显示到前台上。
4.2运行控制
运行控制将严格按照函数调用关系实现,在各事务中心模块,需对运行控制做正确的判断,选择正确的控制路径。
4.5运行时间
查询景点信息占用内存资源较小,定位需要借助网络,占用内存较多,速度较慢。
5系统数据结构设计
5.1逻辑结构设计要点
数据库中有一个表,为景点信息表,包括景点名称、景点的简介、景点的位置、门票价格、景点距离、景点路线和景点的图片。
5.2数据结构与程序的关系
数据的结构可以提供各个景点的具体信息,通过数据库存储各个景点的信息,就可以快速查找到所需要的信息。
6系统出错处理设计
6.1出错信息
1.用户由于网络问题无法打开定位信息。软件将会提示无法连接到网络,并跳转到主界面。
2.用户搜索景点关键字有可能未找到。软件将会提示无当前景点。
6.2补救措施
若数据库被破坏,可以将已备份的数据库还原。
6.3系统维护设计
系统将会自动检查和检测数据库的运行情况,并及时的备份。
如果数据库被破坏,可及时的还原数据库。
GoGoing概要设计说明书
1引言
1.1编写目的
通过对大学生的需求进行分析,对这款软件进行概要设计。希望能通过这款软件,让大学生能更方便的出门旅游。
1.2背景
这款软件的名称叫GoGoing,通过它可以方便的查询景点信息和大学生穷游推荐。还可以通过定位所在位置来推荐当地的美景。
1.3定义
1.4参考资料
2总体设计
2.1需求规定
由于设计的是手机端的软件,因此用户需要通过点击,滑动等方式,将软件的各种信息显示到手机屏幕上。
2.2运行环境
Android 4.0系统以上
2.3基本设计概念和处理流程
进入软件后,主界面有搜索框,可以搜索景点信息,还有定位功能,可以定位当前的地点,推荐周边景点。搜索框一下是最近有活动的景点推荐,尤其是节日期间。再往下是通过门票价格区间划分的各个景点,用户可以选择进入到第二个界面:景点推荐界面,里面有景点的图片和间接,同时还可以通过筛选条件对景点进行筛选,然后还可以通过点击进入到景点的具体信息的界面。
2.4结构
3接口设计
3.1用户接口
用户通过屏幕点击、滑动触发软件的打开,切换的效果。
代码:
public class IntrActivity extends Activity{
private TextView tv1,tv2,tv3,tv4,tv5,tv6;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_intruduce);
Intent intent=getIntent();
String t=intent.getStringExtra("a");
tv1=(TextView) findViewById(R.id.textview01);
tv1.setText(t);
String u=intent.getStringExtra("b");
tv2=(TextView) findViewById(R.id.textview02);
tv2.setText(u);
String w=intent.getStringExtra("c");
tv3=(TextView) findViewById(R.id.textview03);
tv3.setText(w);
String x=intent.getStringExtra("d");
tv4=(TextView) findViewById(R.id.textview04);
tv4.setText(x);
String y=intent.getStringExtra("e");
tv5=(TextView) findViewById(R.id.textview05);
tv5.setText(y);
String z=intent.getStringExtra("f");
tv6=(TextView) findViewById(R.id.textview06);
tv6.setText(z);
}
}
3.2外部接口
导入百度地图API
代码:
public class MapActivity extends Activity {
private MapView mMapView;
private BaiduMap mBaiduMap;
private Context context;
//定位相关
private LocationClient mLocationClient;
private MyLocationListener mLocationListene;
private boolean isFirstIn = true;
private double mLatitude;
private double mLongitude;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.map_main);
this.context = this;
initView();
//初始化定位
initLocation();
}
private void initLocation() {
mLocationClient = new LocationClient(this);
mLocationListene = new MyLocationListener();
mLocationClient.registerLocationListener(mLocationListene);
LocationClientOption option = new LocationClientOption();
option.setCoorType("bd09ll");
option.setIsNeedAddress(true);
option.setOpenGps(true);
option.setScanSpan(1000);
mLocationClient.setLocOption(option);
}
private void initView() {
mMapView = (MapView) findViewById(R.id.id_bmapView);
mBaiduMap = mMapView.getMap();
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
mBaiduMap.setMapStatus(msu);
}
@Override
protected void onResume(){
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
......
}
private class MyLocationListener implements BDLocationListener
{
@Override
public void onReceiveLocation(BDLocation location) {
// TODO Auto-generated method stub
MyLocationData data = new MyLocationData.Builder()//
.accuracy(location.getRadius())//
.latitude(location.getLatitude())//
.longitude(location.getLongitude())//
.build();
mBaiduMap.setMyLocationData(data);
mLatitude = location.getLatitude();
mLongitude = location.getLongitude();
if(isFirstIn)
{
LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.animateMapStatus(msu);
isFirstIn = false;
Toast.makeText(context, location.getAddrStr(),
Toast.LENGTH_SHORT ).show();
}
}
}
}
页面代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.baidu.mapapi.map.MapView
android:id="@+id/id_bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
</RelativeLayout>
3.3内部接口
通过intent实现界面的跳转,通过参数调用的方式传递值。
代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_port1);
spinner=(Spinner) findViewById(R.id.spinner1);
Intent intent=getIntent();
String s=intent.getStringExtra("extra");
tv1=(TextView) findViewById(R.id.textview);
......
tv6=(TextView) findViewById(R.id.textview5);
tv1.setText(s);
btn=findViewById(R.id.linearlayout5);
btn.setVisibility(View.VISIBLE);
......
btn=findViewById(R.id.linearlayout1);
btn.setVisibility(View.VISIBLE);
Drawable drawable1=getResources().getDrawable(R.drawable.port1);
......
Drawable drawable11=getResources().getDrawable(R.drawable.port11);
if(s.equals(getString(R.string.e)))
{
btn=findViewById(R.id.portbutton1);
.....
btn.setBackground(drawable10);
btn=findViewById(R.id.portbutton5);
btn.setBackground(drawable7);
tv2.setText(getString(R.string.b));
......
tv6.setText(getString(R.string.a));
}
if(s.equals(getString(R.string.f)))
{
btn=findViewById(R.id.portbutton1);
......
btn=findViewById(R.id.portbutton4);
btn.setBackground(drawable6);
tv2.setText(getString(R.string.c));
.......
tv5.setText(getString(R.string.o));
btn=findViewById(R.id.linearlayout5);
btn.setVisibility(View.GONE);
}
if(s.equals(getString(R.string.g)))
{
btn=findViewById(R.id.portbutton1);
......
btn.setVisibility(View.GONE);
}
if(s.equals(getString(R.string.h)))
{
btn=findViewById(R.id.portbutton1);
......
btn.setVisibility(View.GONE);
}
btn=findViewById(R.id.portbutton1);
setlistener();
......
btn=findViewById(R.id.portbutton5);
setlistener();
initSpinner();
}
private void initSpinner(){
String[] s=new String[]{"全部","10公里以内","10-50公里","50公里以外"};
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,s);
spinner.setSelection(1, true);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Spinner spinner1=(Spinner)parent;
String itemObj=(String) spinner1.getItemAtPosition(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
});
}
......
}
4运行设计
4.1运行模块的组合
用户通过前台的点击,软件调用数据库并将信息传输并显示到前台上。
代码:
public final class R {
public static final class anim {
public static final int left_in=0x7f040000;
public static final int left_out=0x7f040001;
public static final int right_in=0x7f040002;
public static final int right_out=0x7f040003;
}
public static final class attr {
}
public static final class dimen {
public static final int activity_horizontal_margin=0x7f050000;
public static final int activity_vertical_margin=0x7f050001;
}
public static final class drawable {
public static final int ic_launcher=0x7f020000;
......
public static final int port9=0x7f020012;
public static final int sa_city_location_clicked=0x7f020013;
}
public static final class id {
public static final int action_settings=0x7f090020;
public static final int activity_main=0x7f090006;
......
public static final int textview5=0x7f09001e;
}
public static final class layout {
public static final int activity_intruduce=0x7f030000;
public static final int activity_main=0x7f030001;
public static final int activity_port1=0x7f030002;
public static final int map_main=0x7f030003;
}
public static final class menu {
public static final int main=0x7f080000;
public static final int map=0x7f080001;
public static final int port=0x7f080002;
}
public static final class string {
.....
public static final int z=0x7f06001c;
}
public static final class style {
public static final int AppBaseTheme=0x7f070000;
/** Application theme.
All customizations that are NOT specific to a particular API-level can go here.
*/
public static final int AppTheme=0x7f070001;
}
}
代码:
public class MainActivity extends Activity implements ViewFactory{
private View btn;
private ImageSwitcher imageswitcher;
private int[] images={R.drawable.p1,R.drawable.p3,R.drawable.picture1,R.drawable.picture2};
private int index;
public String s;
Handler handler=new Handler(){
public void handleMessage(Message msg)
{
switch(msg.what){
case 1:
updateimages();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=findViewById(R.id.button1);
setlistener();
btn=findViewById(R.id.button2);
setlistener();
btn=findViewById(R.id.button3);
setlistener();
btn=findViewById(R.id.button4);
setlistener();
btn=findViewById(R.id.buttonmap);
btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i=new Intent();
i.setClass(MainActivity.this,MapActivity.class);
startActivity(i);
}
}
);
imageswitcher=(ImageSwitcher) findViewById(R.id.imageswitcher);
imageswitcher.setFactory(this);
imageswitcher.setImageResource(images[index]);
Timer timer=new Timer();
timer.scheduleAtFixedRate(new MyTask(),1,5000);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
4.2运行控制
运行控制将严格按照函数调用关系实现,在各事务中心模块,需对运行控制做正确的判断,选择正确的控制路径。
4.5运行时间
查询景点信息占用内存资源较小,定位需要借助网络,占用内存较多,速度较慢。
5系统数据结构设计
5.1逻辑结构设计要点
数据库中有一个表,为景点信息表,包括景点名称、景点的简介、景点的位置、门票价格、景点距离、景点路线和景点的图片。
5.2数据结构与程序的关系
数据的结构可以提供各个景点的具体信息,通过数据库存储各个景点的信息,就可以快速查找到所需要的信息。
6系统出错处理设计
6.1出错信息
1.用户由于网络问题无法打开定位信息。软件将会提示无法连接到网络,并跳转到主界面。
2.用户搜索景点关键字有可能未找到。软件将会提示无当前景点。
6.2补救措施
若数据库被破坏,可以将已备份的数据库还原。
6.3系统维护设计
系统将会自动检查和检测数据库的运行情况,并及时的备份。
如果数据库被破坏,可及时的还原数据库。
GOgoing测试计划
2015年06月22日
产品名称 |
GOgoing |
||||
文档编号 |
版本号 |
页 数 |
17 |
文档名称: 测试计划
作者: |
张晨建 |
日期: |
2015-06-22 |
||
审核: |
日期: |
||||
批准: |
日期: |
评审意见: 确 认: 日 期: |
地址:
邮编 200030
总机: Fax:
目录
第一章 总论 1
1.1 项目背景 1
1.2 项目目标 1
1.3 系统视图 1
1.4 文档目的 2
1.5 文档摘要 2
第二章 测试策略 3
2.1 整体策略 3
2.2 测试范围 4
2.3 风险分析 5
第三章 测试方法 6
3.1 里程碑技术 6
3.2 测试用例设计 6
3.3 测试实施过程 6
3.4 测试方法综述 7
第四章 测试组织 8
4.1 测试团队结构 8
4.2 功能划分 8
4.3 联系方式 9
第五章 资源需求 10
5.1 培训需求 10
5.2 硬件需求 10
5.3 软件需求 10
5.4 办公空间需求 10
5.5 相关信息保存的位置 11
第六章 时间进度安排 12
第七章 测试过程管理 13
7.1 测试文档 13
7.2 缺陷处理过程 14
7.3 测试报告 15
第八章 附件 16
第九章 变更记录 17
总论
项目背景
对于不能自己挣钱的大学生,穷游是一个很不错的方式,既可以节省钱,又可以走出宿舍,走出网络。Gogoing是由我们“山药蛋团队”基于安卓系统开发完成。该软件针对于我们大学生没有赚钱能力,却又渴望外面的世界,该软件的核心理念的是“穷”游。为当代的大学生提供一个景点推荐或者方案,可以以最省钱的方式去旅游。
见识世界,开拓眼界,读万卷书,行万里路。
项目目标
定位: 首页左上方的小地图表示点开后可以进入百度地图界面,对自己当前所在的位置进行定位,并且可以查看相关路线。
搜索: 首页顶端的搜索栏可以对想去的景点进行查询。
推荐: 搜索栏下面的图片,是推荐的景点图片。
区间: 景区门票区间,共分为四个段位,根据门票的价格进行区分。分为:“0元区”、“1-50元区”、“51-100元区”、“100+区”四个模块;每个区间有最热门的推荐景点,还有距离远近的分类汇总,每个景点信息包括:景点名称,景点位置,景点门票,景点简介,路线安排等等用户需要了解的一切行程规划尽在掌握。
系统视图
文档目的
本测试计划主要有两类受众:测试管理人员(山药蛋团地成员)和测试人员。
u 测试人员根据该测试计划中制定的范围、方法确定测试需求、设计测试用例、执行和记录测试过程并记录和报告缺陷。
本文档主要阐述Gogoing测试过程中的一些细节,为Gogoing的测试工作提供一个框架和规范:
l 确定项目测试的策略、范围和方法;
l 使项目测试工作的所有参与人员(客户方参与人员、测试管理者、测试人员)对本项目测试的目标、范围、策略、方法、组织、资源等有一个清晰的认识;
l 使项目测试工作的所有参与人员理解测试控制过程;
l 从策略角度说明本项目测试的组织和管理,指导测试进展,并作为项目测试工作实施的依据;
l 本文档是本项目测试整个过程进行的依据、规范和标准;
在测试过程中严格按照本文档的制定的规范去执行。
文档摘要
在项目测试中很多因素决定了测试的成败和效率,同进也潜藏一定的测试风险。在本文档中,主要通过以下方面对项目进行分析、计划和控制。
l 系统理解 测试人员通过基本培训和使用系统来加强对项目的理解;每个人都仔细研究了市场
l 测试策略 对于本项目,采用黑箱测试策略,测试范围为全部代码。有着工作量太大的风险
l 测试需求 测试范围为全部代码、测试重点为数据库和百度地图,测试的目标是要没有BUG;
l 测试设计 采用黑箱测试策略,由张晨建负责编写。按照功能一步步测试。
l 测试环境 需要基于安卓系统开发的测试环境。
l 过程控制 测试文档备份管理,缺陷尽量解决,测试过程按照计划完成工作
测试策略
整体策略
本项目的特点:
- 参与的测试人员都是第一次接触考试系统
- 系统已经做过一些测试,并且已经在运行
- 相对于项目要做的事情来说,时间进度非常紧(要建立一个基本完善的测试规范、要设计整套测试用例和执行一轮完整的测试)
- 本次项目测试的只对系统进行一轮测试
根据以上特点,制定本项目的测试过程策略如下:
- 以80/20原理为指导。 尽量做到在有限的时间里发现尽可能多的缺陷(尤其是严重缺陷)
- 测试计划与需求制定、用例设计同步进行
- 必须制定测试需求。 通过确定要测试的内容和各自的优先级、重要性,使测试设计工作更有目的性,在需求的指导下设计出更多更有效的用例。
- 逐步完善测试用例库。 测试用例库的建设是一个不断完善的过程,我们要在有限的时间里,先设计出一整套的测试用例,重要的部分用例需要设计得完善一些,一般部分的则指出测试的要点,在以后的测试工作中再不断去完善测试用例库。
- 测试过程要受到控制。 根据事先定义的测试执行顺序进行测试,并填写测试记录表,保证测试过程是受控的。
- 确定重点。 测试重点放在各子功能实现上,问题较多的数据库则是重中之重。
测试技术
u 本项目采用黑盒测试技术。
u 本项目测试过程中将不会采用测试工具。
依据标准
本次测试中测试文档的编写、测试用例的编写、具体的执行测试以及测试中各项资源的分配和估算,都是以山药蛋团队世纪理念为标准,软件的执行以系统逻辑设计构架为依据。
测试过程
测试范围
制定本次项目测试范围的依据为:
l 各子系统所包含的功能
l 同XX公司该项目负责人特别确定的测试范围
要测试的子系统:
测试内容 |
测试范围 |
功能测试 |
l 定位功能 l 数据库 l 图片切换 l 界面跳转 |
性能测试 |
一、模块 两个功能进行性能测试: 二 1、新景点数据入库性能 2、修改景点数据 3、地图功能性能 三、硬件配置 不同硬件配置对系统性能的影响 1、一般配置的性能(CPU:PⅢ 667、内存128M) 2、在一般配置的基础上增加内存后的性能(CPU:PⅢ 667、内存256M) 3、在一般配置的基础上升级CPU后的性能(CPU:P4、内存128M) |
风险分析
1、 测试人员对系统熟悉程度的风险: 参与本项目的测试人员都是第一次接触该类型系统,在经过短期的系统培训后,仍然有可能没有完全掌握系统的业务细节,这将在后面的测试设计和测试执行工作造成一些测试逃逸现象(即一些要测试的方面没有测到)。
2、 系统资料方面的风险: 本项目被测试的系统没有完备的开发文档,测试人员做测试设计时能够参考的只是使用手册和训练手册,以及通过培训和初步使用后对系统的了解,可能导致测试人员在初期无法全面地对系统进行深入的测试。
3、 时间方面的风险: 本次项目时间只有一个月,却要完成测试规范的制定、整套测试用例的设计和执行一轮完整的测试,时间进度非常紧张,可能导致测试设计工作不够完善。
测试方法
里程碑技术
在本项目中,我们将整个测试过程分为几个里程碑,达到一个里程碑后才能转换到下一阶段,以控制整个过程。
我们将整个测试过程分为以下几个里程碑:
里程碑 |
完成标准 |
系统培训: |
|
测试需求: |
|
测试设计: |
|
测试执行: |
|
结果分析: |
|
测试用例设计
本次测试的测试案例,是在经过系统培训后,由测试人员根据客户对系统的介绍和自己对系统的理解按照系统层次结构组织编写。
l 本系统案例的编写采用黑盒测试常用的分析方法设计用例;
l 对于每一个测试用例,测试设计人员应为其指定输入(或操作)、预期输出(或结果);
l 每一个测试用例,都必须有详细的测试步骤描述;
l 本次测试设计的所有测试用例均需以规范的文档方式保存;
l 在整个测试过程中,可根据项目实际情况对测试用例进行适当的变更;
l 测试用例中测试数据的准备,在客户的指导和协助下准备。
l 按照系统的运行结构安排用例的执行;
测试实施过程
本项目由两位测试人员分别负责不同的子系统的测试,实施过程如下:
1、 准备测试所需环境
2、 准备测试所需数据
3、 按照系统运行结构执行相应测试用例
4、 记录测试过程和发现的缺陷
5、 报告缺陷
测试方法综述
本项目测试包括:
u 功能测试 测试各功能是否有缺陷
u 性能测试 测试系统在一定环境下的性能数据
u 测试人员执行测试时,要严格按照测试用例中的内容来执行测试工作。
u 测试人员要将测试执行过程记录到测试执行记录文档中。
u 测试人员要对测试中发现的问题记录到缺陷记录中。
u 测试组织
本章主要描述测试团队的结构和职责,测试参与人员的功能划分,以及各自的联系方式等
测试团队结构
角色 |
人员 |
职责 |
项目经理 |
张晨建 |
u 组织测试培训 u 组织环境搭建 u 制定测试计划 u 制定测试规范 u 需求、用例审核 u 控制测试进度 u 与相关部门、人员沟通 |
客户指派 |
杜永超 |
u 协助沟通 u 组织系统培训 u 协助确定测试需求 u 协助准备测试环境和数据 |
测试需求制定 |
杜永超、郭昊 |
u 制定测试需求 |
测试设计 |
杜永超、郎国杰 |
u 设计测试用例 u 准备测试数据 |
测试执行 |
郭昊、郎国杰 |
u 按计划执行测试用例 u 记录执行过程 u 提出纠正建议措施 |
缺陷报告 |
张晨建 |
u 记录、报告所发现的缺陷 |
测试分析 |
张晨建、郭昊、杜永超 |
u 分析测试结果 u 编写成测试分析报告 |
功能划分
姓名 |
负责范围 |
张晨建 |
u 地图定位 |
郭昊 |
** 界面设计 |
联系方式
姓名 |
手机 |
电话 |
|
张晨建 |
15732115094 |
||
杜永超 |
15732115094 |
||
郭昊 |
15732115094 |
||
郎国杰 |
15732115094 |
资源需求
培训需求
由于参与本次测试的测试人员对考试管理系统都不了解,需要XX公司对这些测试人员进行系统的相关培训。培训内容包括:
u 系统架构的培训
u 系统数据流程的培训
u 各子系统的功能培训
u 在实际使用过程中哪些部分问题比较多
u 哪些部分是本次的重点测试对象
硬件需求
本次共有三名测试人员,需要单独使用的台式机三台,配置不低于PIII 500,128M内存。动另外,测试网站还需要一台网站的服务器。
名称 |
数量 |
配置 |
其它说明 |
测试机 |
3 |
不低于PⅢ 500、128M内存 |
|
WEB服务器 |
1 |
||
软件需求
根据系统的需求,操作系统可能需要安装Windows 2000和Windows 98,另外,每个测试人员的测试机上还需要安装Office办公软件和被测试的系统。
类型 |
名称 |
操作系统 |
Windows 2000 Professional Windows 98 SE |
办公软件 |
Office 2000中文版 |
AUT(被测应用程序) |
gogoing(报名系统、考场编排、考场管理、考试机、省中心、证书管理) |
办公空间需求
本次测试在XX公司进行,需要提供平均每人至少2平米的办公空间。
相关信息保存的位置
各个PC
时间进度安排
具体时间进度安排,请参见博客
测试过程管理
测试文档
测试文档管理
u 本项目对测试文档进行集中管理,文档集中存放在项目经理处,每天备份一次。
u 测试文档由不同角色分别创建,各角色创建的文档如下:
文档名称 |
编制者 |
其它说明 |
《测试计划》 |
项目经理 |
|
《测试需求表》 |
测试需求制定人员 |
|
《测试用例说明书》 |
测试设计人员 |
|
《测试执行记录表》 |
测试执行人员 |
|
《缺陷记录》 |
缺陷报告人员 |
|
《缺陷跟踪汇总表》 |
缺陷报告人员 |
|
《测试总结分析报告》 |
项目经理 |
编号规则
子系统编号
目的是定义要测试的各子系统的编号,以唯一标识各子系统。
本项目需要测试的各自系统的编号如下:
阶段 |
子系统名称 |
编号 |
地图 |
显示我的位置 |
01 |
定位 |
02 |
|
数据库 |
11 |
|
12 |
||
界面 |
功能 |
21 |
美观 |
22 |
|
测试项编号规则
这里的测试项,是指测试需求和测试用例等。
为了便于区分和管理测试项,并且唯一地标识测试项,需要对测试项规定一种编号规则。我们制定编号规则如下:
系统识别码.测试项识别码.子系统编号.模块编号.自行编号
编号名称 |
说明 |
定义 |
系统识别码 |
测试项目/系统的标识,在项目开始时自行定义,要求不与其他项目的标识冲突。 |
全国计算机信息高新技术考试系统 系统识别码为 LD |
测试项识别码 |
用于标识是何种测试项(测试用例、测试需求) |
测试需求 R 测试用例 C 缺陷记录 D |
子系统编号 |
各子系统的编号 |
与子系统编号中定义的一样 |
模块编号 |
唯一标识同一子系统中的各模块 |
需求设计人员制定需求时自行定义 |
自行编号 |
测试项序号 |
测试项设计人员自行定义,要求顺序标识 |
例子: LD.R.01.01.1
LD.C.11.02.11
LD.D.12.01.11
缺陷处理过程
本项目只对系统进行一轮测试,测试过程不需要做缺陷跟踪。 特定义缺陷处理过程如下:
1、 测试员每天记录当天发现的缺陷
2、 测试员每天下班前将记录的缺陷发送给项目经理
3、 项目经理将当前的缺陷记录转发给客户指派人员
4、 测试结束时项目经理将所有缺陷整合成一个完整的缺陷文档,同其它测试文档一同提交给客户
测试报告
测试过程中,需要产生以下报告:
报告名称 |
报告内容 |
编制者 |
接受者 |
测试工作周报 |
u 一周工作汇报, u 哪些做得好,为什么? u 有什么问题,如何改进? |
测试人员 项目经理 |
测试人员向项目经理汇报,项目经理向客户代表和公司领导汇报 |
测试阶段报告 |
达到里程碑后,汇报该阶段的主要工作、存在的问题和解决方法/建议等 |
项目经理 |
客户代表 公司领导 |
测试总结报告 |
u 测试过程概要 u 测试分析总结 u 建议 |
项目经理 |
客户代表 公司领导 |
附件
“XXXX - 工作任务安排.mpp”
变更记录
版本 |
修改内容描述 |
修改人 |
日期 |
备注 |