228 lines
9.9 KiB
Plaintext
228 lines
9.9 KiB
Plaintext
page.title=Creating and Running a Test Case
|
||
trainingnavtop=true
|
||
|
||
@jd:body
|
||
|
||
<!-- This is the training bar -->
|
||
<div id="tb-wrapper">
|
||
<div id="tb">
|
||
|
||
<h2>This lesson teaches you to</h2>
|
||
<ol>
|
||
<li><a href="#testcase">Create a Test Case for Activity Testing</a>
|
||
<ol>
|
||
<li><a href="#fixture">Set Up Your Test Fixture</a></li>
|
||
<li><a href="#preconditions">Add Test Preconditions</a></li>
|
||
<li><a href="#test_method">Add Test Methods to Verify Your Activity</a></li>
|
||
</ol>
|
||
</li>
|
||
<li><a href="#build_run">Build and Run Your Test</a></li>
|
||
</ol>
|
||
|
||
<h2>You should also read</h2>
|
||
<ul>
|
||
<li><a href="{@docRoot}tools/testing/testing_android.html">Testing
|
||
Fundamentals</a></li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
<p>In order to verify that there are no regressions in the layout design and
|
||
functional behavior in your application, it's important to
|
||
create a test for each {@link android.app.Activity} in your application. For
|
||
each test, you need to create the individual parts of a test case, including
|
||
the test fixture, preconditions test method, and {@link android.app.Activity}
|
||
test methods. You can then run your test to get a test report. If any test
|
||
method fails, this might indicate a potential defect in your code.</p>
|
||
<p class="note"><strong>Note:</strong> In the Test-Driven Development (TDD)
|
||
approach, instead of writing most or all of your app code up-front and then
|
||
running tests later in the development cycle, you would progressively write
|
||
just enough production code to satisfy your test dependencies, update your
|
||
test cases to reflect new functional requirements, and iterate repeatedly this
|
||
way.</p>
|
||
|
||
<h2 id="testcase">Create a Test Case</h2>
|
||
<p>{@link android.app.Activity} tests are written in a structured way.
|
||
Make sure to put your tests in a separate package, distinct from the code under
|
||
test.</p>
|
||
<p>By convention, your test package name should follow the same name as the
|
||
application package, suffixed with <strong>".tests"</strong>. In the test package
|
||
you created, add the Java class for your test case. By convention, your test case
|
||
name should also follow the same name as the Java or Android class that you
|
||
want to test, but suffixed with <strong>“Test”</strong>.</p>
|
||
<p>To create a new test case in Eclipse:</p>
|
||
<ol type="a">
|
||
<li>In the Package Explorer, right-click on the {@code /src} directory for
|
||
your test project and select <strong>New > Package</strong>.</li>
|
||
<li>Set the <strong>Name</strong> field to
|
||
{@code <your_app_package_name>.tests} (for example,
|
||
{@code com.example.android.testingfun.tests}) and click
|
||
<strong>Finish</strong>.</li>
|
||
<li>Right-click on the test package you created, and select
|
||
<strong>New > Class</strong>.</li>
|
||
<li>Set the <strong>Name</strong> field to
|
||
{@code <your_app_activity_name>Test} (for example,
|
||
{@code MyFirstTestActivityTest}) and click <strong>Finish</strong>.</li>
|
||
</ol>
|
||
|
||
<h3 id="fixture">Set Up Your Test Fixture</h3>
|
||
<p>A <em>test fixture</em> consists of objects that must be initialized for
|
||
running one or more tests. To set up the test fixture, you can override the
|
||
{@link junit.framework.TestCase#setUp()} and
|
||
{@link junit.framework.TestCase#tearDown()} methods in your test. The
|
||
test runner automatically runs {@link junit.framework.TestCase#setUp()} before
|
||
running any other test methods, and {@link junit.framework.TestCase#tearDown()}
|
||
at the end of each test method execution. You can use these methods to keep
|
||
the code for test initialization and clean up separate from the tests methods.
|
||
</p>
|
||
<p>To set up your test fixture in Eclipse:</p>
|
||
<ol>
|
||
<li>In the Package Explorer, double-click on the test case that you created
|
||
earlier to bring up the Eclipse Java editor, then modify your test case class
|
||
to extend one of the sub-classes of {@link android.test.ActivityTestCase}.
|
||
<p>For example:</p>
|
||
<pre>
|
||
public class MyFirstTestActivityTest
|
||
extends ActivityInstrumentationTestCase2<MyFirstTestActivity> {
|
||
</pre>
|
||
</li>
|
||
<li>Next, add the constructor and {@link junit.framework.TestCase#setUp()}
|
||
methods to your test case, and add variable declarations for the
|
||
{@link android.app.Activity} that you want to test.</p>
|
||
<p>For example:</p>
|
||
<pre>
|
||
public class MyFirstTestActivityTest
|
||
extends ActivityInstrumentationTestCase2<MyFirstTestActivity> {
|
||
|
||
private MyFirstTestActivity mFirstTestActivity;
|
||
private TextView mFirstTestText;
|
||
|
||
public MyFirstTestActivityTest() {
|
||
super(MyFirstTestActivity.class);
|
||
}
|
||
|
||
@Override
|
||
protected void setUp() throws Exception {
|
||
super.setUp();
|
||
mFirstTestActivity = getActivity();
|
||
mFirstTestText =
|
||
(TextView) mFirstTestActivity
|
||
.findViewById(R.id.my_first_test_text_view);
|
||
}
|
||
}
|
||
</pre>
|
||
<p>The constructor is invoked by the test runner to instantiate the test
|
||
class, while the {@link junit.framework.TestCase#setUp()} method is invoked by
|
||
the test runner before it runs any tests in the test class.</p>
|
||
</li>
|
||
</ol>
|
||
|
||
<p>Typically, in the {@link junit.framework.TestCase#setUp()} method, you
|
||
should:</p>
|
||
<ul>
|
||
<li>Invoke the superclass constructor for
|
||
{@link junit.framework.TestCase#setUp()}, which is required by JUnit.</li>
|
||
<li>Initialize your test fixture state by:
|
||
<ul>
|
||
<li>Defining the instance variables that store the state of the fixture.</li>
|
||
<li>Creating and storing a reference to an instance of the
|
||
{@link android.app.Activity} under test.</li>
|
||
<li>Obtaining a reference to any UI components in the
|
||
{@link android.app.Activity} that you want to test.</li>
|
||
</ul>
|
||
</ul>
|
||
|
||
<p>You can use the
|
||
{@link android.test.ActivityInstrumentationTestCase2#getActivity()} method to
|
||
get a reference to the {@link android.app.Activity} under test.</p>
|
||
|
||
<h3 id="preconditions">Add Test Preconditions</h3>
|
||
<p>As a sanity check, it is good practice to verify that the test fixture has
|
||
been set up correctly, and the objects that you want to test have been correctly
|
||
instantiated or initialized. That way, you won’t have to see
|
||
tests failing because something was wrong with the setup of your test fixture.
|
||
By convention, the method for verifying your test fixture is called
|
||
{@code testPreconditions()}.</p>
|
||
|
||
<p>For example, you might want to add a {@code testPreconditons()} method like
|
||
this to your test case:</p>
|
||
|
||
<pre>
|
||
public void testPreconditions() {
|
||
assertNotNull(“mFirstTestActivity is null”, mFirstTestActivity);
|
||
assertNotNull(“mFirstTestText is null”, mFirstTestText);
|
||
}
|
||
</pre>
|
||
|
||
<p>The assertion methods are from the JUnit {@link junit.framework.Assert}
|
||
class. Generally, you can use assertions to
|
||
verify if a specific condition that you want to test is true.
|
||
<ul>
|
||
<li>If the condition is false, the assertion method throws an
|
||
{@link android.test.AssertionFailedError} exception, which is then typically
|
||
reported by the test runner. You can provide a string in the first argument of
|
||
your assertion method to give some contextual details if the assertion fails.</li>
|
||
<li>If the condition is true, the test passes.</li>
|
||
</ul>
|
||
<p>In both cases, the test runner proceeds to run the other test methods in the
|
||
test case.</p>
|
||
|
||
<h3 id="test_method">Add Test Methods to Verify Your Activity</h3>
|
||
<p>Next, add one or more test methods to verify the layout and functional
|
||
behavior of your {@link android.app.Activity}.</p>
|
||
<p>For example, if your {@link android.app.Activity} includes a
|
||
{@link android.widget.TextView}, you can add a test method like this to check
|
||
that it has the correct label text:</p>
|
||
<pre>
|
||
public void testMyFirstTestTextView_labelText() {
|
||
final String expected =
|
||
mFirstTestActivity.getString(R.string.my_first_test);
|
||
final String actual = mFirstTestText.getText().toString();
|
||
assertEquals(expected, actual);
|
||
}
|
||
</pre>
|
||
|
||
<p>The {@code testMyFirstTestTextView_labelText()} method simply checks that the
|
||
default text of the {@link android.widget.TextView} that is set by the layout
|
||
is the same as the expected text defined in the {@code strings.xml} resource.</p>
|
||
<p class="note"><strong>Note:</strong> When naming test methods, you can use
|
||
an underscore to separate what is being tested from the specific case being
|
||
tested. This style makes it easier to see exactly what cases are being tested.</p>
|
||
<p>When doing this type of string value comparison, it’s good practice to read
|
||
the expected string from your resources, instead of hardcoding the string in
|
||
your comparison code. This prevents your test from easily breaking whenever the
|
||
string definitions are modified in the resource file.</p>
|
||
<p>To perform the comparison, pass both the expected and actual strings as
|
||
arguments to the
|
||
{@link junit.framework.Assert#assertEquals(java.lang.String, java.lang.String) assertEquals()}
|
||
method. If the values are not the same, the assertion will throw an
|
||
{@link junit.framework.AssertionFailedError} exception.</p>
|
||
<p>If you added a {@code testPreconditions()} method, put your test methods
|
||
after the {@code testPreconditions()} definition in your Java class.</p>
|
||
<p>For a complete test case example, take a look at
|
||
{@code MyFirstTestActivityTest.java} in the sample app.</p>
|
||
|
||
<h2 id="build_run">Build and Run Your Test</h2>
|
||
<p>You can build and run your test easily from the Package Explorer in
|
||
Eclipse.</p>
|
||
<p>To build and run your test:</p>
|
||
<ol>
|
||
<li>Connect an Android device to your machine. On the device or emulator, open
|
||
the <strong>Settings</strong> menu, select <strong>Developer options</strong>
|
||
and make sure that USB debugging is enabled.</li>
|
||
<li>In the Project Explorer, right-click on the test class that you created
|
||
earlier and select <strong>Run As > Android Junit Test</strong>.</li>
|
||
<li>In the Android Device Chooser dialog, select the device that you just
|
||
connected, then click <strong>OK</strong>.</li>
|
||
<li>In the JUnit view, verify that the test passes with no errors or failures.</li>
|
||
</ol>
|
||
<p>For example, if the test case passes with no errors, the result should look
|
||
like this:</p>
|
||
<img src="{@docRoot}images/training/activity-testing_lesson2_MyFirstTestActivityTest_result.png" alt="" />
|
||
<p class="img-caption">
|
||
<strong>Figure 1.</strong> Result of a test with no errors.
|
||
</p>
|
||
|
||
|
||
|