qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

如何去设计测试用例

 个人理解大概从3个方面去考虑:
  1. 表单,也就是最基础的功能;
  2. 逻辑方面;
  3. 业务流程。
  今天去面试,面试官问我一个很让我说不清的问题,她问我如何写好Expected Result,说实话当时听到这个问题我有点茫然,我拼命的考虑如何去诠释这个问题,事实上,这么多年工作,这么多年的测试用例中,我并未关注这个问题,一个好的Expected Result,个人认为就是和将要实现的功能或者是需求要完全匹配。今天由于个人原因精力也不是很集中,似乎头脑处于空白时段,听到耳朵的问题,似乎大脑不懂得去思考。对于今天的面试我并不满意,但是今天面试官问我的一些问题,其实都很基础也很简单,但是细想起来似乎又不是很容易回答,嗨,总之是个失败的面试!
  对于一个好的测试用例,无非就是三点:
  1.易用性:对于一个即熟悉测试工作,又熟悉被测应用的测试人员,应当可以花费很少的时间就可以理解测试用例中表达的测试思路,并可以很快的执行完这个测试用例。对于不熟悉测试工作,不熟悉被测应用的人来说,也完全可以参照着该测试用例执行下去。
  2.易维护性:当开发过程中的某些因素影响了测试需求,测试用例的作者或其他测试设计人员,应该可以花费很少的时间就完成定位并维护所有相关测试用例的工作。
  3.可重用性:一个好的测试用例要保证可以随着版本的变化它始终保持可用状态,不能因为版本的变更,导致测试用例无效或者冗余。

posted @ 2014-07-29 09:07 顺其自然EVO 阅读(178) | 评论 (0)编辑 收藏

配置管理起步

  1. 配置管理
  由于公司需求,以后需要兼职配置管理工作,虽然是兼职,也应该要专业一点,最近一段时间在网上搜集了各种资料,同时今天拿到了一本书,叫做《配置管理最佳实践》。
  书不是很厚,在豆瓣上的评论不错,据说是配置管理入门必读,差不多和《软件测试的艺术》一样重要吧,希望读过之后对于配置管理的工作能有一个更加系统的认识, 对于配置管理、变更管理、版本管理、构建管理、发布管理等方面的理解可以更深刻一些。
  PS:新知识学习渠道
  ——找老师:花半天时间在网上胡搜,试图找到在这方面最权威最经典最完整的资料或教程
  ——实践:了解基本技能,并实践,出现问题后先解决基本问题,不要顾其他的。
  ——深入: 在知乎或豆瓣找评论、找观点、找书。
  ——总结:总结,依照当前公司现状,为当前工作制定最佳的配置管理流程。

posted @ 2014-07-28 10:12 顺其自然EVO 阅读(145) | 评论 (0)编辑 收藏

缺陷上报统一模板及缺陷管理流程

  1、前置条件 :要根据对测试理论及项目业务的理解呢,对缺陷的严重性和优先级有个清晰思路并进行正确的划分。
  2、统一缺陷报告的模板:
  1)编号   2)所属模块 3)摘要/标题(用一句话描述BUG)
  4)测试环境 、操作步骤 、实际结果 、期望结果 、备注
  5)bug优先级、严重性 6)测试人  7)日期  8)bug状态
  9)截图
  3、缺陷的管理流程或bug的生命周期(假如:发现bug,但不知道相关的开发负责人)
  提交bug-----经理/组长审核(检查描述、优先级与严重性是否符合)---
  --转交给相关的开发人员----修复bug并反馈回执给相关测试人员--
  --回归测试验证是否修复----根据验证结果更改bug状态

posted @ 2014-07-28 10:11 顺其自然EVO 阅读(393) | 评论 (0)编辑 收藏

