Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244806
  • 博文数量: 18
  • 博客积分: 445
  • 博客等级: 下士
  • 技术积分: 270
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-28 13:59
文章分类

全部博文(18)

文章存档

2013年(2)

2012年(16)

分类: 嵌入式

2012-05-14 17:22:40


1.背景
 
接上一篇,组长交待的CTS测试Bug解除任务,在我本机编译出的CTS APK放到目标板(版本Android 版本4.0.4)上运行后居然是通过了,于是急忙找组长,组长让我下一个Google发布的CTS包(版本4.0.3)来测,还好不大,很快下载下来后adb push至目标板,打印结果是fail。
2.分析
 

2.1进一步测试
  
测试组的同事说测试要就有涵盖性和重复性,才能暴露出问题,像我之前那样一两次测试是不够的,于是发了一个测试脚本给我,循环测试N次,我修改一下这个脚本内容如下:

点击(此处)折叠或打开

  1. echo CTS Test Start
  2. echo Begin Test
  3. set var=1000
  4. :continue
  5. echo Circle=%var%
  6. adb shell am instrument -e class android.text.cts.TextUtilsTest -w com.android.cts.text/android.test.InstrumentationCtsTestRunner >> d:\ctstest.txt
  7. set /a var-=1
  8. if %var% gtr 0 goto continue
  9. echo CTS Test Finish
  10. pause
   中午吃饭前运行了一次,吃饭回来后看输出,还是一样的结果,摘取一次输出内容如下:

点击(此处)折叠或打开

  1. android.text.cts.TextUtilsTest:...............

  2. Failure in testHtmlEncode:

  3. junit.framework.ComparisonFailure: expected:<...apos;string&apos...> but was:<...#39;string'...>

  4. at android.text.cts.TextUtilsTest.testHtmlEncode(TextUtilsTest.java:1200)

  5. at java.lang.reflect.Method.invokeNative(Native Method)

  6. at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)

  7. at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)

  8. at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:545)

  9. at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)

  10. .......................

  11. Test results for InstrumentationCtsTestRunner=................F.......................

  12. Time: 3.934



  13. FAILURES!!!

  14. Tests run: 39, Failures: 1, Errors: 0
   输出结果的第五行倒是暴露了很多信息,联系到之前grep的结果,决定到源码看看:

2.2源码分析
2.2.1测试函数的源码
这段代码位置在位于:
android/cts/tests/tests/text/src/android/text/cts/TextUtilsTest.java

点击(此处)折叠或打开

  1. public void testHtmlEncode() {
  2.         assertEquals("<_html_>\\ &"'string'"",
  3.                 TextUtils.htmlEncode("<_html_>\\ &\"'string'\""));

  4.          try {
  5.              TextUtils.htmlEncode(null);
  6.              fail("Should throw NullPointerException!");
  7.          } catch (NullPointerException e) {
  8.              // expected
  9.          }
  10.     }
   从代码中来看,这段代码先是检查一段符号的编码正不正确,然后再检查一下对输入null的处理而从测试结果上来看第一段执行就出错了,于是决定到具体的代码看看。
   也许是天助我也,我首先想到的不是到本地Android源码文件夹下查找源码,而是先在网络上在线浏览代码。如果我一开始就是看4.0.4的代码估计又要花一大段时间了,我看的代码是2.2版的

2.2.2Android2.2中的htmlEncode代码
   代码位置位于:
   android\frameworks\base\core\java\android\text\TextUtils.java


  1. 1378     /***
  2. 1379     * Html-encode the string.
  3. 1380     * @param s the string to be encoded
  4. 1381     * @return the encoded string
  5. 1382     */
  6. 1383     public static String htmlEncode(String s) {
  7. 1384     StringBuilder sb = new StringBuilder();
  8. 1385     char c;
  9. 1386     for (int i = 0; i < s.length(); i++) {
  10. 1387     c = s.charAt(i);
  11. 1388     switch (c) {
  12. 1389     case '<':
  13. 1390     sb.append("<"); //$NON-NLS-1$
  14. 1391     break;
  15. 1392     case '>':
  16. 1393     sb.append(">"); //$NON-NLS-1$
  17. 1394     break;
  18. 1395     case '&':
  19. 1396     sb.append("&"); //$NON-NLS-1$
  20. 1397     break;
  21. 1398     case '\'':
  22. 1399     sb.append("'"); //$NON-NLS-1$
  23. 1400     break;
  24. 1401     case '"':
  25. 1402     sb.append("""); //$NON-NLS-1$
  26. 1403     break;
  27. 1404     default:
  28. 1405     sb.append(c);
  29. 1406     }
  30. 1407     }
  31. 1408     return sb.toString();
  32. 1409     }
  33. 1410
  接着再看Android4.0.4的代码,果然发生了改变

点击(此处)折叠或打开

  1. /**
  2.      * Html-encode the string.
  3.      * @param s the string to be encoded
  4.      * @return the encoded string
  5.      */
  6.     public static String htmlEncode(String s) {
  7.         StringBuilder sb = new StringBuilder();
  8.         char c;
  9.         for (int i = 0; i < s.length(); i++) {
  10.             c = s.charAt(i);
  11.             switch (c) {
  12.             case '<':
  13.                 sb.append("<"); //$NON-NLS-1$
  14.                 break;
  15.             case '>':
  16.                 sb.append(">"); //$NON-NLS-1$
  17.                 break;
  18.             case '&':
  19.                 sb.append("&"); //$NON-NLS-1$
  20.                 break;
  21.             case '\'':
  22.                 //
  23.                 // The named character reference ' (the apostrophe, U+0027) was introduced in
  24.                 // XML 1.0 but does not appear in HTML. Authors should therefore use ' instead
  25.                 // of ' to work as expected in HTML 4 user agents.
  26.                 sb.append("'"); //$NON-NLS-1$
  27.                 break;
  28.             case '"':
  29.                 sb.append("""); //$NON-NLS-1$
  30.                 break;
  31.             default:
  32.                 sb.append(c);
  33.             }
  34.         }
  35.         return sb.toString();
  36.     }
   原来其中的'\'字符,在4.0.4之前的版本是被编码成"&apos"的,而在4.0.4中却是被编码成"'",注释解释说&apos是在xml 1.0中使用的,而html4没有说明,所以应当用'
这就不难奇怪相同版本的CTS包测试通过,用低版本的测试包测试不通过了,因为测试规则都变了。。。。。。
   为了证实自己的结论,将4.0.4的代码修改后adb push至目标板,再安装google的测试包,运行果然测试通过了。

3.总结
 
这个CTS的问题总算是告一段落了,之前在WinCE下页接触过CETK的自动化测试,但发现Android的测试要更方便一些,这大概是因为Android有一个强大的adb工具,而MS更依赖于图形界面吧,测试部门的同事的指导也很好,测试要涵盖各种情况,光一两次的测试是远远不够的,这方面确实有很多要学习


 





 
 
阅读(4189) | 评论(0) | 转发(0) |
0

上一篇:初识Android CTS

下一篇:Android.linux电源管理

给主人留下些什么吧!~~