基于Android高校智慧公寓选房APP的设计与实现
学生宿舍选房是大学新生入学必须面临的问题。能够统计各宿舍的分配使用情况,清楚查看宿舍状态,图像化展示,一目了然。并与其它系统共用一个数据中心,共享信息,避免了数据的错漏、数据的重复冗余以及网络资源的浪费。
本系统通过Android系统的设计的宿舍选房系统,主要包含系统管理、个人信息管理,学生信息管理、选房信息管理、选房信息查询等五大模块,通过sqlite数据库缓存用户信息以及房源信息,学生可以通过app快速查看自己的宿舍位置以及选择心仪的宿舍,减少了跑腿次数以及选房流程,信息化完成选房过程。
本文对学生宿舍选房设计与实现开发原理,具体功能以及功能的特点app开发效果图和设计进行了介绍。
Design and implementation of student dormitory selection based on Android system
Abstract
Student dormitory selection is a problem that college freshmen must face when entering. Be able to count the distribution and use of each dormitory, clearly check the status of the dormitory, and visualize it at a glance. It also shares a data center with other systems to share information, avoiding data errors, data redundancy and waste of network resources.
The dormitory selection system designed by the Android system mainly includes five modules: system management, personal information management, student information management, room selection information management, and room selection information query. The system caches user information and room source information through the sqlite database. Students can quickly view their dormitory location and select their favorite dormitory through the app, reducing the number of errands and the room selection process, Informatization completes the house selection process.
This paper introduces the design and implementation of student dormitory room selection, the principle of development, the specific functions and the characteristics of the functions, and the design and effect of app development.
Key words: Android application; Select dormitory; App design and developme
如今互联网的行业的成熟,网上最早出现在20世纪90年代末期,13年广国内使用移动智能手机的也越来越流行。涉及到各行各业,在校园里面也丰富多样,校园外卖app,校园一网通,校园通讯录,图书app等等,但是在学生入学选宿舍这块不是很丰富,需要由更丰富的校园通讯模块,所以开发此app。
目前移动应用开发已逐渐覆盖。但目前校园统一的app在我国并未成气候,很多大学都是通过学生的实训作品应用的作为开发的app,缺少运营以及维护,很多都是通过现场的安排宿舍,目前操作有点太高的成本,效率也比较低,有些违背信息化的初衷。
在国外,信息化教育领域具有战略上的远见卓识和策略上的求新务实。多年来,美国,英国利用雄厚的综合国力,充分发挥各方优势,大力强化信息基础设施建设,积极发挥信息化教育的人才优势,努力开发利用丰富的信息资源,大大促进了整个社会信息化程度的全面提升,英国的全国学习网络已经成为欧洲最大的教育信息化,而且具备强大的信息化教育。国外的信息化水平处于世界领先,普及力度也是超前。
总的说来,单独的移动化应用在校园内部还是很有必要的。目前的状况是规模还不算普及,新生入学的选房需要走动在宿舍才能安排选房,不需要宿管的情况,直接自动化安排,所以特意开发此系统;
该课题旨在设计实现一个基于Android的学生宿舍管理系统,采用Android平台,让学生选宿舍变得及时、方便、易于操作和管理。该系统具有学生基础数据管理、学生选宿舍以及用户管理等功能。使得教师或者管理员人员只需在Android手机上就可以很方便地及做好入学的准备,并且领导、教师和学生都可以随时查询自己所需要的相关情况。
高校信息化管理的高速发展,不仅解决了手工管理出现的众多问题,还提高了各项工作的效率。对于高校新生,入校时最关心的一个问题就是住宿问题。因此,每年在新生报到之前,高校学生公寓管理相关部门都会将新生的住宿手动安排好,但是这种方式已经不适应高校采取大类招生的发展趋势,也不利于当代学生的个性发展需求,因此,高校智慧公寓选房APP的开发具有重要意义
本系统是基于Android系统实现的宿舍选房系统,使用Android SDK以及轻量级数据库SQLite,本系统设计主要包含,依据设计的总体架构对各个功能模块进行划分,并分别对各个模块作详细设计。同时,设计完成数据库的逻辑结构,以配合功能模块的数据处理,使得此系统的运营会更加方便,能够灵活的让新生应用起来;
主要包含系统管理、个人信息管理,学生信息管理、选房信息管理、选房信息查询等五大模块,通过sqlite数据库缓存用户信息以及房源信息,学生可以通过app快速查看自己的宿舍位置以及选择心仪的宿舍;
本论文是关于基于Android系统的学生宿舍选房设计与实现,通过计算机Android 应用设计开发,sqlite统等技术的融合,实现对移动应用的设计以及部署,能够快速让用户使用本设备。
第一章:绪论。首先分析了本课题的研究背景及意义,再对该领域的研究现状做了一定讲解,最后介绍了本文的研究内容与论文安排。
第二章:相关理论及技术介绍。从课题内容出发,设计系统所需功能模块,并由此延伸出整个系统的方案设计。
第三章:需求分析。介绍了系统硬件层面上各个模块的设计逻辑及安排,为后续软件层面的开发提供良好基础。
第四章:软件设计。从人机交互模块出发,分析系统所需流程及具体界面设计,从图像识别模块的基本实现步骤出发,设计适合本系统使用场景的图像识别程序。
第五章:详细设计与实现。根据上几章的相关设计,Android应用上选房系统样品并调试。
第六章:
第七章:总结与展望。总结本系统制作过程中的得失,并对该领域往后的发展提出自己的观点。
面向对象方法是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是建立在“对象”概念基础上的方法学。对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。
基本思想:尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界、解决问题的方法与过程, 也就是使描述问题的问题空间与实现解法的求解空间在结构上尽可能一致。
本系统是基于Android 系统开发,Android Studio 是 Android 的官方 IDE。它专为 Android 而打造,可以加快您的开发速度,帮助您为每款 Android 设备构建最高品质的应用;每个 SDK 平台版本都包含以下软件包:Android SDK 平台软件包。您必须拥有此软件包,才能针对相应版本编译您的应用。多个 System Image 软件包。您必须至少拥有其中一个软件包,才能在 Android 模拟器上运行相应版本。
SQLite 是一个轻量级数据库,它是D. Richard Hipp建立的公有领域项目,在2000年发布了第一个版本。它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需要占用几百kB的存储空间,这也是Android移动设备采用SQLite数据库的重要原因之一。
SQLite 是遵守ACID的关系型数据库管理系统。这里的ACID是指数据库事务正确执行的4个基本要素,即原子性(Atomicity)、致性 ( Consistency)、 隔离性( lolation). 持久性( Durabilily )。它能够支持Windows/Linux/UNIX等主流的操作系统,能够跟很多程序语言,例如Tcl、C#、PHP、 Java等相结合。比起Mysql、PostgreSQL 这两款开源数据库管理系统来讲,SQLite的处理速度更快。
导入工程如下图,在Android studio中file 选择open选项,然后选择需要导入工程即可
Android studio版本:Android Studio Dolphin | 2021.3.1 Patch 1
Gradle版本:classpath "com.android.tools.build:gradle:4.1.2"
本课题基于Android系统开发一款智慧公寓APP,主要功能模块包括:系统管理(用户管理、角色权限管理)、学生信息管理、选房信息管理(宿舍区域管理、宿舍楼管理、房间管理、床位管理)、选房情况查询(选房情况查询、自动安排床位)、个人中心等。
本系统是基于Android系统开发,对Android应用设计开发需要有一定移动端app的设计思路,,使用Android SDK以及轻量级数据库SQLite,本系统设计主要包含,依据设计的总体架构对各个功能模块进行划分,并分别对各个模块作详细设计。同时,设计完成数据库的逻辑结构,以配合功能模块的数据处理;
设计完成数据库的逻辑结构,以配合功能模块的数据处理,开发设计图如下:
项目主要是包含的功能有:系统管理(用户管理、角色权限管理)、学生信息管理、选房信息管理(宿舍区域管理、宿舍楼管理、房间管理、床位管理)、选房情况查询(选房情况查询、自动安排床位)、个人中心等。
- 系统管理(用户管理、角色权限管理),注册登录验证:对登陆用户进行验证。
用户信息图
- 学生信息管理,基本的学生信息管理,添加学生学生信息;通过Android的列表recycleview展示列表信息
- 选房信息管理(宿舍区域管理、宿舍楼管理、房间管理、床位管理)对宿舍的基本信息进行查询。
- 宿舍事务管理:学生可以对宿管人员发应宿舍中的事务。
- 个人信息,包含登录者的信息以及修改相关信息,展示我的宿舍信息
- 选房查询情况
其他帮助功能:显示系统用法。
口数据安全的保证过程,主要体现在这几个方面:一个就是数据传输过程中的安全,还有就是数据到达服务端,如何识别数据,最后一点就是数据存储的安全性;
Sqlite数据库缓存数据也较为安全的一种,存在自己的系统内部缓存,是有一点安全行的;
都是需要用户登录的。那么如果是非登录接口,是如何确保安全,如何确认用户身份的呢?可以使用token授权机制。
token的授权认证方案:用户在客户端输入用户名和密码,点击登录后,服务器会校验密码成功,会给客户端返回一个唯一值token,并将token以键值对的形式存放在缓存(一般是Redis)中。后续客户端对需要授权模块的所有操作都要带上这个token,服务器端接收到请求后,先进行token验证,如果token存在,才表明是合法请求。
token登录授权流程图如下:
用户输入用户名和密码,发起登录请求
服务端校验密码,如果校验通过,生成一个全局唯一的token。
将token存储在redis中,其中key是token,value是userId或者是用户信息,设置一个过期时间。
把这个token返回给客户端
用户发起其他业务请求时,需要带上这个token
后台服务会统一拦截接口请求,进行token有效性校验,并从中获取用户信息,供后续业务逻辑使用。如果token不存在;
启动app之后判断是否注册过,注册之后需要登录,登录校验成功之后将进入首页,进入选房以及查看选房
智慧公寓APP,主要功能模块包括:系统管理(用户管理、角色权限管理)、学生信息管理、选房信息管理(宿舍区域管理、宿舍楼管理、房间管理、床位管理)、选房情况查询(选房情况查询、自动安排床位)、个人中心等模块,如下是系统设计的框架图:
用户主要分为学生和管理员角色,管理员可以对房源信息管理,
对应的用户可以展示信息以及修改个人信息,查看个人的选房情况
管理员将新生入学的信息登记,学生的院系和个人资料等
将选学校的宿舍管理
查看用户登录的选房信息
六大设计原则主要是指:
单一职责原则(Single Responsibility Principle);
开闭原则(Open Closed Principle);
里氏替换原则(Liskov Substitution Principle);
迪米特法则(Law of Demeter),又叫“最少知道法则”;
接口隔离原则(Interface Segregation Principle);
依赖倒置原则(Dependence Inversion Principle)。
把这 6 个原则的首字母(里氏替换原则和迪米特法则的首字母重复,只取一个)联合起来就是:SOLID(稳定的),其代表的含义也就是把这 6 个原则结合使用的好处:建立稳定、灵活、健壮的设计。
4.3.2
4.4.1本系统是使用Android 轻量级的数据库 sqlite数据库,根据数据库的特征,将使用的数据实体类创建数据表
User 表
表名称:User表 | ||
字段名称 |
字段类型(长度) |
字段说明 |
Id |
Int |
主键(id) |
name |
String |
名称 |
pwd |
String |
密码 |
Phone |
String |
电话 |
room |
string |
房号 |
Dep |
String |
院系 |
addListTime |
String |
最后修改时间 |
duration |
long |
Room表
表名称:room表 | ||
字段名称 |
字段类型(长度) |
字段说明 |
Id |
Int |
主键 |
dep |
String |
院系名称 |
Build |
String |
楼栋 |
Story |
String |
层数 |
Count |
string |
人数 |
Roomnum |
String |
房号 |
Select |
String |
已选 |
Time |
时间 |
院系表
表名称:dep表 | ||
字段名称 |
字段类型(长度) |
字段说明 |
Id |
Int |
主键 |
dep |
String |
院系名称 |
Build |
String |
楼栋 |
Story |
String |
层数 |
Count |
string |
人数 |
Roomnum |
String |
房号 |
Select |
String |
已选 |
Time |
时间 |
4.4.2 数据库创建
public class DatabaseOpenHelper {
private final String TAG = DatabaseOpenHelper.class.getSimpleName();
private DbManager.DaoConfig daoConfig;
private static DbManager dbManager;
private final String DB_NAME = "home.db";
private final int DB_VERSION = 1;
private DatabaseOpenHelper() {
daoConfig = new DbManager.DaoConfig()
.setDbName(DB_NAME)
.setDbVersion(DB_VERSION)
.setDbOpenListener(db -> db.getDatabase().enableWriteAheadLogging())
.setDbUpgradeListener((db, oldVersion, newVersion) -> {
}).setTableCreateListener((db, table) -> {
});
dbManager = x.getDb(daoConfig);
}
public static DbManager getInstance() {
if (dbManager == null) {
DatabaseOpenHelper databaseOpenHelper = new DatabaseOpenHelper();
}
return dbManager;
}
创建数据库home.db 文件,db操作辅助类的,需要打开数据以及更新数据库的数据,需要修改字段将升级字段即可
登录注册页面
登录注册部分代码
public class LoginActivity extends AppCompatActivity {
ActivityLoginStuBinding loginBinding;
private String type = "";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loginBinding = ActivityLoginStuBinding.inflate(getLayoutInflater());
setContentView(loginBinding.getRoot());
initView();
}
private void initView(){
loginBinding.editAddress.getText();
loginBinding.editPwd.getText();
loginBinding.radioGroupUnassured.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//获取被选中的radiobutton的id
RadioButton rcheck = (RadioButton) findViewById(checkedId);
//获取
String checkText = rcheck.getText().toString();
type = checkText;
SharePrefUtils.setLoginType(type);
Toast.makeText(LoginActivity.this, "您选中的是:" + checkText, Toast.LENGTH_SHORT).show();
}
});
}
public void loginClick(View v) {
int i = v.getId();
if (i == R.id.btn_login) {
loginBinding.progressCircular.setVisibility(View.VISIBLE);
// try {
Thread.sleep(2500);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
if(TextUtils.isEmpty(type)){
Toast.makeText(LoginActivity.this,"请选择用户类型",Toast.LENGTH_LONG).show();
return;
}
if(!TextUtils.isEmpty(loginBinding.editAddress.getText().toString())&&loginBinding.editAddress.getText().toString().equals("admin")){
if(!TextUtils.isEmpty(loginBinding.editPwd.getText().toString())&&loginBinding.editPwd.getText().toString().equals("admin123")){
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.putExtra("user", "admin");
startActivity(intent);
}
}else {
if (TextUtils.isEmpty(loginBinding.editAddress.getText().toString())) {
Toast.makeText(LoginActivity.this, "用户名不能为空", Toast.LENGTH_LONG).show();
return;
} else if (TextUtils.isEmpty(loginBinding.editPwd.getText().toString())) {
Toast.makeText(LoginActivity.this, "密码不能为空", Toast.LENGTH_LONG).show();
return;
}
UserDao userDao = new UserDao();
UserBean userBean = userDao.getUser(loginBinding.editAddress.getText().toString());
if (userBean != null) {
if (userBean.getName().toString().equals(loginBinding.editAddress.getText().toString())
&& userBean.getPwd().toString().equals(loginBinding.editPwd.getText().toString())) {
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.putExtra("user", userBean.getName().toString());
startActivity(intent);
loginBinding.progressCircular.setVisibility(View.GONE);
} else {
loginBinding.progressCircular.setVisibility(View.GONE);
Toast.makeText(LoginActivity.this, "类型不对或者密码错误!", Toast.LENGTH_LONG).show();
}
} else {
loginBinding.progressCircular.setVisibility(View.GONE);
Toast.makeText(LoginActivity.this, "还未注册 ,请先注册!", Toast.LENGTH_LONG).show();
}
}
// }
// });
} else if (i == R.id.btn_register) {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
} else if (i == R.id.btn_forget_pwd) {
// forgetPwd();
} else if (i == R.id.btn_tip) {
// forwardTip();
}
}
}
宿舍选择页面
选房部分代码
public class SelectHomeTabFragment extends Fragment {
private RecyclerView recyclerView;
private EditText editText;
BollUserAdapter bollUserAdapter;
List<UserBean> contextBeanArrayList = new ArrayList<>();
UserDao userDao = new UserDao();
private static final String TAG = "TabFragment";
private Button mBtn;
public SelectHomeTabFragment() {
// Bundle b = new Bundle();
// b.putString("key", str);
// setArguments(b);
}
@SuppressLint("MissingInflatedId")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_done_tab_stu, container, false);
recyclerView = view.findViewById(R.id.lv_data);
editText = view.findViewById(R.id.edit_sea);
contextBeanArrayList = userDao.getContactAll();
mBtn = view.findViewById(R.id.pp);
return view;
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
// houseListAdapter = new BollInfoListAdapter();
// List<HomeInfoBean> houseBeans= new ArrayList<>();
// for (int i = 0; i < 20; i++) {
// HomeInfoBean houseBean= new HomeInfoBean();
//
// houseBeans.add(houseBean);
// }
// houseListAdapter.setDataList(getContext(),contextBeanArrayList);
// recyclerView.setAdapter(houseListAdapter);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
Log.e(TAG, "onCreate: -------------------" );
bollUserAdapter = new BollUserAdapter();
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(bollUserAdapter);
bollUserAdapter.setDataList(getContext(),contextBeanArrayList);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Random random = new Random();
// int a=random.nextInt(contextBeanArrayList.size());
// showNormalDialog(a);
startActivity(new Intent(getActivity(), DeBollActivity.class));
}
});
bollUserAdapter.setOnItemClickListener(new BollUserAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
// showNormalDialogBF(position);
if (MainActivity.USER.equals(contextBeanArrayList.get(position).getName())){
new Intent(getContext(), MeActivity.class);
}
}
@Override
public void onClickMoreOp(int position, View view, HomeInfoBean houseBean) {
}
@Override
public void onClickConnectPrint(int position, HomeInfoBean houseBean) {
}
});
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
private void showNormalDialog(final int position){
/* @setIcon 设置对话框图标
* @setTitle 设置对话框标题
* @setMessage 设置对话框消息提示
* setXXX方法返回Dialog对象,因此可以链式设置属性
*/
final AlertDialog.Builder normalDialog = new AlertDialog.Builder(getContext());
normalDialog.setTitle("匹配成功");
normalDialog.setMessage("是否邀请"+contextBeanArrayList.get(position).getName()+"一起打球");
normalDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//...To-do
// Toast.makeText(getContext(),"删除成功",Toast.LENGTH_LONG).show();
// contextBeanArrayList.remove(position);
// houseListAdapter.setDataList(getContext(),contextBeanArrayList);
}
});
normalDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
// 显示
normalDialog.show();
}
private void showNormalDialogBF(final int position){
/* @setIcon 设置对话框图标
* @setTitle 设置对话框标题
* @setMessage 设置对话框消息提示
* setXXX方法返回Dialog对象,因此可以链式设置属性
*/
final AlertDialog.Builder normalDialog = new AlertDialog.Builder(getContext());
normalDialog.setTitle("评分");
normalDialog.setMessage("对手的球技是怎么样的呢?");
normalDialog.setPositiveButton("比我强", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
UserBean userBean= userDao.getUser(MainActivity.USER);
userBean.setLevel(userBean.getLevel());
userDao.addOrUpdate(userBean);
Toast.makeText(getContext(),MainActivity.USER+"球技分加5分",Toast.LENGTH_LONG).show();
contextBeanArrayList = userDao.getContactAll();
bollUserAdapter.setDataList(getContext(),contextBeanArrayList);
}
});
normalDialog.setNegativeButton("比我弱", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
UserBean userBean = userDao.getUser(contextBeanArrayList.get(position).getName());
userBean.setLevel(userBean.getLevel()+5);
userDao.addOrUpdate(userBean);
Toast.makeText(getContext(),userBean.getName()+"球技分加5分",Toast.LENGTH_LONG).show();
dialog.dismiss();
contextBeanArrayList = userDao.getContactAll();
bollUserAdapter.setDataList(getContext(),contextBeanArrayList);
}
});
// 显示
normalDialog.show();
}
}
我的页面
软件测试的首要目的就是提高软件的质量,也就是让用户对产品有更好的体验,保证软件的高质量。
软件测试的第二大目的就是保证软件的安全,有一些软件是经过数据加密的,比如各大银行系统的APP。涉及到资金的支出和存入,对软件的安全性要求是特别高的。所以要通过反复测试来提高产品的安全性,保证产品在上线之后不会出现bug,尤其对于金融方面的APP来说,任何漏洞都是致命的。
软件测试的另外一个目的就是降低软件的开发成本,在开发过程中发现bug及时调整,这样的损失是很小的,一旦产品上线或是即将完成开发而发现bug,那么可能会造成产品大改动,这样就意味着以往的精力全部白费。因此测试的存在就是为了降低开发成本。比如迪士尼的一款狮子王的软件,借着狮子王的名声,预期本应是好评如潮,也能通过这款软件获益不匪。但因为在很多系统上都无法使用,所以造成了大量的用户投诉和下线、卸载等。对成本造成了非常大的损失。那如果当时这款软件能够在不同的系统上进行测试,在上线前将所有的问题全部解决掉,肯定会大大降低成本。
除了降低开发成本,还可以降低企业风险,试想,如果软件存在的问题过多,毫无疑问会影响企业的信誉,最终直接导致企业的合作企业变少,直接损害公司的收益。但如果有测试人员在中间严格把关,就完全不会出现这样的问题。
开发人员在开发过程中都是以顺向思维来写程序代码的,所以很少有开发人员能够站在用户角度去思考,但测试人员不一样,测试要以逆向思维来思考程序会在哪一步有问题,站在用户的角度进行测试,这样上线的产品将很符合用户的需求,用户使用时也比较顺手,增加用户体验感
根据设计的需求编写测试计划
测试计划如下表2-1所示。
表2-1 测试计划
测试模式 |
测试功能 |
测试步骤 |
期望效果 |
功能测试 |
注册登录 |
启动项目 注册用户 然后登录 |
实现验证成功 |
页面能否跳转 |
单击页面 |
页面实现跳转 |
|
选房 |
展示宿舍列表可以进行选择 |
显示正常 |
|
查看个人信息 |
不进入我的页面 |
个人信息展示正常 |
测试方法包括黑盒测试、白盒测试、灰盒测试、手动测试和自动化测试。 黑盒测试就是把软件系统当作一个“黑箱”,无法了解或使用系统的内部结构及知识,进行的测试。 一般刚入门的测试都是从黑盒测试开始的。 白盒测试就是设计者可以看到软件系统的内部结构,并且使用软件的内部知识来指导测试数据及方法的测试
一、项目测试流程步骤有哪些?
1. 测试需求提取与分析。根据需求说明书分析测试功能点,功能是否能够满足用户的实际使用场景,产出测试点。
2. 测试设计。把测试需求转化为具体的测试工作,可以通过等价类划分法等测试设计方法进行业务逻辑设计,搭建测试框架等。
3. 测试用例执行与回归。根据测试用例执行功能测试、性能测试等工作,对有缺陷的模块进行回归测试等。
4. Bug管理。测试过程中记录bug发现过程,bug对系统造成的影响,进行bug管理。
5. 总结。对项目测试过程进行总结归纳,为以后碰到同样的bug提供依据
注册模块,注册账号是否成功
登录模块,登录是否正常
选房模块,是否可以选房
个人信息模块,展示个人信息
当设计好用例、数据准备好后,就可以将设计好的成果应用于软件,如果在执行用例的过程中,发现软件执行的结果和测试用例中的预期结果不一致,那么,这就是软件缺陷即我们通常听到的软件bug,我们需要把该缺陷报告给相关开发人员进行修改,如何报告呢,即需要记录缺陷,也就是我们通常所说的缺陷报告。那么缺陷报告包含哪些内容;缺陷严重程度:表示软件缺陷所造成的危害的恶劣程度 。缺陷严重程度的分类在不同的软件公司,分类有的也不同,在此给出一种分类,内容如下:
Fatal:致命的错误,造成系统或应用程序崩溃、死机、系统悬挂,或造成数据丢失、主要功能完全丧失等。
Critical:严重错误,主要指功能或特性没有实现,主要功能部分丧失,次要功能完全丧失,或致命的错误声明。
Major:主要错误,这样的缺陷虽然不影响系统的使用,但没有很好的实现功能,没有达到预期效果。如提示信息不太准确,或用户界面差,操作时间长等。
Minor:一些小问题,对功能几乎没有影响,产品及属性仍可使用。
Suggestion:一些友好的建议。
缺陷优先级:表示修复缺陷的先后次序的指标。优先级的分类在不同的软件公司,分类也不尽相同,一般优先级的划分用ABCD或数字1—4表示,A或1表示最高级别,D或4表示最低级别。
最高优先级:立即修复,停止进一步测试。
次高优先级:在产品发布之前必须修复。
中等优先级:如果时间允许应该修复。
n最低优先级:可能会修复,但是也能不修复。
测试是为了避免使用过程中出现一些影响用户使用产品的问题,尽量发现项目中存在的问题;
首页感谢老师的培养和教导,此项目得与开发还是离不开老师的教导,在开发过程遇到不少问题也是在老师的帮助下完成,主要体现在sqlite数据库的应用,解决疑难问题,调式过程中经常卡克,另外需要感谢同学的鼓励和帮助,是他们一起学习生活中渡过一段时光,在枯燥乏味的日子,同学们的欢声笑语滋润了心田,是他们的一起前行中学习到了每个知识点,课外经常讨论不明白的问题,梳理了不少疑惑。
此项目离使用还存在很多的不足,希望能在积累知识点的同时继续完善功能,尽量满足每一个功能,能够达到投入使用的状态,解决用户学习英语的需求,主要问题是云交互阶段和跨端的调式,也是我需要继续挖掘和学习的地方;
此项目虽然不是很完美,但是从中学习到了一个项目的整体设计和实现过程,把理论知识应用到实践中,提升实践能力
参考文献
[1]李刚彪.数据库加密技术的研讨与完成[D].太原理工大学,2010:18-78.
[2]杨云君.Android的设计与完成[M].北京:机械工业出版社,2013:5-65.
[3]秦明甫.基于混沌实际的数字图像加密研讨[D].重庆大学,2009:34-48.
[4]柯除夕.Android内核分析[M].北京:电子工业出版社,2011:67-98.
[5]李刚.疯狂Android讲义[M].北京:电子工业出版社,2013:12-87.
[6]吴明航.DES和RSA混合加密算法的研讨[D].哈尔滨工业大学,2013:13-56.
[7]顶峰.Linux内存管理的设计与完成[D].沈阳工业大学,2007:45-89
[8]陈最.基于Android平台挪动终端通明加密零碎的研讨与完成[D].重庆理工大学,2012:108-150.
[9]佟晓筠,王翥,杜宇,岳银亮.基于软件平安混合加密技术的研讨[J].计算机工程,2004,23(33):98-100.
[10]程庭,张明慧,石公营.一种基于DES和RSA算法的数据加密方案及完成[J].河南教育学院学报(自然迷信版),2003,22(3):69-71.
[11]XinChen,SongweiMa,BingliGuo,YanWang,JuhaoLi,ZhangyuanChen,YongqiHe.Anovelfragmentation-awarespectrumallocationalgorithminflexiblebandwidthopticalnetworks[J].OpticalSwitchingandNetworking,2014(12):6-22.
[12]廉士国,李忠新,王执铨.两种基于局部加密的图像和视频加密方案[J].计算机工程,2004,4(11):11-34.
[13]Zhu,ZhiwuLiu,XuLi,Xiangyu.RatchetingBehaviorsoftheCarbonFiberReinforcedPEEKComposites:ExperimentalStudyandNumericalSimulation[J].Polymers&PolymerComposite,2014,(221)
在老师的耐心指导下完成了此项目及论文,为了保证我们毕业设计的正常进行,学院抽调了优秀的老师指导我们进行毕业设计,并且不时地询问我们毕业设计的进展情况。没有老师们的细心指导我的论文与系统就不可能顺利的完成,再次对你们表示衷心地感谢。老师认真负责的工作态度、严谨的治学风格,使我深受启发;同时也很感谢帮助过我和我一同探讨问题的同学们。为我们这次设计的正常开展提供了必要的基础。本次毕业设计,就要画上一个句号了。
感谢学院给我提供学习的平台,让我在这里接受了系统的学习。
感谢所有关心、支持、帮助过我的良师益友。
最后,向在百忙中抽出时间对本文进行评审并提出宝贵意见的各位老师表示衷心地感谢!
附录1