hellofenghao / robotium

Automatically exported from code.google.com/p/robotium
0 stars 0 forks source link

robotiumRC:Error: Bad component name: android.test.InstrumentationTestRunner #545

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?
1. I writed a class file,according to example in wiki:

package com.android.test.rc;
import java.util.Properties;
import com.jayway.android.robotium.remotecontrol.solo.Message;
import com.jayway.android.robotium.remotecontrol.solo.SoloTest;
public class MyTest extends SoloTest{
    public static final String DEFAULT_AUT_APK = "E:\\android\\test\\NotePad\\bin\\NotePad.apk";
    public static final String messengerApk="C:\\robotiumrc\\SAFSTCPMessenger\\bin\\SAFSTCPMessenger-debug.apk";
    public static final String testRunnerApk="C:\\robotiumrc\\RobotiumTestRunner\\bin\\RobotiumTestRunner-debug.apk";
    public static final String instrumentArg="android.test.InstrumentationTestRunner";
public MyTest(){ 
        super();
        }
      public MyTest(String[] args){ 
          super(args); 
          }
      public MyTest(String messengerApk, String testRunnerApk, String instrumentArg){
          super(messengerApk, testRunnerApk, instrumentArg);
      }

      public static void main(String[] args){
          SoloTest soloTest = new MyTest(messengerApk,testRunnerApk,instrumentArg);
          soloTest.setAUTApk(DEFAULT_AUT_APK);
          soloTest.process();
      }

        protected void test(){
          try{

              String activityID = solo.getCurrentActivity();
              Properties props = solo._last_remote_result;
              String activityName = props.getProperty(Message.PARAM_NAME);
              String activityClass = props.getProperty(Message.PARAM_CLASS);

              System.out.println("CurrentActivity   UID: "+ activityID);
              System.out.println("CurrentActivity Class: "+ activityClass);
              System.out.println("CurrentActivity  Name: "+ activityName);

          }catch(Exception e){

              e.printStackTrace();

          }
        }
}
2.run as java application:
Attempting to initialize Android Tools...
C:\Program Files\Android\android-sdk doesn't exist.
Setting Android Tools SDK Dir to 
E:\android\adt-bundle-windows-x86-20130917\adt-bundle-windows-x86-20130917\sdk
SoloTest INFO: Detected 1 device/emulators attached.
SoloTest DEBUG: INSTALLING E:\android\test\NotePad\bin\NotePad.apk
INSTALLING E:\android\test\NotePad\bin\NotePad.apk
Checking for devices going offline...
Checking 1 for 'offline' status....
No 'offline' devices detected.
ATTEMPTING ADB Install command: adb [Ljava.lang.String;@1a7789c
    pkg: /data/local/tmp/NotePad.apk

Success

408 KB/s (65420 bytes in 0.156s)
ADB Install command successful.
SoloTest DEBUG: INSTALLING 
C:\robotiumrc\SAFSTCPMessenger\bin\SAFSTCPMessenger-debug.apk
INSTALLING C:\robotiumrc\SAFSTCPMessenger\bin\SAFSTCPMessenger-debug.apk
Checking for devices going offline...
Checking 1 for 'offline' status....
No 'offline' devices detected.
ATTEMPTING ADB Install command: adb [Ljava.lang.String;@6db33c
    pkg: /data/local/tmp/SAFSTCPMessenger-debug.apk

Success

312 KB/s (34993 bytes in 0.109s)
ADB Install command successful.
SoloTest DEBUG: INSTALLING 
C:\robotiumrc\RobotiumTestRunner\bin\RobotiumTestRunner-debug.apk
INSTALLING C:\robotiumrc\RobotiumTestRunner\bin\RobotiumTestRunner-debug.apk
Checking for devices going offline...
Checking 1 for 'offline' status....
No 'offline' devices detected.
ATTEMPTING ADB Install command: adb [Ljava.lang.String;@1dafb4e
    pkg: /data/local/tmp/RobotiumTestRunner-debug.apk

Success

395 KB/s (126654 bytes in 0.312s)
ADB Install command successful.
LAUNCHING android.test.InstrumentationTestRunner
Checking for devices going offline...
Checking 1 for 'offline' status....
No 'offline' devices detected.
usage: am [subcommand] [options]

usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]

               [--R COUNT] [-S] [--opengl-trace]

               [--user <USER_ID> | current] <INTENT>

       am startservice [--user <USER_ID> | current] <INTENT>

       am force-stop [--user <USER_ID> | all | current] <PACKAGE>

       am kill [--user <USER_ID> | all | current] <PACKAGE>

       am kill-all

       am broadcast [--user <USER_ID> | all | current] <INTENT>

       am instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]

               [--user <USER_ID> | current]

               [--no-window-animation] <COMPONENT>

       am profile start [--user <USER_ID> current] <PROCESS> <FILE>

       am profile stop [--user <USER_ID> current] [<PROCESS>]

       am dumpheap [--user <USER_ID> current] [-n] <PROCESS> <FILE>

       am set-debug-app [-w] [--persistent] <PACKAGE>

       am clear-debug-app

       am monitor [--gdb <port>]

       am hang [--allow-restart]

       am screen-compat [on|off] <PACKAGE>

       am to-uri [INTENT]

       am to-intent-uri [INTENT]

       am switch-user <USER_ID>

       am stop-user <USER_ID>

am start: start an Activity.  Options are:

    -D: enable debugging

    -W: wait for launch to complete

    --start-profiler <FILE>: start profiler and send results to <FILE>

    -P <FILE>: like above, but profiling stops when app goes idle

    -R: repeat the activity launch <COUNT> times.  Prior to each repeat,

        the top activity will be finished.

    -S: force stop the target app before starting the activity

    --opengl-trace: enable tracing of OpenGL functions

    --user <USER_ID> | current: Specify which user to run as; if not

        specified then run as the current user.

am startservice: start a Service.  Options are:

    --user <USER_ID> | current: Specify which user to run as; if not

        specified then run as the current user.

am force-stop: force stop everything associated with <PACKAGE>.

    --user <USER_ID> | all | current: Specify user to force stop;

        all users if not specified.

am kill: Kill all processes associated with <PACKAGE>.  Only kills.

  processes that are safe to kill -- that is, will not impact the user

  experience.

    --user <USER_ID> | all | current: Specify user whose processes to kill;

        all users if not specified.

am kill-all: Kill all background processes.

am broadcast: send a broadcast Intent.  Options are:

    --user <USER_ID> | all | current: Specify which user to send to; if not

        specified then send to all users.

    --receiver-permission <PERMISSION>: Require receiver to hold permission.

am instrument: start an Instrumentation.  Typically this target <COMPONENT>

  is the form <TEST_PACKAGE>/<RUNNER_CLASS>.  Options are:

    -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT).  Use with

        [-e perf true] to generate raw output for performance measurements.

    -e <NAME> <VALUE>: set argument <NAME> to <VALUE>.  For test runners a

        common form is [-e <testrunner_flag> <value>[,<value>...]].

    -p <FILE>: write profiling data to <FILE>

    -w: wait for instrumentation to finish before returning.  Required for

        test runners.

    --user <USER_ID> | current: Specify user instrumentation runs in;

        current user if not specified.

    --no-window-animation: turn off window animations will running.

