2.测试相关知识_打印日志_文件
2016-10-02 22:26
197 查看
测试相关知识根据测试时是否有源代码:-黑盒测试:-白盒测试 根据测试的粒度:-方法测试:-单元测试:-集成测试:-系统测试: 根据测试的暴力程度:-压力测试:-冒烟测试:
一个比较完整的命令: adb shell monkey -p com.xinmei365.font -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 60000 > E:\java_monkey_log.txt
如何停止呢?先进adbshell,然后ps|grepmonkey,找到monkey的进程号,然后kill
进程号.----为什么junit一点就能运行,没有main方法----
测试用例要继承AndroidTestCase.
其中,setUp,tearDown这两个方法是重写父类的方法,作用如注释所说。另外,注意Android中的测试类的测试方法不需要加@Test注解。
除此之外,还可以建立专门的测试工程.创建一个AndroidTestProject,勾选相应的条目即可.自动生成的清单文件中就有那两项配置.测试工程和被测试工程使用的是同一个Context.
测试用例中,将context设置为成员变量,getContext为空的问题?1.Android测试框架的运行过程:打包.apk,安装到手机,运行测试机2.创建AndroidTestCase对象-初始化成员变量-构造函数3.对象创建完成之后,测试机会把当前应用的Context对象通过setContext()方法设置进来4.执行测试方法在测试类的成员变量,或者构造函数中,不能调用getContext(),因为还没设置进来,会得到null-------AndroidTestRunner是干嘛的-------
在logcat视图中可以选择显示不同级别的日志信息.还可以配置过滤器,根据应用名,TAG名,PID等条件过滤想要的信息.
2.写SD卡是需要权限的,从4.0开始,读SD卡也需要权限了.
其余代码和保存到内存一模一样. ==怎样获取可用存储空间==
写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。如果希望文件被其他应用读和写,可以传入:
openFileOutput("itcast.txt",Context.MODE_WORLD_READABLE+
Context.MODE_WORLD_WRITEABLE);android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文
件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package
name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE
,只有这样其他程序才能正确访问。
关于如何修改data/data下文件的权限,参看: 修改data/data下文件的权限
name>/shared_prefs目录下
使用sp,最后一定注意要commit
.
另外,
sharedpreference也可以链式编程,sp.edit().putXXX().putXXX().apply();
这样的写法很简练
来自为知笔记(Wiz)
monkey工具
用于压力测试. 首先adbshell进入终端中.然后#monkey5000回车.手机屏幕就会被狂点5000次.一个比较完整的命令: adb shell monkey -p com.xinmei365.font -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 60000 > E:\java_monkey_log.txt
如何停止呢?先进adbshell,然后ps|grepmonkey,找到monkey的进程号,然后kill
进程号.----为什么junit一点就能运行,没有main方法----
Android中的单元测试
要在Android项目中运行单元测试,首先要在AndroidManifest.xml文件中加入如下配置:<manifestxmlns:android="http://schemas.android.com/apk/res/android"
<uses-sdkandroid:minSdkVersion="8"/>
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.gaoyuan.junit"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<uses-libraryandroid:name="android.test.runner"/>
<activity
……
</activity>
</application>
</manifest>
测试用例要继承AndroidTestCase.
publicclassTestMyServiceextendsAndroidTestCase{
privateMyServicems;
/**
*测试类TestMyService在第一次被创建的时候,做些初始化工作
*/
@Override
protectedvoidsetUp()throwsException{
ms=newMyService();
}
/**
*测试方法,需要把异常抛给测试框架
*@throwsException
*/
publicvoidtestAdd()throwsException{
//MyServicems=newMyService();
intresult=ms.add(3,3);
assertEquals(3+3,result);
}
publicvoidtestSub()throwsException{
//MyServicems=newMyService();
intresult=ms.sub(3,3);
assertEquals(3-3,result);
}
/**
*测试类TestMyService在被销毁的时候,做清理工作
*/
@Override
protectedvoidtearDown()throwsException{
ms=null;
}
}
其中,setUp,tearDown这两个方法是重写父类的方法,作用如注释所说。另外,注意Android中的测试类的测试方法不需要加@Test注解。
除此之外,还可以建立专门的测试工程.创建一个AndroidTestProject,勾选相应的条目即可.自动生成的清单文件中就有那两项配置.测试工程和被测试工程使用的是同一个Context.
测试用例中,将context设置为成员变量,getContext为空的问题?1.Android测试框架的运行过程:打包.apk,安装到手机,运行测试机2.创建AndroidTestCase对象-初始化成员变量-构造函数3.对象创建完成之后,测试机会把当前应用的Context对象通过setContext()方法设置进来4.执行测试方法在测试类的成员变量,或者构造函数中,不能调用getContext(),因为还没设置进来,会得到null-------AndroidTestRunner是干嘛的-------
logcat的使用
logcat视图用于显示系统打印的日志.在程序中可以使用Log这个类打印日志.publicclassMainActivityextendsActivity{ //TAG一般为当前Activity的名字 privatestaticfinalStringTAG="MainActivity"; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //log有五种级别.TAG表示标签,用于指明是谁打印的信息 Log.v(TAG,"我是提醒等级的log"); Log.d(TAG,"我是调试等级的log"); Log.i(TAG,"我是信息等级的log"); Log.w(TAG,"我是警告等级的log"); Log.e(TAG,"我是错误等级的log"); //在android中也可以使用syso,但是不会打印在控制台上,而是logact中. System.out.println("haha"); //System.out info System.err.println("error");//System.err warn }}在logcat视图中可以选择显示不同级别的日志信息.还可以配置过滤器,根据应用名,TAG名,PID等条件过滤想要的信息.
文件
保存数据到内存储设备中
用户登录案例:当用户勾选记住密码后登陆,将用户名密码保存到手机内存储设备中.界面就不说了.publicclassUserInfoService{
//如果一个方法没有使用到类的成员变量,则一般将其定义为static,这是google推荐的做法.
publicstaticbooleansaveUserInfo(Contextcontext,Stringusername,Stringpassword){
//应用私有的数据一般存放在/data/data/当前应用程序包名/files/这个目录下
//由于不同手机目录结构可能有差异,需使用context.getFilesDir()得到这个目录
Filefile=newFile(context.getFilesDir(),"info.txt");
//如果一个方法有返回值,则异常一般要catch,若没有返回值则一般往上抛.
try{
FileOutputStreamfos=newFileOutputStream(file);
fos.write((username+":"+password).getBytes());
fos.close();
returntrue;
}catch(Exceptione){
e.printStackTrace();
returnfalse;
}
}
publicstaticMap<String,String>getUserInfoMap(Contextcontext){
try{
Filefile=newFile(context.getFilesDir(),"info.txt");
FileReaderfr=newFileReader(file);
BufferedReaderbr=newBufferedReader(fr);
Stringinfo=br.readLine();
br.close();
String[]split=info.split(":");
Map<String,String>map=newHashMap<String,String>();
map.put("username",split[0]);
map.put("password",split[1]);
returnmap;
}catch(Exceptione){
e.printStackTrace();
returnnull;
}
}
}
保存到SD卡中
其实和保存到手机内存几乎一样,只不过有两点需要注意:1.得到路径的方式不同.//判断SD卡是否可用
Stringstate=Environment.getExternalStorageState();
if(!Environment.MEDIA_MOUNTED.equals(state)){
Toast.makeText(this,"SD卡不可用,请检查SD卡",Toast.LENGTH_SHORT).show();
return;
}
//得到SD卡路径的方法
Filefile=newFile(Environment.getExternalStorageDirectory(),"info.txt");
2.写SD卡是需要权限的,从4.0开始,读SD卡也需要权限了.
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
其余代码和保存到内存一模一样. ==怎样获取可用存储空间==
另外几个常用API
-context.openFileOutput(Stringfilename,intmode) 直接得到应用files目录中某个文件的输出流 -context.openFileInput(Stringfilename) 直接得到应用files目录中某个文件的输入流 -context.getCacheDir() 获取/data/data/当前应用包名/cache/目录,用户可手动清除这个文件夹中的内容 当系统内存储不足时,系统也会自动(但不保证)清除这个文件夹中的内容用户和文件的访问权限
Context.MODE_PRIVATE=0Context.MODE_APPEND=32768Context.MODE_WORLD_READABLE=1Context.MODE_WORLD_WRITEABLE= 2 Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。如果希望文件被其他应用读和写,可以传入:
openFileOutput("itcast.txt",Context.MODE_WORLD_READABLE+
Context.MODE_WORLD_WRITEABLE);android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文
件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package
name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE
,只有这样其他程序才能正确访问。
关于如何修改data/data下文件的权限,参看: 修改data/data下文件的权限
ShearedPreference
Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<packagename>/shared_prefs目录下
publicclassMainActivityextendsActivity{
privateCheckBoxcb;
privateSeekBarsb;
privateSharedPreferencessp;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cb=(CheckBox)findViewById(R.id.cb);
sb=(SeekBar)findViewById(R.id.sb);
sb.setMax(100);
//通过context获取SharedPreference
sp=this.getSharedPreferences("config",MODE_PRIVATE);
booleanisChecked=sp.getBoolean("isChecked",false);
cb.setChecked(isChecked);
intprogress=sp.getInt("progress",0);
sb.setProgress(progress);
cb.setOnCheckedChangeListener(newOnCheckedChangeListener(){
@Override
publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
Editoreditor=sp.edit();
editor.putBoolean("isChecked",isChecked);
editor.commit();
}
});
sb.setOnSeekBarChangeListener(newOnSeekBarChangeListener(){
@Override
publicvoidonStopTrackingTouch(SeekBarseekBar){}
@Override
publicvoidonStartTrackingTouch(SeekBarseekBar){}
@Override
publicvoidonProgressChanged(SeekBarseekBar,intprogress,
booleanfromUser){
Editoreditor=sp.edit();
editor.putInt("progress",progress);
editor.commit();
}
});
}
}
使用sp,最后一定注意要commit
.
另外,
sharedpreference也可以链式编程,sp.edit().putXXX().putXXX().apply();
这样的写法很简练
XML
生成XML
----------使用StringBuilder,为什么不用指定编码?----------publicvoidclick(Viewview){
try{
FileOutputStreamfos=this.openFileOutput("smsInfo.xml",MODE_PRIVATE);
XmlSerializerser=Xml.newSerializer();
ser.setOutput(fos,"utf-8");
ser.startDocument("utf-8",true);
//第一个参数是命名空间
ser.startTag(null,"smss");
for(SmsInfosms:smsList){
ser.startTag(null,"sms");
ser.startTag(null,"address");
ser.text(sms.getAddress());
ser.endTag(null,"address");
ser.startTag(null,"body");
ser.text(sms.getBody());
ser.endTag(null,"body");
ser.startTag(null,"date");
ser.text(sms.getDate()+"");
ser.endTag(null,"date");
ser.endTag(null,"sms");
}
ser.endTag(null,"smss");
ser.endDocument();
fos.close();
Toast.makeText(this,"生成xml成功",Toast.LENGTH_SHORT).show();
}catch(Exceptione){
e.printStackTrace();
Toast.makeText(this,"生成xml异常",Toast.LENGTH_SHORT).show();
}
}
}
Pull解析XML
publicstaticList<Channel>getAll(InputStreamis)throwsException{
XmlPullParserparser=Xml.newPullParser();
parser.setInput(is,"utf-8");
List<Channel>list=null;
Channelchannel=null;
inttype=parser.getEventType();
while(type!=XmlPullParser.END_DOCUMENT){
switch(type){
caseXmlPullParser.START_TAG:
if("weather".equals(parser.getName())){
list=newArrayList<Channel>();
}elseif("channel".equals(parser.getName())){
channel=newChannel();
channel.setId(Integer.parseInt(parser.getAttributeValue(0)));
}elseif("city".equals(parser.getName())){
channel.setCity(parser.nextText());
}elseif("temp".equals(parser.getName())){
channel.setTemp(parser.nextText());
}elseif("wind".equals(parser.getName())){
channel.setWind(parser.nextText());
}elseif("pm250".equals(parser.getName())){
channel.setPm250(Integer.parseInt(parser.nextText()));
}
break;
caseXmlPullParser.END_TAG:
if("channel".equals(parser.getName())){
list.add(channel);
channel=null;
}
break;
default:
break;
}
type=parser.next();
}
returnlist;
}
相关文章推荐
- 将调试相关日志打印到文件中
- log4net的文件日志打印时间测试
- python 接口测试1 --如何创建和打印日志文件
- [调试相关]预编译文件中宏定义打印日志
- [调试相关]预编译文件中宏定义打印日志
- 文件服务器的一些相关知识
- oracle日志文件相关问题汇总
- 网络打印两个基本端口(LPD和9100)的相关知识
- SQL Server 2005 如何在没有日志文件的情况下如何恢复MDF数据库文件(测试通过)
- 如何在 SQL Server 2005 中使用 DBCC SHRINKFILE 语句收缩事务日志文件-数据库知识
- linux网络监控工具---系统自带的工具的使用示例(可以监控经过本局域网的任何数据,并可以打印到屏幕或者日志文件)
- 错误 5173:不能使文件与不同的数据库相关,测试过,能行。
- 系统安全防护知识:如何配置Linux的日志文件
- Oracle日志文件相关查询
- 用log4j在日志文件里打印异常
- 文件相关知识整理
- SQL Server 2005 如何在没有日志文件的情况下如何恢复MDF数据库文件(测试通过)
- 使用logrotate 管理日志文件 (Linux相关)
- Makefile 文件的相关知识(1)
- 自动打开文件相关知识