-移动App测试实战:顶级互联网企业软件测试和质量提升最佳实践
        -序言
        -前言
        -第1章 产品功能测试概述
            -1.1 互联网产品常见的研发流程
            -1.2 测试用例设计和评审
            -1.3 测试进度管理
                -1.3.1 测试进度报告
                -1.3.2 测试完成报告
                -1.3.3 系统化的方法
            -1.4 本章小结
        -第2章 功能测试自动化
            -2.1 轻量接口自动化测试
                -2.1.1 JMeter关于自动化方面的特性介绍
                -2.1.2 基于JMeter的轻量接口自动化实践
            -2.2 App UI层面的自动化
                -2.2.1 Android的UI自动化技术
    -SettingsActivity mMyActivity;
    -protected void setUp() throws Exception {
    -    super.setUp();
    -     mMyActivity = getActivity();
    -}
    -protected void tearDown() throws Exception {  super.tearDown();}
    -public MyTest() {
    -    super(SettingsActivity.class);
    -}
    -public void testCase1()
    -{
    -  ActionBar mMyBar=  mMyActivity.getActionBar();
    -  String title= mMyBar.getTitle().toString();
    -  assertEquals(title,"My Application");
    -}
    -   compile fileTree(include: ['*.jar'], dir: 'libs')
    -   compile 'com.android.support:support-v4:21.0.3'
    -   String packageName="com.example.test.myapplication";
    -   String activityName="SettingsActivity";
    -   protected void setUp() throws Exception {
    -      getUiDevice().pressHome();
    -      Runtime.getRuntime().exec("am start -a android.intent.action.MAIN -n "+packageName+"/."+activityName);
    -      UiObject mainUi=new UiObject(new UiSelector().packageName(packageName));
    -      assertTrue("App not started",mainUi.waitForExists(3000));
    -      super.setUp();
    -}
    -   public void testCase1()
    -   {
    -      UiObject uiToTest=new UiObject(new UiSelector().className("android.widget.CheckBox").instance(1));
    -      try
    -      {
    -         uiToTest.click();
    -         getUiDevice().waitForIdle(3000);
    -         UiObject uiToAssert=new UiObject(new UiSelector().text("Ringtone").instance(0));
    -         assertFalse("CheckBox not work",uiToAssert.isEnabled());
    -      }
    -      catch(UiObjectNotFoundException ex)
    -      {
    -           assertTrue("Cannot find checkbox",false);
    -      }
    -  }
    - Input keyevent 34
                -2.2.2 iOS的UI自动化技术
    -   路径>
            -2.3 本章小结
        -第3章 性能测试
            -3.1 Web前端性能测试
                -3.1.1 HTTP性能相关的技术要点
                -3.1.2 Web前端性能测试方法
            -3.2 App端性能测试
                -3.2.1 Android内存问题分析
    -  <上一步保存的文件路径和文件名>.rgba 1.png
                -3.2.2 iOS内存问题分析
                -3.2.3 App内嵌Web组件的性能分析
    - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    -           webView.setWebContentsDebuggingEnabled(true);
    -       }
    -   protected void onCreate(Bundle savedInstanceState) {
    -       super.onCreate(savedInstanceState);
    -       setContentView(R.layout.activity_main);
    -       WebView webView= (WebView)findViewById(R.id.webView);
    -       webView.setWebChromeClient(new WebChromeClient(){
    -           long elapsed=0;
    -           long startTime=0;
    -           public void onProgressChanged(WebView view,int progress){
    -               if(progress==0)
    -               {
    -                   startTime=Calendar.getInstance().getTimeInMillis();
    -               }
    -               if(progress==100)
    -               {
    -               String webViewUrl=view.getUrl();
    -               long endTime=Calendar.getInstance().getTimeInMillis();
    -               elapsed=endTime-startTime;
    -                Log.d("myLog",elapsed+"ms "+webViewUrl+" onProgressChanged");
    -               }
    -           }
    -       });
    -       webView.setWebViewClient(new WebViewClient(){
    -           long elapsed=0;
    -           long startTime=0;
    -           public void onPageStarted(WebView view,String url,Bitmap favicon){
    -               startTime=Calendar.getInstance().getTimeInMillis();
    -           }
    -           public void onPageFinished(WebView view,String url){
    -               String webViewUrl=view.getUrl();
    -               long endTime=Calendar.getInstance().getTimeInMillis();
    -               elapsed=endTime-startTime;
    -               Log.d("myLog",elapsed+"ms "+webViewUrl+" onPageFinished");
    -           }
    -           public void onLoadResource(WebView view,String url){
    -           }
    -       });
    -       webView.loadUrl("http://www.bing.com");
    -       Activity mActivity;
    -       long elapsed=0;
    -       long startTime=0;
    -       public void onPageStarted(WebView view,String url,Bitmap favicon){
    -           startTime=Calendar.getInstance().getTimeInMillis();
    -       }
    -       public void onPageFinished(WebView view,String url){
    -           String webViewUrl=view.getUrl();
    -           long endTime=Calendar.getInstance().getTimeInMillis();
    -           elapsed=endTime-startTime;
    -           Toast.makeText(mActivity,elapsed+"ms", Toast.LENGTH_LONG).show();
            -3.3 后台服务性能测试
                -3.3.1 压力场景的建模
                -3.3.2 测试工具
                -3.3.3 测试数据的收集
                -3.3.4 分析和报告
            -3.4 本章小结
        -第4章 专项测试
            -4.1 兼容性测试
                -4.1.1 兼容性测试的准备和手工测试
                -4.1.2 基于UI自动化脚本的云测试方案
            -4.2 流量测试
                -4.2.1 Android App特有的流量测试方法
                -4.2.2 iOS App特有的流量测试方法
    -   BOOL   success;
    -   struct ifaddrs *addrs;
    -   const struct ifaddrs *cursor;
    -   const struct if_data *networkStatisc;
    -   int WiFiSent = 0;
    -   int WiFiReceived = 0;
    -   int WWANSent = 0;
    -   int WWANReceived = 0;
    -   int output=0;
    -   //此处判断当前网络类型,读者有兴趣可自行查阅资料
    -   NetworkStatus status = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];
    -   if(status==NotReachable){
    -       return 0;
    -   }else{
    -       NSString *name=[[[NSString alloc]init]autorelease];
    -       success = getifaddrs(&addrs) == 0;
    -       if (success)
    -       {
    -           cursor = addrs;
    -           while (cursor != NULL) {// 如果是en0 则是 WiFi;如果是pdp_ip0 ,则是蜂窝网络
    -               name=[NSString stringWithFormat:@"%s",cursor->ifa_name];
    -               if (cursor->ifa_addr->sa_family == AF_INET)
    -               {
    -                   if(status==ReachableViaWiFi){
    -                       if ([name hasPrefix:@"en0"])
    -                          {
    -                           //这里就是获取网络接口进出流量的核心代码
    -                           networkStatisc = (const struct if_data *) cursor->ifa_data; //这里需要判断是新统计还是应用老的流量 if(original_WifiReceived==0&&original_WifiSent==0){ //WiFi发送字节大小 original_WifiSent=networkStatisc->ifi_obytes; //WiFi接受字节大小 original_WifiReceived=networkStatisc->ifi_ibytes;
    -                           }else{ WiFiSent=networkStatisc->ifi_obytes-original_WifiSent; WiFiReceived=networkStatisc->ifi_ibytes-original_WifiReceived;
    -                           }
    -                           //这个输出即当前WiFi流量 output=WiFiSent+WiFiReceived;
    -                       }
    -                   }
    -                   else if(status==ReachableViaWWAN){
    -                       if ([name hasPrefix:@"pdp_ip0"])
    -                           {
    -                           networkStatisc = (const struct if_data *)
    -                               cursor->ifa_data;
    -                               if(original_3GReceived==0&&original_3GSent==0){
    -                               original_3GSent=networkStatisc->ifi_obytes;
    -                               original_3GReceived=networkStatisc->ifi_ibytes;
    -                           }else{
    -                        WWANSent=networkStatisc->ifi_obytes-original_3GSent;
    -                   WWANReceived=networkStatisc->ifi_ibytes-original_3GReceived;
    -                           }
    -                           output=WWANSent+WWANReceived;
    -                       }
    -                   }
    -               }
    -               cursor = cursor->ifa_next;
    -           }
    -           freeifaddrs(addrs);
    -       }
    -       return output;
                -4.2.3 通用的流量测试方法
                -4.2.4 常见的流量节省方法
            -4.3 电量测试
                -4.3.1 Android电量测试方法
                -4.3.2 iOS电量测试方法
    -   NSString* version=[[UIDevice currentDevice] systemVersion];
    -   NSString* value;
    -   id entry=[self BatteryInfo];
    -   if([version hasPrefix:@"6"]){
    -       value=[NSString stringWithFormat:@"%@",[entry _getBattery-CurrentCapacity]];
    -   }
    -   value=[NSString stringWithFormat:@"%@",[entry objectForKey:@"current_capacity"]];
    -   return value;
    -   NSString* version=[[UIDevice currentDevice] systemVersion];
    -   id entry=[self BatteryInfo];
    -   if([version hasPrefix:@"6"]){
    -       return [[NSString stringWithFormat:@"%@",[entry _getBatteryMaxCapacity]] intValue];;
    -   }
    -   return [[NSString stringWithFormat:@"%@",[entry objectForKey:@"max_capacity"]] intValue];
            -4.4 弱网络测试
                -4.4.1 借助手机自带的网络状况模拟工具
                -4.4.2 基于代理的弱网络的模拟
            -4.5 稳定性测试
                -4.5.1 基于Monkey的稳定性测试
                -4.5.2 Android的ANR
    - cp /data/anr/traces.txt /sdcard/traces.txt
    - adb pull /sdcard/traces.txt 本地文件路径
                -4.5.3 基于模糊测试思路的稳定性测试方法探索
            -4.6 安全测试
                -4.6.1 安装包测试
                -4.6.2 敏感信息测试
                -4.6.3 软键盘劫持
                -4.6.4 账户安全
                -4.6.5 数据通信安全
                -4.6.6 组件安全测试
                -4.6.7 服务端接口测试
            -4.7 环境相关的测试
                -4.7.1 干扰测试
                -4.7.2 权限测试
                -4.7.3 边界情况
                -4.7.4 Android定位测试
    - geo fix [经度] [纬度]
    -   Location fakeLocation=new Location(LocationManager.GPS_PROVIDER);
    -   manager.addTestProvider(LocationManager.GPS_PROVIDER, true,
    -           false,
    -           false,
    -           false,
    -           true,
    -           true,
    -           true,
    -           Criteria.POWER_MEDIUM,
    -           Criteria.ACCURACY_FINE);
    -   manager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);
    -   fakeLocation.setLatitude(23.129);
    -   fakeLocation.setLongitude(113.264);
    -   fakeLocation.setAccuracy(1);
    -   fakeLocation.setTime(System.currentTimeMillis());
    -   if(Build.VERSION.SDK_INT>16)
    -   {
    -   fakeLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
    -   }
            -4.8 本章小结
        -第5章 辅助测试方法
            -5.1 代码静态扫描
                -5.1.1 针对Android的静态代码扫描
    -   要分析的类包和目录
    -   辅助类位置
    -   源文件目录
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -    }
                -5.1.2 针对iOS的静态代码扫描和分析
    -    rm -f ~/Desktop/resource_scan_result.txt
    -   basename='basename $png'
    -   if [ "${basename##*.}" == "png" ];then
    -#过滤文件名后缀
    -       echo $basename|grep -q @2x.*.png
    -       if [ $? -eq 0 ];then
    -            name=${basename%%@2x*.png}
    -       else
    -           echo $basename|grep -q @3x.*.png
    -           if [ $? -eq 0 ];then
    -               name=${basename%%@3x*.png}
    -           else
    -               name=${basename%%.png}
    -           fi
    -        fi
    -    elif [ "${basename##*.}" == "jpg" ];then
    -        echo $basename|grep -q @2x.*.jpg
    -        if [ $? -eq 0 ];then
    -            name=${basename%%@2x*.jpg}
    -        else
    -            echo $basename|grep -q @3x.*.jpg
    -            if [ $? -eq 0 ];then
    -                name=${basename%%@3x*.jpg}
    -            else
    -                name=${basename%%.jpg}
    -            fi
    -        fi
    -    elif [ "${basename##*.}" == "wav" ];then
    -        name=${basename%%.wav}
    -    fi
    - #过滤那些后缀用数字拼接的
    -    name=${name%%[0-9]*}
    -    if grep -q $name $files;then
    -        echo "$png"  找到了~~
    -    else
    -        if grep -q $basename $3;then
    -            echo "$png" 没有被引用到 >> ~/Desktop/resource_scan_result.txt
    -        fi
    -    fi
    -   echo **********扫描结束,请到桌面下的resource_scan_result.txt下查看未被引用的资源
    -        **********
    -   echo **********扫描结束,没有发现未被引用的资源**************
            -5.2 代码覆盖率分析
                -5.2.1 Android代码覆盖率技术方案
    -         try {
    -         Log.w("mylog ","called startup");
    -               String sessionId = options.getSessionId();
    -               if (sessionId == null) {
    -                       sessionId = createSessionId();
    -                }
    -                data.setSessionId(sessionId);
    -                output = createAgentOutput();
    -                output.startup(options, data);
    -                if (options.getJmx()) {
    -                       jmxRegistration = new JmxRegistration(this);
    -                }
    -                       // Start a new thread to dump coverage dataLog.w("mylog","start thread");
    -                       thread=new Thread(new Agent(options,null));
    -                       thread.start();
    -         }
    -catch (final Exception e) {
    -                  logger.logExeption(e);
    -         }
    -   }
    -   private static Thread thread;
    -   private static java.util.Random r1=new java.util.Random(999999999);
    -   try{
    -   int i=0;
    -   int uid=r1.nextInt();
    -     while(true){
    -   ("sdcard/jacoco/"+uid+"_"+i+".exec");
    -   Log.w("mylog","setDestfile");
    -   this.output = createAgentOutput();
    -   this.output.startup(org.jacoco.agent.rt.internal_932a715.Agent.getInstance().
    -        options,
    -   org.jacoco.agent.rt.internal_932a715.Agent.getInstance().data);
    - this.dump(true);
    - Log.w("mylog ","called dump to generate new jacoco.exec");
    - java.lang.Thread.sleep(30000);
    - i++;
    -   }
    - }
    - catch(Exception ex)
    - {
    - Log.w("mylog ",ex);
    - }
    -   debug{   testCoverageEnabled true…
    -}…
    -   release{
    -   testCoverageEnabled true…
    -}
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
    -序言
                -5.2.2 iOS代码覆盖率技术方案
    -          //设置覆盖率数据保存在共享文件夹下的coverageData目录下
    -        //设置跳过文件夹变量
    -        //设置跳过覆盖率父文件夹层数,由于默认的覆盖率数据文件夹层数很深,这边需要过滤
                -5.2.3 代码覆盖率的应用实践
            -5.3 接口Mock方法
                -5.3.1 常见的接口异常模拟方法
                -5.3.2 使用Fiddler作为Mock Server
                -5.3.3 基于FiddlerCore二次开发的Mock工具
    - static void Main(string[] args)
    -     {
    -         int iProcCount = Environment.ProcessorCount;
    -         int iMinWorkerThreads = Math.Max(16, 6 * iProcCount);
    -         int iMinIOThreads = iProcCount;
    -         ThreadPool.SetMinThreads(iMinWorkerThreads, iMinIOThreads);
    -        Fiddler.FiddlerApplication.SetAppDisplayName("TestControllerFCore");
    -          FiddlerCoreStartupFlags oFCSF = FiddlerCoreStartupFlags.Default;
    -          int iPort = 9988;
    -          Fiddler.FiddlerApplication.BeforeRequest += delegate(Fiddler.Session oS)
    -          {
    -              oS.bBufferResponse = true;
    -          };
    -          Fiddler.FiddlerApplication.BeforeResponse += delegate(Fiddler.Session oS)
    -          {
    -              if (oS.fullUrl.Contains("bing"))
    -              {
    -                  var newHeader = new HTTPResponseHeaders();
    -                  var finalRespBody = System.Text.Encoding.UTF8.GetBytes("hello world!");
    -                oS.utilAssignResponse(newHeader, finalRespBody);
    -                oS.oResponse.headers["Content-Length"] = finalRespBody.Length.ToString();
    -            }
    -        };
    -        Fiddler.FiddlerApplication.Startup(iPort, oFCSF);
    -        Console.WriteLine("Started");
    -        Console.ReadLine();
    -        try
    -        {
    -            Fiddler.FiddlerApplication.Shutdown();
    -        }
    -        catch (Exception) { }
    -   }
            -5.4 AOP测试方法
                -5.4.1 Android AOP测试实践
    -before():财务报销 ()
    -   private static final Object fLock = new Object();
    -   pointcut UHEPoint():execution(* *(..))&&!within(com.example.aspectJ.*);
    -   pointcut HEPoint(Throwable ex, Object exHandlerObject):handler(*)&&args(ex)&&this(exHandlerObject)&&!within(com.example.aspectJ.*);
    -   after()throwing(Throwable ex):UHEPoint()
    -   {
    -       String str="";
    -       str+= "==UH=="+"\n";
    -       str+=ex.getMessage()+"\n";
    -       str+=ex.getClass()+"\n";
    -       for (StackTraceElement ste : ex.getStackTrace())
    -       {
    -           str+= ste.toString()+"\n";
    -       }
    -           AppendLineToLogFile(str);
    -   }
    -   before(Throwable ex, Object exHandlerObject):HEPoint(ex,exHandlerObject)
    -   {
    -       String str="";
    -       str+= "==H=="+"\n";
    -       str+=ex.getMessage()+"\n";
    -       str+=ex.getClass()+"\n";
    -       for (StackTraceElement ste : ex.getStackTrace())
    -       {
    -           str+= ste.toString()+"\n";
    -       }
    -       AppendLineToLogFile(str);
    -   }
    -   void AppendLineToLogFile(String txt)
    -   {
    -       Writer output;
    -       synchronized (fLock)
    -       {
    -           try {
    -               File logFile = new File(logFilePath);
    -           if(!logFile.exists()) {
    -               logFile.createNewFile();
    -           }
    -               output = new BufferedWriter(new FileWriter(logFilePath,true));
    -               output.append(txt);
    -               output.close();
    -           } catch (IOException e) {
    -               e.printStackTrace();
    -           }
    -       }
    -   }
    -     {…
    -                  }
    -   repositories {
    -       mavenCentral()
    -   }
    -   dependencies {
    -       classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.+'
    -   }
                -5.4.2 iOS AOP测试实践
    -       [mw getResponseInfo:info];
            -5.5 本章小结
        -第6章 发布过程中的质量管理
            -6.1 持续集成
                -6.1.1 持续集成简介
                -6.1.2 持续集成实践
            -6.2 发布环节的质量把控
                -6.2.1 后台服务的发布
                -6.2.2 App的发布
            -6.3 内测
                -6.3.1 内测的范围
                -6.3.2 内测的实施
            -6.4 灰度
                -6.4.1 Android App的灰度方法
                -6.4.2 iOS App的灰度方法
            -6.5 本章小结
        -第7章 质量的度量和推动
            -7.1 质量的度量和推动概念
                -7.1.1 质量数据的度量
                -7.1.2 质量推动的活动
            -7.2 QA的角色
            -7.3 跨团队的质量推动
                -7.3.1 开发自测
                -7.3.2 设计走查
                -7.3.3 产品走查
            -7.4 本章小结
        -第8章 发布之后的质量管理
            -8.1 发布后的交叉测试
            -8.2 线上监控
                -8.2.1 监控类型介绍
    -序言
    -       super.onCreate(savedInstanceState);
    -       mContext = this;
    -       MobclickAgent.updateOnlineConfig(this);
    -       super.onResume();
    -       Log.e(TAG, "onResume");
    -       MobclickAgent.onResume(mContext);
    -   super.onPause();
    -   Log.e(TAG, "onPause");
    -   MobclickAgent.onPause(mContext);
                -8.2.2 接口自动化监控
            -8.3 外部用户问题反馈的收集和跟进
            -8.4 本章小结
        -第9章 关于软件测试和测试团队
            -9.1 测试是否必需
            -9.2 专职测试人员的价值
            -9.3 测试团队和发展
            -9.4 本章小结
        -参考文献
Copyright & copy 7dtime.com 2014-2018 all right reserved,powered by Gitbook该文件修订时间: 2018-09-02 18:22:53

results matching ""

    No results matching ""