am profile: start and stop profiler on a process.  The given <PROCESS> argument

  may be either a process name or pid.  Options are:

    --user <USER_ID> | current: When supplying a process name,

        specify user of process to profile; uses current user if not specified.

am dumpheap: dump the heap of a process.  The given <PROCESS> argument may

  be either a process name or pid.  Options are:

    -n: dump native heap instead of managed heap

    --user <USER_ID> | current: When supplying a process name,

        specify user of process to dump; uses current user if not specified.

am set-debug-app: set application <PACKAGE> to debug.  Options are:

    -w: wait for debugger when application starts

    --persistent: retain this value

am clear-debug-app: clear the previously set-debug-app.

am bug-report: request bug report generation; will launch UI

    when done to select where it should be delivered.

am monitor: start monitoring for crashes or ANRs.

    --gdb: start gdbserv on the given port at crash/ANR

am hang: hang the system.

    --allow-restart: allow watchdog to perform normal system restart

am screen-compat: control screen compatibility mode of <PACKAGE>.

am to-uri: print the given Intent specification as a URI.

am to-intent-uri: print the given Intent specification as an intent: URI.

am switch-user: switch to put USER_ID in the foreground, starting

  execution of that user if it is currently stopped.

am stop-user: stop execution of USER_ID, not allowing it to run any

  code until a later explicit switch to it.

<INTENT> specifications include these flags and arguments:

    [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]

    [-c <CATEGORY> [-c <CATEGORY>] ...]

    [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]

    [--esn <EXTRA_KEY> ...]

    [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]

    [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]

    [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]

    [--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]

    [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]

    [--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]

    [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]

    [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]

    [--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]

    [-n <COMPONENT>] [-f <FLAGS>]

    [--grant-read-uri-permission] [--grant-write-uri-permission]

    [--debug-log-resolution] [--exclude-stopped-packages]

    [--include-stopped-packages]

    [--activity-brought-to-front] [--activity-clear-top]

    [--activity-clear-when-task-reset] [--activity-exclude-from-recents]

    [--activity-launched-from-history] [--activity-multiple-task]

    [--activity-no-animation] [--activity-no-history]

    [--activity-no-user-action] [--activity-previous-is-top]

    [--activity-reorder-to-front] [--activity-reset-task-if-needed]

    [--activity-single-top] [--activity-clear-task]

    [--activity-task-on-home]

    [--receiver-registered-only] [--receiver-replace-pending]

    [--selector]

    [<URI> | <PACKAGE> | <COMPONENT>]