用存储过程&DataFactory准备测试数据

 假设我们有以下2张表: student , detail_info 。(MySQL版本)
  其他detail_info的外键是name (也就是说detail_tail 中name的值要在student中有)
  < xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
  现在准备需要往这两张表中插入数据供测试时使用,
  方法一,手动插入
  必须选插入一条记录到student中,然后再插入一条到detail_info,且name要在student中有。
  方法二,利用MySQL的存储过程
  2.1 创建存储过程 (一次插入一条数据)
  代码块
  create procedure pr_add
  (
  v_id int,           -- 打算插入的id
  v_name varchar(20)  –打算插入的name
  )
  begin
  INSERT INTO `student` VALUES (v_id, v_name, 'male', '20', '2011-08-16 22:05:45' );
  INSERT INTO `detail_info` VALUES (v_id, v_name, '2011-08-16', '13881954050', 'xinjiang');
  end;
  2.2 调用存储过程
  查询相应的表检查
  1.3    深入一个,创建一个一次能插入多条数据的存储过程
  代码块
  create procedure proc_add
  (
  number int     -- 打算新插入多少条数据
  )
  begin
  declare v_name varchar(20);
  declare v_i int;
  set v_i=0;
  select max(id) into v_i from student;   -- 获得当前表中最大id,并存储进变量v_i
  set number=v_i+number;                  -- 最大id
  set v_i=v_i+1;                          -- 插入的id从当前id+1开始
  while v_i<=number do                    -- 插入的id值从id+1 ~ number
  set v_name=concat('bill' , v_i );   -- 拼接name,因为name不能相同
  INSERT INTO `student` VALUES (v_i, v_name, 'male', '20', '2011-07-16' );
  INSERT INTO `detail_info` VALUES (v_i, v_name, '2011-08-16 22:05:45', '13881954050', 'xinjiang');
  set v_i=v_i + 1;
  end while;
  end;
  调用
方法三,利用工具DataFactory
  ……
  数据验证
  小结:
  利用存储过程添加数据较方便,但需要自己编写sql语句块。有关mysql的存储过程只在mysql5以后才能使用,详细的介绍请参考网络。
  DataFactory 在创建大数据量是更有优势,但设置起来比较麻烦,需要对每个字段进行设置。有关DataFactory的详细操作,如有兴趣,可另外讨论。这里只是介绍一下。

posted @ 2014-07-28 10:10 顺其自然EVO 阅读(204) | 评论 (0)编辑 收藏

Ubuntu下搭建Robotframework+Selenium环境

最近已经从Windows系统转到了Ubuntukylin下面,所以测试工具也需要重新安装,今天就和大家分享下安装过程。
  我使用的环境:Ubuntu Kylin 14.04 64位系统。
  开始了吧,首先还是要安装Python,这里我用的是Python2.7,这个可以去官网下载,安装过程这里就不再赘述了。
  我采用的是在线安装:
  1、安装pip,
  sudo apt-get install python-pip
  2、安装robotframework,
  sudo pip install robotframework
  3、安装selenium2library,
  sudo pip install robotframework-selenium2library
  4、安装Wxpython ,
  sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-i18n
  5、安装ride,
  sudo pip install robotframework-ride
  6、打开ride
  在终端里面输入
  ride.py
  7、关于RFS的使用,请参考http://blog.csdn.net/xc5683/article/details/10017915

posted @ 2014-07-28 10:08 顺其自然EVO 阅读(752) | 评论 (0)编辑 收藏

Spirent TestCenter Application升级到2.4的问题处理

  Spirent TestCenter Application 升级到4.24之后,原来的ROBOT ATC 跑不过了。现象是两个,
  1)提示TCL 版本不兼容;
  2)第2个端口上收不到包。
  索性趁这个机会重构了对外接口。
  1)RunSequencerDoCheckList :使用两个预定的端口,分别作为user-side/uplink-side。完成测试步骤并检查结果。
  ------ 单路功能性测试
  2)MultiPortRunsequencercheckList:使用更多预定端口,完成测试步骤并检查结果。
  ------ 多路功能性测试
  3)CheckPKGdefinedTraffic:在多个预定端口中选一个作为user-side,按参数进行流量。
  ------ QOS功能性测试,可以覆盖CCL/remark/policing/BAC/...
  下一个项目,就用这套脚本来做回归了!

posted @ 2014-07-28 10:04 顺其自然EVO 阅读(459) | 评论 (0)编辑 收藏

