android 测试框架是基于JUnit(www.junit.org)的,感兴趣的可以看看JUnit的源码,相信会对做unit test in android 大有帮助的。
本文只是一篇介绍JUnit如何用于android的入门文字,更多是照着网上的敲出来的,很意外的是三星的官网上居然有介绍JUnit的文章,
哈哈,所以拿过来用了。以前也没做过unit test,JUnit也是最近才接触,记录一下,边学边用吧!!
英文还OK的可以直接看原文(click me)吧!!
JUnit的基本思路:
a 创建自己的项目(已有项目直接跳过这步,从b开始)
b 创建android test project.
下面介绍步骤a,b.
a 创建自己的项目。创建普通android项目,其中main.xml代码
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/Pounds" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="Convert to Pounds" /> <EditText android:id="@+id/inputvalueK" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_toLeftOf="@id/Pounds" android:hint="No. of Kilos" /> <Button android:id="@+id/Kilos" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@id/Pounds" android:text="Convert to Kilos" /> <EditText android:id="@+id/inputvalueP" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/Pounds" android:layout_toLeftOf="@id/Kilos" android:hint="No. of Pounds" /> <TextView android:id="@+id/resultview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/Kilos" android:text="Result " /> </RelativeLayout>
该项目的相关activity ,其中Sample的代码
package com.example.samplejunit; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView;
public class Sample extends Activity implements OnClickListener { Button mckilos,mcpounds; EditText mkilos,mpounds; TextView mresult; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mresult = (TextView)findViewById(R.id.resultview); mkilos = (EditText)findViewById(R.id.inputvalueK); mpounds = (EditText)findViewById(R.id.inputvalueP); mckilos = (Button)findViewById(R.id.Kilos); mcpounds = (Button)findViewById(R.id.Pounds); mckilos.setOnClickListener(this); mcpounds.setOnClickListener(this); } @Override public void onClick(View v) { switch(v.getId()) { case R.id.Kilos: { double pounds = Double.parseDouble(mpounds.getText().toString()); double kilos = pounds*0.4535; mresult.setText(new Double(kilos).toString()); } break; case R.id.Pounds: { double kilos = Double.parseDouble(mkilos.getText().toString()); double pounds = kilos*2.2046; mresult.setText(new Double(pounds).toString()); } break; } } }
运行Sample时的截图
b 创建android test project.
大致简单的介绍下在Eclipse中创建android test project。
File → New → Other → Android test Project → Next → New Android Test Project,填写Project Name,随意
→ Select Test Target,选择被测试的项目,比如我的是Sample,→ Next 一路下去 → 创建成功。
之后创建一个Testcase 类 SampleUnit ,继承自ActivityInstrumentationTestCase2<Sample> .
接下来要重写父类的方法 setUp() tearDown() ,以及其他的一些方法
setUp() 在用例运行之前需要先初始化环境. 该方法总是先被调用。
tearDown() 用于回收资源与垃圾清理
testViews (): 确保 SampleJUnit application 能正确的开始执行。
testKilos2Pounds() 测试kilo 转pound是否正确
testPounds2Kilos() 测试pound 转 kilo是否正确
setUp() 代码 (初始化变量和测试环境)
private Sample mSample; <span style="white-space:pre"> </span>private TextView mTextView; <span style="white-space:pre"> </span>private Button mckilo,mcpound; <span style="white-space:pre"> </span>private EditText mkilo,mpound;
<span style="white-space:pre"> </span>@Override protected void setUp() throws Exception{ super.setUp(); mSample = this.getActivity(); mTextView = (TextView) mSample.findViewById(com.example.samplejunit.R.id.resultview); mckilo = (Button) mSample.findViewById(com.example.samplejunit.R.id.Kilos); mcpound = (Button) mSample.findViewById(com.example.samplejunit.R.id.Pounds); mkilo = (EditText) mSample.findViewById(com.example.samplejunit.R.id.inputvalueK); mpound = (EditText) mSample.findViewById(com.example.samplejunit.R.id.inputvalueP); }
tearDown() 代码
@Override protected void tearDown() throws Exception{ super.tearDown(); }
testView() 代码
@SmallTest public void testViews(){ assertNotNull(getActivity()); assertNotNull(mTextView); assertNotNull(mckilo); assertNotNull(mcpound); assertNotNull(mkilo); assertNotNull(mpound); }
关于 smallTest,MediumTest,LargeTest的解释
Small: this test doesn't interact with anyfile system or network.
Medium: Accesses file systems on box whichis running tests.
Large: Accesses external file systems,networks, etc.
@SmallTest public void testKilos2Pounds() { mkilo.clearComposingText(); //touchutils--can simulate touch event tapview--simulate touching the center of a view TouchUtils.tapView(this, mkilo); sendKeys("1"); // sending input to mKilos as 1 //click on the button TouchUtils.clickView(this, mcpound); //simulate touching the center of view and release double pounds; try { pounds = Double.parseDouble(mTextView.getText().toString()); } catch (NumberFormatException e) { // TODO: handle exception pounds = -1; } assertTrue("1 kilo is 2.20462262 pounds", pounds > 2.2 && pounds < 2.3); }
@SmallTest public void testPounds2Kilos() { mpound.clearComposingText(); TouchUtils.tapView(this, mpound); sendKeys("1"); TouchUtils.clickView(this, mckilo); double kilos; try { kilos = Double.parseDouble(mTextView.getText().toString()); } catch (NumberFormatException e) { // TODO: handle exception kilos = -1; } assertTrue("1 pound is 0.45359 kilos",kilos > 0.4 && kilos < 0.5); }
代码完成啦,该运行test project啦。
SampleUnit 右键 → Run as → Android Junit test.
ok ,JUnit 关于android的简单介绍到此为止了,还有关于JUnit android 的文章可以 click here 。
另外如需查看源码,click here