2014-10-21 2 views
0

안드로이드 로봇 테스트 프로젝트를 만들었습니다. 장치 및 에뮬레이터에서 Eclipse에서 성공적으로 실행됩니다.장치에서 안드로이드 테스트 프로젝트를 실행 중

테스트 앱이 관리 앱에서 표시되는 경우에도 해당 아이콘이 홈 화면에 표시되지 않습니다. 잠재적 인 클라이언트 (프로그래머가 아님)에게 보내야합니다. 프로그래머는 아니며 설치하고 휴대 전화에서 바로 실행할 수 있습니다. 실행 아이콘이 없으면 어떻게 실행할 것입니까?

나는 모든 종류의 selutions를 시도했지만 기술 클라이언트가 아닌 사람에게는 뭔가가 필요합니다. "홈 화면에 아이콘"에서 테스트를 실행 할 가능성이 없습니다

package genericTest.test; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Random; 

import android.annotation.SuppressLint; 
import android.app.Application; 
import android.app.KeyguardManager; 
import android.content.Context; 
import android.os.SystemClock; 
import android.test.ActivityInstrumentationTestCase2; 
import android.util.Log; 
import android.view.View; 

import com.robotium.solo.Solo; 

@SuppressWarnings("rawtypes") 
public class Main extends ActivityInstrumentationTestCase2 { 
    private FunctonsForViews mFunctonsForViews; 
    private Random mRand; 
    private Solo mSolo; 
    private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.OnOApps.NRG.MainActivity"; 

    private final int DELAY = 50; 
    private final int SCREEN_SIZE = 1280; 
    private final int ERROR_COUNT_LIMIT = 10; 
    private final int CLICK_ON_LOOP_LIMIT = 8; 
    private final int WHAITING_FOR_VIEWS_LIMIT = 10; 

    private static Class launcherActivityClass; 
    private static int error_count = 0; 