Android开发和测试实践—接入友盟统计

 这两年一直在做无线的测试,后续还会继续去做无线的测试,但是之前因为时间的原因一直都没有非常仔细的了解到代码层面。近期抽空自己做了些app的开发,决定如果想把移动的测试做好做深入,有一定的app开发经验非常的有必要,因为只有这样很多东西才能真正理解了。另一个方面,这本身也很有趣。目前尝试的一些东西都还比较基础,准备持续的做下去。
  实践的过程也想陆续整理出来,做下笔记,也给别人一些参考,遇到很多问题的时候也是到谷歌度娘的找答案,帮助很多。目前更多关注android,ios的部分稍继续。
  基本上现在任何一个实用的app都离不开埋点统计,否则应用撒出去就两眼一抹黑了,也难以做运营和一些决策。为了进一步了解这一块,除了看现有产品的做法(公司内部平台),也想自己动手写一下,加深理解,于是选择了业界用得比较多的友盟平台。
  统计的维度很多,不过最基本的新增用户和启动次数。关于这个,可能就需要涉及到Android的activity的生命周期和状态改变。为了更好的理解,做了个简单的代码尝试。
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG,"enter onCreate”);
}
protectedvoid onStart() {
super.onStart();
Log.e(TAG,"onStart");
}
@Override
protectedvoid onResume() {
super.onResume();
Log.e(TAG,"onResume");
}
@Override
protectedvoid onPause() {
super.onPause();
Log.e(TAG,"onPause");
}
  然后做了一些实验:
  后面看友盟的sample code后发现也是基于这个来统计活跃用户的。好了,下面记录下接入友盟统计的过程。
  首先,需要在AndroidManifest.xml中添加权限和一些配置,主要是appkey,这个在友盟网站注册好账号之后添加应用就可以获取到,Channel ID是自己来定义。
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name=“android.permission.ACCESS_NETWORK_STATE" />
<uses-permissionandroid:name=“android.permission.READ_PHONE_STATE" />
……
<meta-dataandroid:value=“535f487******"android:name="UMENG_APPKEY"></meta-data>
<meta-dataandroid:value="Test001"android:name="UMENG_CHANNEL”/>
</application>
  然后在activity里面添加对应的代码,MobclickAgent class。
import com.umeng.analytics.MobclickAgent;
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MobclickAgent.updateOnlineConfig(this);
}
protectedvoid onResume() {
super.onResume();
Log.e(TAG,"onResume");
MobclickAgent.onResume(mContext);
}
protectedvoid onPause() {
super.onPause();
Log.e(TAG,"onPause");
MobclickAgent.onPause(mContext);
}
  但是在Eclipse里面做完这一步之后发现还是遇到错误,一执行到MobclickAgent的语句就异常了,如下面。官方文档只是提到上面的步骤。
  解决方案是把umeng的jar包放到工程的libs目录下。
  接下来,App跑起来,几分钟之后就可以看到数据了。
  启动次数这里因为是通过onResume()统计的, 所以有一些细节需要注意,看是否需要调整。
  可以看到渠道的结果,就是之前在AndroidManifest.xml里面配置的。
  设备的一些信息目前不能查看当天的结果,要第二天来看,还是比较准确的。
  需要把umeng的jar包加到工程里面。 另外也试验了下自定义的Event。我的demo app里面有两段访问HTTP接口的地方,分别通过Apache HttpClient和Android HttpClient,想统计下调用次数以及响应时间。
  在调用前后埋上对应的代码。
  MobclickAgent.onEventBegin(this,"Android_http_visit”);
  MobclickAgent.onEventEnd(this,"Android_http_visit");
  总体来说,基本统计功能还不错,开发也很方便,比之前想象的要方便很多。但是结合我们实际产品用的自研BI工具的数据分析,以及和朋友了解到大规模实际使用的情况,一些偏应用层面的功能还不是特别够用。比如详细的用户访问路径方面。
  下面能给出一些基本的模型。但是如果是产品和运营要做非常细致的分析还需要自己做一些工作。
  漏斗模型等因为demo app太简单还没来得及继续深入了解。这样了解下来发现再去读实际产品的运营数据,会感觉更容易理解一点。

posted @ 2014-07-28 09:58 顺其自然EVO 阅读(295) | 评论 (0)编辑 收藏

Android下Protobuff框架性能测试结果

  android 下Protobuff常用的框架有三个: protobuff自身,  square出的wire , protostuff
  由于protobuff会为每个属性生成大量不常用的方法,当程序比较复杂时容易超过android的60K个方法的上限, 所以本次测试未包括protobuff
  测试逻辑是循环100次序列化100个元素的数组,并反序列化,求平均值,代码如下:
  wire的测试代码:
public void onClickButton(View view){
if (TestTask.isCancel){
TestTask.isCancel = false;
TestTask.sumDeserializeTime = 0;
TestTask.sumTime = 0;
TestTask.runCount = 0;
TextView text1 = (TextView) findViewById(R.id.textView2);
text1.setText("");
new TestTask( (TextView) findViewById(R.id.textView2)
, (TextView) findViewById(R.id.button1)).execute();
((TextView)view).setText("测试中,点击中断");
}else{
((TextView)view).setText("正在中断...");
TestTask.isCancel = true;
}
}
static class TestTask extends AsyncTask<Void,Void,Long>{
long serializeTime=0;
long deserializeTime=0;
static long sumTime=0;
static long sumDeserializeTime=0;
static int runCount=0;
static boolean isCancel=true;
TextView text1;
TextView btn;
public TestTask(TextView text1,TextView btn) {
this.text1 = text1;
this.btn = btn;
}
@Override
protected Long doInBackground(Void... params) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
List<ListItem> itemList = new ArrayList<ListItem>();
ListItem.Builder itemBuilder = new ListItem.Builder();
ListItem item;
for (int j = 0; j < 100; j++) {
item = itemBuilder.title("test Title"+i+":"+j)
.remark("test Remark"+i+":"+j)
.coverUrl("http://pic.ozreader.com/abc.pic")
.uri("PKB:TESTURI")
.build();
itemList.add(item);
}
ScrollList.Builder listBuilder= new ScrollList.Builder();
ScrollList list = listBuilder.haveMore(false).tags(itemList).build();
byte[] dataBuffer = list.toByteArray();
serializeTime = System.currentTimeMillis()-startTime;
Wire wire = new Wire();
try {
ScrollList resultList = wire.parseFrom(dataBuffer, ScrollList.class);
if (resultList == null){
Log.e("TEST", "resultList is null");
break;
}else if (resultList.tags == null){
Log.e("TEST", "resultList.tags is null");
break;
}else if (resultList.tags.size() <= 0){
Log.e("TEST", "resultList.tags is empty");
break;
}else if (resultList.tags.size() != 100){
Log.e("TEST", "resultList.tags is wrong");
break;
}else if (!resultList.tags.get(0).uri.equals("PKB:TESTURI")){
Log.e("TEST", "resultList.tags content is wrong");
break;
}
deserializeTime = System.currentTimeMillis()-startTime-serializeTime;
} catch (IOException e) {
e.printStackTrace();
}
}
return System.currentTimeMillis() - startTime;
}
@Override
protected void onPostExecute(Long result) {
sumTime += result;
sumDeserializeTime += deserializeTime;
runCount ++;
text1.append("result:"+result+", serializeTime:"+serializeTime+", deserializeTime:"+deserializeTime+", runCount:"+runCount+", avg:"+sumTime/runCount+", avg deserializeTime:"+sumDeserializeTime/runCount+"\n");
if (isCancel){
text1.append("测试中断.");
btn.setText("开始测试");
}else if (runCount < 100){
new TestTask(text1,btn).execute();
}else{
isCancel = true;
text1.append("测试完成.");
btn.setText("开始测试");
}
}
}
protobuff的测试代码:
public void onClickButton(View view){
if (TestTask.isCancel){
TestTask.isCancel = false;
TestTask.sumDeserializeTime = 0;
TestTask.sumTime = 0;
TestTask.runCount = 0;
TextView text1 = (TextView) findViewById(R.id.textView2);
text1.setText("");
new TestTask( (TextView) findViewById(R.id.textView2)
, (TextView) findViewById(R.id.button1)).execute();
((TextView)view).setText("测试中,点击中断");
}else{
((TextView)view).setText("正在中断...");
TestTask.isCancel = true;
}
}
static class TestTask extends AsyncTask<Void,Void,Long>{
long serializeTime=0;
long deserializeTime=0;
static long sumTime=0;
static long sumDeserializeTime=0;
static int runCount=0;
static boolean isCancel=true;
TextView text1;
TextView btn;
public TestTask(TextView text1,TextView btn) {
this.text1 = text1;
this.btn = btn;
}
@Override
protected Long doInBackground(Void... params) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
List<ListItem> itemList = new ArrayList<ListItem>();
ScrollList list = new ScrollList();
list.setHaveMore(false);
list.setTagsList(itemList);
ListItem item;
for (int j = 0; j < 100; j++) {
item = new ListItem();
item.setTitle("test Title"+i+":"+j);
item.setRemark("test Remark"+i+":"+j);
item.setCoverUrl("http://pic.ozreader.com/abc.pic");
item.setUri("PKB:TESTURI");
itemList.add(item);
}
LinkedBuffer buffer = LinkedBuffer.allocate(1024);
byte[] dataBuffer = ProtobufIOUtil.toByteArray(list, ScrollList.getSchema(), buffer);
serializeTime = System.currentTimeMillis()-startTime;
ScrollList resultList = new ScrollList();
ProtobufIOUtil.mergeFrom(dataBuffer, resultList, ScrollList.getSchema());
if (resultList.getTagsList() == null){
Log.e("TEST", "resultList.tags is null");
break;
}else if (resultList.getTagsList().size() <= 0){
Log.e("TEST", "resultList.tags is empty");
break;
}else if (resultList.getTagsList().size() != 100){
Log.e("TEST", "resultList.tags is wrong");
break;
}else if (!resultList.getTagsList().get(0).getUri().equals("PKB:TESTURI")){
Log.e("TEST", "resultList.tags content is wrong");
break;
}
deserializeTime = System.currentTimeMillis()-startTime-serializeTime;
}
return System.currentTimeMillis() - startTime;
}
@Override
protected void onPostExecute(Long result) {
sumTime += result;
sumDeserializeTime += deserializeTime;
runCount ++;
text1.append("result:"+result+", serializeTime:"+serializeTime+", deserializeTime:"+deserializeTime+", runCount:"+runCount+", avg:"+sumTime/runCount+", avg deserializeTime:"+sumDeserializeTime/runCount+"\n");
if (isCancel){
text1.append("测试中断.");
btn.setText("开始测试");
}else if (runCount < 100){
new TestTask(text1,btn).execute();
}else{
isCancel = true;
text1.append("测试完成.");
btn.setText("开始测试");
}
}
}
  测试结果为(单位豪秒):
  手机环境:魅族MX2
  1) wire 1.5.1 ,网址 https://github.com/square/wire
  avg: 1860~1907 , 最小值约为1500左右,极少出现, 全过程随机分布
  avg deserializeTime: 9~10, 最小值约为5,极少出现,全过程随机分布
  2) protostuff 1.0.8 ,网址 https://code.google.com/p/protostuff/
  avg: 1100~1150,非常稳定 , 最小值约为450左右,主要集中在前几次循环,循环10次后就稳定在11XX左右,偶有600~800的情况,多次重复测试情况基本一致,观察自动GC并无内存泄漏的问题, 暂时不确定速度变化的原因.
  avg deserializeTime: 6, 最小值约为3,极少出现,主要集中在刚开始,绝大多数为5,偶有达到16的情况.
  分析: wire的性能明显比不上protostuff, 速度也不太稳定,起落较大.  考虑到protostuff的开发模式是普通的pojo方式,比较方便,不像protobuff和wire的builder方式,超麻烦. 所以最终推荐不是逻辑超复杂的企业app都使用protostuff .

posted @ 2014-07-28 09:34 顺其自然EVO 阅读(1875) | 评论 (0)编辑 收藏

使用jenkins+Emma统计Android客户端单元测试覆盖率

  这两天看了一下统计Android单元测试代码覆盖率的知识,看了一下比较简单。
  代码覆盖率的作用主要是用来查看测试用例执行完毕后,有哪些代码尚未覆盖到,未覆盖到的代码通常意味着未覆盖到的功能或场景,选用的开源软件Emma。
  第一步:把被测工程生成Ant build文件,andriod-app就是工程名
  android update project -p android-app
  第二步:将andriod测试工程也转换成ant工程,-m选项指定了测试工程对应的主andriod工程的位置,而android-test就是测试工程名:
  android update test-project -m ../android-app -p android-test
  第三步:执行下面的命令,编译、执行单元测试、收集覆盖率:
  ant clean emma debug install test
  在jenkins 上部署:
  1. 下载Emma Line Coverage Column插件并安装。
  2. 在jenkins 上配置上边三步命令。如图:
  3. 构建完成后,配置使用插件展示出报告,如图:
  4. 展示结果如图:
  备注:
  1. 被测试工程的要是调试版本,即Android manifest里面android:debuggable="true"
  2. 手机要有root权限。

posted @ 2014-07-28 09:34 顺其自然EVO 阅读(712) | 评论 (0)编辑 收藏