Error: Bad component name: android.test.InstrumentationTestRunner

SoloTest DEBUG: Prepare for test successfully.
SocketProtocol.addListener(): AbstractRunner was successfully registered.
DroidSocketProtocol.addListener(): AbstractRunner was successfully registered.
Port forwarding will be from '2413'
DroidSocketProtocol.createRemoteClientConnection(): Local Runner attempting to 
make remote Runner connection...
Forwarding port from 'local:2413' to 'device/emulator:2410'
DroidSocketProtocol.createRemoteClientConnection(): Remote Runner seems to be 
connected!

3.I found it's not " <instrumentation 
android:name="com.jayway.android.robotium.remotecontrol.client.RobotiumTestRunne
r" in lib jar. 

What is the expected output? What do you see instead?
I expected run succeffully and apk could start in AVD.

What version of the product are you using? On what operating system?
robotiumRC version:RobotiumRCRelease2013.09.09
OS: winXP

Please provide any additional information below.
url:http://safsdev.sourceforge.net/doc/com/jayway/android/robotium/remotecontrol
/client/package-summary.html

I hope that downloading the package:"Package 
com.jayway.android.robotium.remotecontrol.client"

Original issue reported on code.google.com by bingyuan...@gmail.com on 31 Oct 2013 at 5:11

GoogleCodeExporter commented 9 years ago
Reviewing and researching...

Original comment by carl.na...@sas.com on 31 Oct 2013 at 1:07

GoogleCodeExporter commented 9 years ago
I see a few things of note:

1. You seem to be using an ADT Bundle for Eclipse as your Android SDK 
environment.  This mode hasn't been tested.  However, in reviewing the 
information online about the asset locations in the ADT Bundle I don't think 
that in itself is the problem.

What may be the problem is that this ADT Bundle was released AFTER RobotiumRC 
2013.09.09. I'm venturing a guess the ADT Bundle might include new versions of 
tools--or different Eclipse versions of tools--that are NOT backward compatible 
with the normal command-line Android SDK tools we have used before this toolset 
release.

We will have to evaluate the use of the ADT Bundle as a supported mode of 
command-line driven execution.

This part of the log leads me to believe, for example, the am (Activity 
Manager?) tool usage and api might be different:

    No 'offline' devices detected.
    usage: am [subcommand] [options]
    ...
    [Help for am command usage follows]
    ...

2. Has the Notepad.apk been build or re-signed with the same developer 
certificate used to build the SAFSTCPMessenger and RobotiumTestRunner?

3. Could you clarify the statement below?  I don't know what it means:

   >> I found it's not " 
   >> <instrumentation android:name=
   >> "com.jayway.android.robotium.remotecontrol.client.RobotiumTestRunner" 
   >> in lib jar. 

What lib jar are you looking at?  
The RobotiumTestRunner is not supposed to be in any particular JAR file, per se.
It is in the /src folder for the code that makes the RobotiumTestRunner and is 
built into the installed APK.

Original comment by carl.na...@sas.com on 31 Oct 2013 at 1:45

GoogleCodeExporter commented 9 years ago
I think the problem is the parameter 'instrumentArg' is not correctly assigned, 
you define it as:
public static final String 
instrumentArg="android.test.InstrumentationTestRunner";
If you remove it from your code, I guess the problem will disappear.

This parameter will be used to launch the Instrument by android ADB,
On page http://developer.android.com/tools/help/adb.html, under section of 
"Using activity manager (am)", look at the command instrument, the <COMPONENT> 
is our parameter 'instrumentArg', it should be given as 
<TEST_PACKAGE>/<RUNNER_CLASS>

In RobotiumRCRelease2013.09.09, two TestRunners have been provided, one is 
RobotiumTestRunner, the other is SAFSTestRunner. You can use either of them to 
do the test, but SAFSTestRunner provides more functionality.

If you use RobotiumTestRunner, you don't need to provide parameter 
'instrumentArg'. RobotiumTestRunner is the default Runner, and 'instrumentArg' 
has been default assigned as 
"com.jayway.android.robotium.remotecontrol.client/com.jayway.android.robotium.re
motecontrol.client.RobotiumTestRunner"

If you want to use SAFSTestRunner, you need to assign 'instrumentArg' as 
"org.safs.android.engine/org.safs.android.engine.DSAFSTestRunner". One more 
thing, (suppose RC is installed at C:\robotiumrc) you need to modify the file 
C:\robotiumrc\SAFSTCPMessenger\local.properties
change value of 'safs.droid.automation.libs' from 
"C:\robotiumrc\RobotiumTestRunner\libs" to "C:\robotiumrc\SAFSTestRunner\libs"

Original comment by leiwang...@gmail.com on 1 Nov 2013 at 3:04

GoogleCodeExporter commented 9 years ago

Original comment by carl.na...@sas.com on 19 Nov 2013 at 3:02