3.
定义test
runner,以及构建UI来处理测试流程,查看测试结果等。<!--[endif]-->
MyJUnitExample.java
package com.ut.prac;
import junit.framework.Test;
import junit.framework.TestListener;
import android.app.Activity;
import android.os.Bundle;
import android.test.AndroidTestRunner;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MyJUnitExample extends Activity {
static final String LOG_TAG = "junit";
Thread testRunnerThread = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button launcherButton = (Button)findViewById( R.id.launch_button );
launcherButton.setOnClickListener( new View.OnClickListener() {
public void onClick( View view ) {
startTest();
}
} );
}
private synchronized void startTest() {
if( ( testRunnerThread != null ) &&
!testRunnerThread.isAlive() )
testRunnerThread = null;
if( testRunnerThread == null ) {
testRunnerThread = new Thread( new TestRunner( this ) );
testRunnerThread.start();
} else
Toast.makeText(
this,
"Test is still running",
Toast.LENGTH_SHORT).show();
}
}
class TestDisplay implements Runnable {
public enum displayEvent {
START_TEST,
END_TEST,
ERROR,
FAILURE,
}
displayEvent ev;
String testName;
int testCounter;
int errorCounter;
int failureCounter;
TextView statusText;
TextView testCounterText;
TextView errorCounterText;
TextView failureCounterText;
public TestDisplay( displayEvent ev,
String testName,
int testCounter,
int errorCounter,
int failureCounter,
TextView statusText,
TextView testCounterText,
TextView errorCounterText,
TextView failureCounterText ) {
this.ev = ev;
this.testName = testName;
this.testCounter = testCounter;
this.errorCounter = errorCounter;
this.failureCounter = failureCounter;
this.statusText = statusText;
this.testCounterText = testCounterText;
this.errorCounterText = errorCounterText;
this.failureCounterText = failureCounterText;
}
public void run() {
StringBuffer status = new StringBuffer();
switch( ev ) {
case START_TEST:
status.append( "Starting" );
break;
case END_TEST:
status.append( "Ending" );
break;
case ERROR:
status.append( "Error: " );
break;
case FAILURE:
status.append( "Failure: " );
break;
}
status.append( ": " );
status.append( testName );
statusText.setText( new String( status ) );
testCounterText.setText( "Tests: "+testCounter );
errorCounterText.setText( "Errors: "+errorCounter );
failureCounterText.setText( "Failure: "+failureCounter );
}
}
class TestRunner implements Runnable,TestListener {
static final String LOG_TAG = "TestRunner";
int testCounter;
int errorCounter;
int failureCounter;
TextView statusText;
TextView testCounterText;
TextView errorCounterText;
TextView failureCounterText;
Activity parentActivity;
public TestRunner( Activity parentActivity ) {
this.parentActivity = parentActivity;
}
public void run() {
testCounter = 0;
errorCounter = 0;
failureCounter = 0;
statusText = (TextView)parentActivity.
findViewById( R.id.status );
testCounterText = (TextView)parentActivity.
findViewById( R.id.testCounter );
errorCounterText = (TextView)parentActivity.
findViewById( R.id.errorCounter );
failureCounterText = (TextView)parentActivity.
findViewById( R.id.failureCounter );
Log.d( LOG_TAG, "Test started" );
AndroidTestRunner testRunner = new AndroidTestRunner();
testRunner.setTest( new ExampleSuite() );
testRunner.addTestListener( this );
testRunner.setContext( parentActivity );
testRunner.runTest();
Log.d( LOG_TAG, "Test ended" );
}
// TestListener
public void addError(Test test, Throwable t) {
Log.d( LOG_TAG, "addError: "+test.getClass().getName() );
Log.d( LOG_TAG, t.getMessage(), t );
++errorCounter;
TestDisplay td = new TestDisplay(
TestDisplay.displayEvent.ERROR,
test.getClass().getName(),
testCounter,
errorCounter,
failureCounter,
statusText,
testCounterText,
errorCounterText,
failureCounterText );
parentActivity.runOnUiThread( td );
}
public void endTest(Test test) {
Log.d( LOG_TAG, "endTest: "+test.getClass().getName() );
TestDisplay td = new TestDisplay(
TestDisplay.displayEvent.END_TEST,
test.getClass().getName(),
testCounter,
errorCounter,
failureCounter,
statusText,
testCounterText,
errorCounterText,
failureCounterText );
parentActivity.runOnUiThread( td );
}
public void startTest(Test test) {
Log.d( LOG_TAG, "startTest: "+test.getClass().getName() );
++testCounter;
TestDisplay td = new TestDisplay(
TestDisplay.displayEvent.START_TEST,
test.getClass().getName(),
testCounter,
errorCounter,
failureCounter,
statusText,
testCounterText,
errorCounterText,
failureCounterText );
parentActivity.runOnUiThread( td );
}
@Override
public void addFailure(Test test, junit.framework.AssertionFailedError t) {
// TODO Auto-generated method stub
Log.d( LOG_TAG, "addFailure: "+test.getClass().getName() );
Log.d( LOG_TAG, t.getMessage(), t );
++failureCounter;
TestDisplay td = new TestDisplay(
TestDisplay.displayEvent.FAILURE,
test.getClass().getName(),
testCounter,
errorCounter,
failureCounter,
statusText,
testCounterText,
errorCounterText,
failureCounterText );
parentActivity.runOnUiThread( td );
}
}
4.
最后是xml文件<!--[endif]-->
Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ut.prac"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<uses-library android:name="android.test.runner" />
<activity android:name=".MyJUnitExample"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
Mail.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<Button android:id="@+id/launch_button" android:text="@string/launch_test" android:layout_width="wrap_content" android:layout_height="wrap_content" />
<TextView android:id="@+id/status" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" />
<TextView android:id="@+id/testCounter" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" />
<TextView android:id="@+id/errorCounter" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" />
<TextView android:id="@+id/failureCounter" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" />
</LinearLayout>
最后编译,执行。。。
分享到:
相关推荐
这些测试类运行在Android设备或模拟器上,通过Instrumentation进程来控制目标应用,从而能够进行实际的设备交互,例如触摸屏幕、接收广播等。 在`AndroidTestCase`中,你可以使用`setUp()`和`tearDown()`方法来准备...
下面我们将通过一个具体的例子来详细了解如何利用`AndroidTestCase`来进行单元测试。 ##### 1. 数据库辅助类`DatabaseHelper` ```java import android.content.Context; import android.database.sqlite....
"androidtestcase"是一个专门针对Android应用的测试用例集合,旨在帮助开发者进行有效的功能验证和错误排查。在这个小例子程序中,我们可以学习到如何构建和执行Android的单元测试以及UI测试。 首先,Android测试...
2. **创建测试类**:在要进行单元测试的方法上右键点击`NEW -> JUnit Test Case`,然后根据提示选择合适的测试超类(通常是`android.test.AndroidTestCase`或`android.test.InstrumentationTestCase`),并选择要...
标题和描述均提到了"CMDN CLUB # 17期:Android开发的单元测试",这一主题聚焦于Android开发中的单元测试实践。单元测试是一种软件工程中的自动化测试方法,其目的是验证软件模块(通常是单一功能)是否按照预期工作...
在Android开发中,进行应用程序测试是非常重要的...通过以上步骤,你可以在Android项目中有效地使用`AndroidTestCase`进行单元测试,确保代码质量并快速定位问题。记得根据实际情况调整测试代码,以适应你的应用需求。
本章节将详细介绍Android测试的基础知识,包括不同类型的测试以及如何利用JUnit进行单元测试。 #### 二、常见测试分类 在Android开发过程中,测试可以根据不同的标准进行分类: ##### 1. 根据是否知道源程序源码...
Junit 提供了测试驱动和测试用例的功能,开发者可以通过引入“android.test.ActivityInstrumentationTestCase2”包来使用这些功能。 Junit 的测试用例原型有很多,例如“android.test.AndroidTestCase”。开发者...
单元测试是对软件中的最小可测试单元进行检查和验证,对于移动应用来说,这个单元可能是单个的函数、方法或者是一个组件。在Android中,我们可以使用JUnit框架来编写单元测试,它是Java领域最广泛使用的单元测试库。...
`JUnit`是Java领域广泛使用的单元测试框架,而在Android环境中,我们需要结合特定的Android测试类来对应用程序进行测试,其中之一就是`ActivityUnitTestCase`。本篇文章将深入探讨如何使用`JUnit`和`...
在Android项目中,我们可以利用Android Studio内置的JUnit支持来进行单元测试。首先,我们需要在`build.gradle`文件中添加测试相关的依赖,例如: ```groovy android { testImplementation 'junit:junit:4.12' ...
在Android中,通常使用JUnit框架进行单元测试,但需要扩展`AndroidTestCase`类来利用Android的测试环境。创建一个名为`PersonServiceTest`的测试类,继承自`AndroidTestCase`。在这个类中,我们可以为`PersonService...
总结来说,Android测试框架是一个强大且灵活的工具,支持多种测试类型,包括单元测试和组件测试。通过JUnit、Instrumentation和Mock对象,开发者可以深入测试应用的每个角落,确保其在各种场景下的表现。同时,...
总的来说,Android的测试基本原理涉及从单元测试到端到端测试的全面覆盖,利用JUnit和Android特定的测试类,结合Instrumentation和模拟对象,确保应用程序在各个层面的正确性。通过合理的项目结构、API扩展以及各种...