CTS添加新测试用例步骤

  一、CTS添加新测试用例
  前言:
  google源代码中的cts测试用例集目录为:source_android4.2/cts/tests/tests/ (source_android4.2表示android4.2代码存放路径),该目录下有一个测试用例集example文件夹;下面就以这个用例集为例,讲述怎样编写自己的cts测试用例集;
  结构如下:
  example
  ├── AndroidManifest.xml
  ├── Android.mk
  └── src
  └── android
  └── example
  ├── cts
  步骤:
  1、    在cts/tests/tests/目录下创建一个自己的用例集(文件夹)名称XXX;
  2、    在该文件夹中构建如下结构:
  XXX
  ├── AndroidManifest.xml(可以拷贝example下该文件)
  ├── Android.mk(可以拷贝example下该文件)
  └── src
  └── android
  └──XXX
  └── cts
  3、    编写测试代码
  前提:
  判断测试的接口或类是属于修改了原生代码中的哪个包下面的类(可以参考google文档:http://developer.android.com/intl/zh-CN/reference/packages.html);
  然后在source_android4.2/cts/tests/tests/目录下找到对应的测试包,参考其代码的编写;
  具体操作:
  在src/android/XXX/cts目录下添加自己的用例;(XXX为自己的测试用例集的名称,例如:yunos)
  细节说明:
  1、google官方cts测试用例中,对一个类进行测试时,并没有对该类的所有方法进行测试,而是测试了该类中使用最频繁的一些方法;所以我们自己编程测试用例时,也可以按照这样的原则进行操作;
  2、对于“窗口控件类”中使用的的res资源文件的目录在source_android4\cts\tests\res
  3、最好是在eclipse中编写,需要res文件的,可以先拷贝到当前工程下,这样可以通过eclipse检查编程中的语法错误;
  4、包名的格式:package android.XXX.cts;
  4、    修改XXX/目录下的Android.mk文件
  LOCAL_PACKAGE_NAME := CtsXXXTestCases(这个变量是定义自己的测试用例集的名称;编译后会生成同名的APK文件)
  LOCAL_INSTRUMENTATION_FOR := CtsTestStubs(这个变量定位的是一些涉及到虚拟机的测试用例,使用junit框架;TestStubs这个类在目录cts\tools\vm-tests-tf\src\dot\junit\opcodes下)
5、修改XXX/目录下的AndroidManifest.xml文件
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.android.cts.XXX">
  <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
  <application>
  <uses-library android:name="android.test.runner" />
  <activity android:name=”android.XXX.cts.activity的名称”/>(说明:这个是测试activity时容易忽略的地方)
  </application>
  <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
  android:targetPackage="com.android.cts.stub"
  android:label="CTS tests of android.XXX"/>
  </manifest>
  6、修改source_android4.2/cts目录下的CtsTestCaseList.mk;(重要)
  在该文件中给变量cts_test_packages追加自己测试用例集名称CtsXXXTestCases
  说明:该文件在编译的时候会被build/core/tasks/cts.mk调用,生成最终的CTS包。
  对CtsTestCaseList.mk文件说明:
  CTS_COVERAGE_TEST_CASE_LIST(核心变量)
  ├── cts_support_packages(该变量包含的是测试依赖的一些用例,其对于代码目录为cts/hostsidetests)
  ├──CtsAccelerationTestStubs \
  ├──CtsDelegatingAccessibilityService \
  ├──CtsDeviceAdmin \
  ├──CtsMonkeyApp \
  ├──CtsMonkeyApp2 \
  ├──CtsSomeAccessibilityServices \
  ├──CtsTestStubs \
  ├──SignatureTest \
  ├──TestDeviceSetup \
  ├──$(cts_security_apps_list)
  ├── cts_test_packages(该变量对应的是cts/tests/tests/目录下的测试用例)
  二、编译自己的cts包
  执行make  cts  -j4
  三、在真机上进行测试
  由于完整进行cts测试要很长时间,所以我们可以自己创建一个测试计划,步骤如下:
  1、将cts包解压,在android-cts\repository\plans下创建一个名为XXX的xml文件;
  2、这个xml文件格式为:
  <?xml version="1.0" encoding="UTF-8"?>
  <TestPlan version="1.0">
  <Entry uri="android.XXX"/>
  </TestPlan>
  3、进行cts测试时执行run  cts  -- plan  XXX

posted @ 2014-07-28 09:32 顺其自然EVO 阅读(2608) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 77 78 79 80 81 82 83 84 85 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