一、移动测试
1,测试信息
//待测试代码
展示效果【错误情形】
源码Demo
三、xml的生成与解析
1,xml文件生成
源码Demo
尽管人生那么无情,我们本人还是应当把自己尽量改好,少给人一些痛苦,多给人一些快乐。真正的光明不是没有黑暗,而是不被黑暗所吞噬;真正的英雄不是没有卑劣的情操,而是不被卑劣的情操所征服。所以,在你战胜外来的敌人之前,先得战胜你内在的敌人,你不必害怕沉沦堕落,只消你能不断的自拔与更新。~_~
2,Junit单元测试
【1】流程
编写待测试方法 --- 编写测试方法 ---- 维护测试环境 --- 得到测试结果
【2】简单Demo
eclipse环境:
eclipse环境:
//待测试代码
public int add(int first, int second) {
return (first + second);
}
//测试代码
public class MainJUnitTest extends AndroidTestCase {
public void testAdd() throws Exception {
MainActivity mainActivity = new MainActivity();
int result = mainActivity.add(3, 4);
assertEquals(7, result);
}
}
Eclipse环境配置:
//环境维护
application下添加:
<!-- 添加代码1 -->
<uses-library android:name="android.test.runner" />
application外添加:
<!-- 添加代码2 -->
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:label="suibian"
android:targetPackage="com.future.junittest" />
AS:
【1】流程
编写待测试方法 --- 编写测试方法 ---- 维护测试环境 --- 得到测试结果
【2】简单Demo
扩展:【 AS中测试(不同开发工具)/ 单元测试框架 】 Instrumentation框架
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 两数相加的方法
* @param first
* @param second
* @return
* 注:公共方法才能进行单元测试【代码问题限定区域来解决问题】
*/
public int add(int first, int second) {
return (first + second);
}
}
//测试代码
public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
}
public void testAdd()throws Exception{
MainActivity mainActivity = new MainActivity();
int result = mainActivity.add(3,4);
Assert.assertEquals(8,result);
}
}
添加依赖包:【AS中不用在清单文件配置参数】
展示效果【错误情形】
二、Android数据存储
1,文件
项目路径 --- 应用程序私有路径【硬编码】 ---
应用程序私有路径【API调用】
【数据存储繁琐】
/**
* 文件保存数据的方式【API指定路径】
* @param userNameFileStr 用户名数据
* @param pwdFileStr 用户名密码
*/
private void saveDataFilePrivateAPI(String userNameFileStr, String pwdFileStr) {
if (!judgeStr("文件用户名", userNameFileStr)) {
return;
}
if (!judgeStr("文件密码", pwdFileStr)) {
return;
}
//String url = "/data/data/<包名>/files";
String fileName = "infoFile.txt";
/**
* getFilesDir() 获取的是数据文件,在清除缓存数据时不会被清理;
* 当清理当前目录下的数据后,相当于APP刚新安装
*
* getCacheDir() 获取的是缓存数据文件,清除缓存数据就会被清理
*/
File file = new File(getFilesDir(), fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write((userNameFileStr + "##" + pwdFileStr).getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 文件数据回显
* @param userNameFile 用户名
* @param pwdFile 密码
*/
private void reShowFile(EditText userNameFile, EditText pwdFile) {
File file = new File(getFilesDir(), "infoFile.txt");
try {
FileInputStream fis = new FileInputStream(file);
byte[] buf = new byte[1024];
fis.read(buf);
fis.close();
String name = new String(buf).split("##")[0];
String pwd = new String(buf).split("##")[1];
userNameFile.setText(name);
pwdFile.setText(pwd);
} catch (Exception e) {
e.printStackTrace();
}
}
2,SD卡
项目路径 --- 应用程序私有路径【硬编码】 ---
应用程序私有路径【API调用】
SD卡可用性判断 ,空间判断
【清除程序数据不能清除数据,只有到SD卡中删除数据才行】
【绑定SD卡,与SD卡关系密切,不同应用间共享数据(安全性)】
/**
* SD卡保存数据方式【API路径】
*
* @param userNameSDStr
* @param pwdSDStr
*/
private void saveDataSDPrivateAPI(String userNameSDStr, String pwdSDStr) {
if (!judgeStr("SD用户名", userNameSDStr)) {
return;
}
if (!judgeStr("SD密码", pwdSDStr)) {
return;
}
// 需要先判断SD卡状态以及可用空间
//判断SD卡状态
if (!(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))) {
Toast.makeText(MainActivity.this, "SD卡不可用", Toast.LENGTH_SHORT).show();
return;
}
//获取可用空间
// long storge1 = Environment.getExternalStorageDirectory().getTotalSpace();//获取全部空间
// long storge1 = Environment.getExternalStorageDirectory().getFreeSpace();//获取可用空间
long storge = Environment.getExternalStorageDirectory().getFreeSpace();//获取可用空间
String desc = Formatter.formatFileSize(MainActivity.this, storge);
Toast.makeText(MainActivity.this, desc + "可用空间", Toast.LENGTH_SHORT).show();
try {
File file = new File(Environment.getExternalStorageDirectory(), "infoSD.txt");
FileOutputStream fos = new FileOutputStream(file);
fos.write((userNameSDStr + "##" + pwdSDStr).getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* SD卡数据回显
*
* @param userNameSD
* @param pwdSD
*/
private void reShowSD(EditText userNameSD, EditText pwdSD) {
File file = new File(Environment.getExternalStorageDirectory(), "infoSD.txt");
try {
FileInputStream fis = new FileInputStream(file);
byte[] buf = new byte[1024];
fis.read(buf);
fis.close();
String name = new String(buf).split("##")[0];
String pwd = new String(buf).split("##")[1];
userNameSD.setText(name);
pwdSD.setText(pwd);
} catch (Exception e) {
e.printStackTrace();
}
}
3,SP
/**
* SP保存数据方式
*
* @param userNameSPStr
* @param pwdSPStr
*/
private void saveDataSPPrivate(String userNameSPStr, String pwdSPStr) {
SharedPreferences sp = getSharedPreferences("infoSP", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("name", userNameSPStr);
editor.putString("pwd", pwdSPStr);
editor.commit();
}
/**
* SP数据回显
*
* @param userNameSP
* @param pwdSP
*/
private void reShowSP(EditText userNameSP, EditText pwdSP) {
SharedPreferences sp = getSharedPreferences("infoSP", Activity.MODE_PRIVATE);
String name = sp.getString("name", "");
String pwd = sp.getString("pwd", "");
userNameSP.setText(name);
pwdSP.setText(pwd);
}
数据保存及数据回显效果:
源码Demo
三、xml的生成与解析
1,xml文件生成
public void save(View view) {
String name = userName.getText().toString().trim();
String ID = userID.getText().toString().trim();
if (name.isEmpty() || ID.isEmpty()) {
Toast.makeText(MainActivity.this, "用户名或者用户ID不能为空!", Toast.LENGTH_SHORT).show();
return;
}
XmlSerializer xmlCreate = Xml.newSerializer();
try {
/**
* 初始化
*/
File file = new File(getFilesDir(), name + ".xml");
FileOutputStream fos = new FileOutputStream(file);
xmlCreate.setOutput(fos, "utf-8");
//设置xml头
xmlCreate.startDocument("utf-8", true);
/**
* 内容主体
*/
xmlCreate.startTag(null, "name");
xmlCreate.text(name);
xmlCreate.endTag(null, "name");
xmlCreate.startTag(null, "nameID");
xmlCreate.text(ID);
xmlCreate.endTag(null, "nameID");
xmlCreate.startTag(null, "sex");
xmlCreate.text(sex);
xmlCreate.endTag(null, "sex");
//设置xml结束
xmlCreate.endDocument();
} catch (Exception e) {
e.printStackTrace();
}
}
2,xml文件解析
/**
* 解析数据 -- 展示数据
*
* @param view
*/
public void read(View view) {
XmlPullParser pullParser = Xml.newPullParser();
String fileName = userName.getText().toString().trim();
if (fileName.isEmpty()) {
Toast.makeText(MainActivity.this, "用户名不能为空!", Toast.LENGTH_SHORT).show();
return;
}
try {
File file = new File(getFilesDir(), fileName + ".xml");
if (file.exists() && file.length() > 0) {
FileInputStream fis = new FileInputStream(file);
StringBuilder sb = new StringBuilder();
pullParser.setInput(fis, "utf-8");
if (pullParser.getEventType() == XmlPullParser.START_DOCUMENT) {//xml开头
pullParser.next();
while (pullParser.getEventType() == XmlPullParser.START_TAG) {
String tagName = pullParser.getName();
String tagText = pullParser.nextText();
sb.append(tagName + "---" + tagText + "\n");
pullParser.next();
}
resultInfo.setText(sb.toString());
}
Toast.makeText(MainActivity.this, "获取信息成功!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "查无此人!", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
效果展示:
源码Demo
尽管人生那么无情,我们本人还是应当把自己尽量改好,少给人一些痛苦,多给人一些快乐。真正的光明不是没有黑暗,而是不被黑暗所吞噬;真正的英雄不是没有卑劣的情操,而是不被卑劣的情操所征服。所以,在你战胜外来的敌人之前,先得战胜你内在的敌人,你不必害怕沉沦堕落,只消你能不断的自拔与更新。~_~