    static { 
     try { 
      launcherActivityClass = Class 
        .forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME); 
     } catch (ClassNotFoundException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    @SuppressLint("NewApi") 
    @SuppressWarnings("unchecked") 
    public Main() throws ClassNotFoundException { 
     super(launcherActivityClass); 

    } 

    @SuppressWarnings("deprecation") 
    protected void setUp() throws Exception { 
     setActivityInitialTouchMode(true); 
     mSolo = new Solo(getInstrumentation(), getActivity()); 

     Context context = getActivity(); 
     KeyguardManager km = 
        (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); 
     if (km.inKeyguardRestrictedInputMode()) 
     { 
      KeyguardManager.KeyguardLock lock = km.newKeyguardLock("some_tag"); 
      lock.disableKeyguard(); 
      SystemClock.sleep(2000); 
     } 
     setActivityInitialTouchMode(true); 
    } 

    /* 
    * runs the test for the app. 
    */ 
    public void testMethod() 
    { 
     mFunctonsForViews = new FunctonsForViews(mSolo); 
     mSolo.sleep(DELAY * DELAY); 

     mRand = new Random(); 

     /* 
     * the test will take place in the loop, and will be limit in time. 
     * in every iteration it will get the vies in activity's, and run a test on a random view. 
     */ 
     for(int i=0 ; ; i += DELAY) 
     { 
      Log.i("starting eteration", "" + i); 
      mSolo.unlockScreen(); 
      ArrayList Views = mSolo.getViews(); 
      int arraySize = Views.size(); 
      if (arraySize == 0)// now View in activity. 
      { 
       whenNoViewsInScreen(Views, arraySize); 
      } 
      if (arraySize != 0) 
      { 
       int ViewIndexInArray = mRand.nextInt(arraySize + 2); 
       if (ViewIndexInArray == arraySize) 
       { 
        mSolo.scrollDown(); 
       } 

       else if (ViewIndexInArray == arraySize + 1)  
       { 
        if (!mSolo.getCurrentActivity().getClass().toString().split(" ")[1].equals 
          (LAUNCHER_ACTIVITY_FULL_CLASSNAME)) 
          { 
           goingBack(); 
          } 
       } 
       else 
       { 
        View randomView = (View)(Views.get(ViewIndexInArray)); 
        runTestOnOneView(randomView); 
       } 
      } 
     } 
    } 

    /* 
    * performing clicks onScreen() 
    */ 
    public void myClickOnScreen() 
    { 
     try { 
      mSolo.unlockScreen(); 
      mSolo.clickOnScreen(mRand.nextInt(SCREEN_SIZE), mRand.nextInt(SCREEN_SIZE)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      error_count++; 
     } catch (Error e2) { 
      error_count++; 
      e2.printStackTrace(); 
     }  
    } 

    /* 
    * there is no Views available. 
    * we will try pressing on screen or the goBack function. 
    */ 
    public void whenNoViewsInScreen(ArrayList Views, int arraySize) 
    { 
     for (int j = 0; j < WHAITING_FOR_VIEWS_LIMIT; j++) 
     { 
      for (int k= 0; k < CLICK_ON_LOOP_LIMIT; k++) 
      { 
       myClickOnScreen(); 
      } 

      Views = mSolo.getViews(); 
      arraySize = Views.size(); 
      if (arraySize != 0) 
      { 
       return; 
      } 
      mSolo.sleep(DELAY); 
      Views = mSolo.getViews(); 
      arraySize = Views.size(); 
      if (arraySize != 0) 
      { 
       return; 
      } 
     } 
     if (!mSolo.getCurrentActivity().getClass().toString().split(" ")[1].equals 
       (LAUNCHER_ACTIVITY_FULL_CLASSNAME)) 
       { 
        goingBack(); 
       } 
     mSolo.sleep(DELAY); 
     return; 
    } 

    public void runTestOnOneView(View randomView) 
    { 
     String rawViewName = randomView.getClass().getName(); 
     String viewName = parseRawViewName(rawViewName); 
     if (viewName.contains("ActionBarContainer")) 
     { 
      return; 
     } 
     MyRunnable myRunnable = mFunctonsForViews.getMethodMap().get(viewName); 
     try{ 
      if (myRunnable != null) 
      { 
       myRunnable.run((View)randomView);    
      } 
      else // view not in map. 
      { 
       boolean inMap = false; 
       Iterator it = mFunctonsForViews.getMethodMap().entrySet().iterator(); 
       /* 
       * iterating in case the View is a version of one of View in map 
       * example: 
       * View is "CustomEditText", and map contains o view "EditText". 
       */ 
       while (it.hasNext()) 
       { 
        Map.Entry pairs = (Map.Entry)it.next(); 
        if ( viewName.contains((String)pairs.getKey()) ) 
        { 
         inMap = true; 
         // next two lines changed 
         myRunnable = (MyRunnable)(pairs.getValue()); 
         myRunnable.run((View)randomView); 
         break; 
        } 
       } 
       if (inMap == false) 
       { 

        if (viewName.contains("Layout")) 
        { 
         return; 
        } 
        mSolo.clickOnView((View)randomView); 
       } 
       error_count = 0; 
      } 
     }catch(Exception exception) 
     { 
      exception.printStackTrace(); 
      if(error_count > ERROR_COUNT_LIMIT && 
        !(mSolo.getCurrentActivity().getClass().toString().split(" ")[1].equals(LAUNCHER_ACTIVITY_FULL_CLASSNAME)))  
      { 
       goingBack(); 
       error_count = 0; 
      } 
      return; 

     }catch(Error error) 
     { 

      error.printStackTrace(); 
      error_count ++; 
      if(error_count > ERROR_COUNT_LIMIT && 
        !(mSolo.getCurrentActivity().getClass().toString().split(" ")[1].equals(LAUNCHER_ACTIVITY_FULL_CLASSNAME)))  
      { 
       goingBack(); 
       error_count = 0; 
      } 
      return; 
     } 
     mSolo.sleep(DELAY); 
    } 

    /* 
    * performs a goBack command surrounded with catch/try 
    */ 
    public void goingBack() 
    { 
     try { 
      String currentActivity = mSolo.getCurrentActivity().getClass().toString(); 
      Log.e("in function before", "going back"); 
      mSolo.goBack(); 
      if (mSolo.getCurrentActivity().getClass().toString().equals(currentActivity)) 
      { 
       for (int i = 0; i< 20; i++) 
       { 
        myClickOnScreen(); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 

     } catch (Error e) { 
      e.printStackTrace(); 
     } 
    } 

    /* 
    * extract the name of View from raw View name. 
    * example: 
    * raw View name: android.widget.TextView 
    * raw View name:TextView 
    */ 
    public String parseRawViewName(String rawViewName) 
    { 
     if (rawViewName.contains(" ")) 
     { 
      String [] array = rawViewName.split(" "); 
      rawViewName = array [0]; 
     } 

     if (rawViewName.contains(".") || rawViewName.contains("$")) 
     { 
      String [] array = rawViewName.split("\\.|$"); 
      rawViewName = array [array.length-1]; 
     } 
     return rawViewName; 
    } 

    public void tearDown() throws Exception { 
     mSolo.finishOpenedActivities(); 
    } 
} 

답변

0

: 여기

메인 클래스의 코드입니다. 테스트는 InstrumentationRunner를 사용하여 IDE에서 관리합니다. 따라서 클라이언트가 자신의 디바이스에서 테스트를 실행하도록하려면 Eclipse/Android Studio에서 프로젝트를 체크 아웃하고 테스트를 실행해야합니다.

+0

기술적으로 APK를 기술적으로 거의 정확하게 맞출 수 있습니다. 그런 다음 전화에 연결된 PC에서 adb 명령을 사용하여 테스트를 실행할 수 있습니다. 그러나 전화 (AFAIK)를 뿌리지 않고 장치 자체에서 테스트를 실행할 방법이 없다는 것이 맞습니다. – vman

관련 문제