论坛首页 移动开发技术论坛

Android下的单元测试

浏览 6849 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-21  
在网络上找了半天,也没有找正确的Android的测试办法,最后还是自己琢磨出来的。以前就听我朋友说过,android毛病一堆,现在才体会到。Android SDK 和 iphone SDK 比,就不是一个档次的东西。网上总是有人说,Android还年轻,要体谅。我可不同意,要知道,android都已经出了好几个版本了,而现在最新的1.5版和iphone sdk的beta版都比不上。

先说说它的单元测试吧,基于1.5和eclipse。这里我说的是我的思路,有更加好的思路,欢迎指导。
我的方法:如果你要测试的不是Activity或者Service,就用AndroidTestCase;否则选择:ActivityUnitTestCase,ServiceTestCase。

在做单元测试以前,你需要创建一个新的项目,把要测试的项目包含到java build path中来。项目中的AndroidManifest.xml如下(这里假设你的your.test.package里面包含你的tests,your.work.package包含被测试的类):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="your.tests.package">
    <application>
        <uses-library android:name="android.test.runner" />
    </application>
    <instrumentation android:name="android.test.InstrumentationTestRunner"
                     android:targetPackage="your.work.package"
                     android:label="Tests for Api Demos."/>

</manifest>


那么就可以做测试了,给出下面的实例;
1.用AndroidTestCase;
public class SdcardTest extends AndroidTestCase {
	public void test1(){
	//	Log.v()
		File f=new File("/sdcard");
		String[] l=f.list();
		this.assertTrue(f.exists());
		this.assertTrue(f.isDirectory());
		this.assertTrue(f.list().length>0);
	}
}

2.用ActivityUnitTestCase
public class ForwardingTest extends ActivityUnitTestCase<Forwarding> {

    private Intent mStartIntent;
    private Button mButton;

    public ForwardingTest() {
        super(Forwarding.class);
      }

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        // In setUp, you can create any shared test data, or set up mock components to inject
        // into your Activity.  But do not call startActivity() until the actual test methods.
        mStartIntent = new Intent(Intent.ACTION_MAIN);
    }

    /**
     * The name 'test preconditions' is a convention to signal that if this
     * test doesn't pass, the test case was not set up properly and it might
     * explain any and all failures in other tests.  This is not guaranteed
     * to run before other tests, as junit uses reflection to find the tests.
     */
    @MediumTest
    public void testPreconditions() {
        startActivity(mStartIntent, null, null);
        mButton = (Button) getActivity().findViewById(R.id.go);
        
        assertNotNull(getActivity());
        assertNotNull(mButton);
    }
    
    /**
     * This test demonstrates examining the way that activity calls startActivity() to launch 
     * other activities.
     */
    @MediumTest
    public void testSubLaunch() {
        Forwarding activity = startActivity(mStartIntent, null, null);
        mButton = (Button) activity.findViewById(R.id.go);
        
        // This test confirms that when you click the button, the activity attempts to open
        // another activity (by calling startActivity) and close itself (by calling finish()).
        mButton.performClick();
        
        assertNotNull(getStartedActivityIntent());
        assertTrue(isFinishCalled());
    }
    
    /**
     * This test demonstrates ways to exercise the Activity's life cycle.
     */
    @MediumTest
    public void testLifeCycleCreate() {
        Forwarding activity = startActivity(mStartIntent, null, null);
        
        // At this point, onCreate() has been called, but nothing else
        // Complete the startup of the activity
        getInstrumentation().callActivityOnStart(activity);
        getInstrumentation().callActivityOnResume(activity);
        
        // At this point you could test for various configuration aspects, or you could 
        // use a Mock Context to confirm that your activity has made certain calls to the system
        // and set itself up properly.
        
        getInstrumentation().callActivityOnPause(activity);
        
        // At this point you could confirm that the activity has paused properly, as if it is
        // no longer the topmost activity on screen.
        
        getInstrumentation().callActivityOnStop(activity);
        
        // At this point, you could confirm that the activity has shut itself down appropriately,
        // or you could use a Mock Context to confirm that your activity has released any system
        // resources it should no longer be holding.

        // ActivityUnitTestCase.tearDown(), which is always automatically called, will take care
        // of calling onDestroy().
    }

}


   发表时间:2009-08-24  
ut,很有用,一直想弄,但没整出来,
email程序的测试一直没跑起来
0 请登录后投票
   发表时间:2009-08-24  
unit test 是一个让人头疼的问题 尤其这样内嵌式一样的东西 哎
0 请登录后投票
   发表时间:2009-08-24  
学习一下,虽然不是很热衷于单元测试.

顺便提一下,你如果用android这个自带工具生成项目的话,是会自动生成一个测试框架的.
0 请登录后投票
   发表时间:2009-08-25  
proper 写道
学习一下,虽然不是很热衷于单元测试.

顺便提一下,你如果用android这个自带工具生成项目的话,是会自动生成一个测试框架的.


你说的自带工具是指用android sdk吗?在eclipse以外的东西?
0 请登录后投票
   发表时间:2009-08-25  
gty509 写道
proper 写道
学习一下,虽然不是很热衷于单元测试.

顺便提一下,你如果用android这个自带工具生成项目的话,是会自动生成一个测试框架的.


你说的自带工具是指用android sdk吗?在eclipse以外的东西?


是sdk,在tools这个目录下,名字叫做android...
0 请登录后投票
   发表时间:2009-08-25  
proper 写道
gty509 写道
proper 写道
学习一下,虽然不是很热衷于单元测试.

顺便提一下,你如果用android这个自带工具生成项目的话,是会自动生成一个测试框架的.


你说的自带工具是指用android sdk吗?在eclipse以外的东西?


是sdk,在tools这个目录下,名字叫做android...


这样建立的项目,在引入到eclipse也是要分两个项目引入,主体程序一个,tests目录下面的一个。只有这样才能利用eclipse做单元测试。否则要自己写ant build.xml。

0 请登录后投票
   发表时间:2009-08-25  
看不出档次来哦
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics