如何在 android 中做单元测试单元测试是软件开发中一项用来保证软件质量的重要技术,单元测试的好处我的不
如何在 android 中做单元测试
单元测试是软件开发中一项用来保证软件质量的重要技术,单元测试的好处我的不说了,呵呵,前段时间我写了一个个税计算器,把里面的一些业务方法都写了单元测试,因为在网上这方面的资料不多,只好啃自带的文档,里面有些东西写的比较简单,真正在做单元测试的时候还有些不够用
package com.wnmc.android.test;import android.test.ActivityInstrumentationTestCase2;import android.view.KeyEvent;import android.widget.Button;import android.widget.EditText;import android.widget.Spinner;import com.wnmc.android.Culcultor;import com.wnmc.android.R;public class CulcultorTest extends ActivityInstrumentationTestCase2<Culcultor> {private Culcultor mActivity;private EditText mTaxPayable;private EditText mTakeHomeMoney;private EditText mMoneyShouldPayTax;private EditText mTaxThreshold;private EditText mInsuranceAndPension;private EditText mIncome;private Button rest;private Button ok;private Spinner mIncomeType;public CulcultorTest() {super("com.wnmc.android.Culcultor", Culcultor.class);}@Overridepublic Culcultor getActivity() {// TODO Auto-generated method stubreturn super.getActivity();}@Overrideprotected void setUp() throws Exception {// TODO Auto-generated method stubsuper.setUp();mActivity = getActivity();mIncomeType = (Spinner) mActivity.findViewById(R.id.CategoriesOfIncome_type);mIncome = (EditText) mActivity.findViewById(R.id.income);rest = (Button) mActivity.findViewById(R.id.reset);ok = (Button) mActivity.findViewById(R.id.ok);mTaxThreshold = (EditText) mActivity.findViewById(R.id.tax_threshold);mInsuranceAndPension = (EditText) mActivity.findViewById(R.id.insurance_and_pension);mTaxPayable = (EditText) mActivity.findViewById(R.id.taxPayable);mTakeHomeMoney = (EditText) mActivity.findViewById(R.id.takehomemoney);mMoneyShouldPayTax = (EditText) mActivity.findViewById(R.id.money_should_payTax);}public void testPreconditions() {// assertTrue(resultViewStub != null);assertTrue(mIncome != null);assertTrue(mTaxThreshold != null);assertTrue(mInsuranceAndPension != null);assertTrue(mTaxPayable != null);assertTrue(mMoneyShouldPayTax != null);assertTrue(mTakeHomeMoney != null);// assertTrue(wagesAndSalariesViewStub!=null);}public void testWagesAndSalaries() {// 0~2000mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("1800");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals(0, mActivity.getType());// 2000~4000mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("2500");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("2475.0", mTakeHomeMoney.getText().toString());// 4000~7000mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("6800");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("6205.0", mTakeHomeMoney.getText().toString());// 7000~22000mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("20100");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("16855.0", mTakeHomeMoney.getText().toString());// 22000~42000mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("39000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("31125.0", mTakeHomeMoney.getText().toString());// 42000~62000mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("58000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("44575.0", mTakeHomeMoney.getText().toString());// 62000~82000mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("74000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("55175.0", mTakeHomeMoney.getText().toString());// 82000~102000mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("98000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("69975.0", mTakeHomeMoney.getText().toString());// 大于102000mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("150000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("98775.0", mTakeHomeMoney.getText().toString());}public void testSelfEmployedAndCommercial() {mActivity.runOnUiThread(new Runnable() {public void run() {mIncomeType.requestFocus();}});// 选中Spinner下拉列表的第二项this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals(1, mActivity.getType());// 不超过5000元的mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("4500");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("4275.0", mTakeHomeMoney.getText().toString());// 不超过10,000元mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("9000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("8350.0", mTakeHomeMoney.getText().toString());// 不超过30,000元mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("23000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("19650.0", mTakeHomeMoney.getText().toString());// 不超过50,000元mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("46000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("36450.0", mTakeHomeMoney.getText().toString());// 超过50,000元mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("76000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("56150.0", mTakeHomeMoney.getText().toString());}public void providingServices() {// 选中Spinner下拉列表的第四项mActivity.runOnUiThread(new Runnable() {public void run() {mIncomeType.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals(3, mActivity.getType());// 不超过20000元的mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("18000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("15120.0", mTakeHomeMoney.getText().toString());// 不超过50000元的mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("48000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("38480.0", mTakeHomeMoney.getText().toString());// 超过50000元的mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("80000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("62800.0", mTakeHomeMoney.getText().toString());}public void testAuthorRemuneration() {// 选中Spinner下拉列表的第五项mActivity.runOnUiThread(new Runnable() {public void run() {mIncomeType.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);for (int i = 0; i < 4; i++) {this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);}this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals(4, mActivity.getType());// 不超过4000元mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("3900");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("3466.0", mTakeHomeMoney.getText().toString());// 超过4000元mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("8900");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("7903.2", mTakeHomeMoney.getText().toString());}public void testRoyalites() {// 选中Spinner下拉列表的第六项mActivity.runOnUiThread(new Runnable() {public void run() {mIncomeType.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);for (int i = 0; i < 5; i++) {this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);}this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals(5, mActivity.getType());// 不超过4000元mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("3900");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("3280.0", mTakeHomeMoney.getText().toString());// 超过4000元mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("8900");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("7476.0", mTakeHomeMoney.getText().toString());}public void testInterestDividendsBonuses() {// 选中Spinner下拉列表的第七项mActivity.runOnUiThread(new Runnable() {public void run() {mIncomeType.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);for (int i = 0; i < 6; i++) {this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);}this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals(6, mActivity.getType());mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("8888");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("7110.4", mTakeHomeMoney.getText().toString());}public void testLeaseProperty() {// 选中Spinner下拉列表的第八项mActivity.runOnUiThread(new Runnable() {public void run() {mIncomeType.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);for (int i = 0; i < 7; i++) {this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);}this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals(7, mActivity.getType());// 不超过4000元mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("3400");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("2880.0", mTakeHomeMoney.getText().toString());// 超过4000元mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("6400");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("5376.0", mTakeHomeMoney.getText().toString());}public void testTransferProperty() {// 选中Spinner下拉列表的第九项mActivity.runOnUiThread(new Runnable() {public void run() {mIncomeType.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);for (int i = 0; i < 8; i++) {this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);}this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals(8, mActivity.getType());mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("50000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("40000.0", mTakeHomeMoney.getText().toString());}public void testIncidentalIncome() {// 选中Spinner下拉列表的第十项mActivity.runOnUiThread(new Runnable() {public void run() {mIncomeType.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);for (int i = 0; i < 9; i++) {this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);}this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals(9, mActivity.getType());mActivity.runOnUiThread(new Runnable() {public void run() {mIncome.setText("50000");ok.requestFocus();}});this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);assertEquals("40000.0", mTakeHomeMoney.getText().toString());}@Overrideprotected void tearDown() throws Exception {// TODO Auto-generated method stubsuper.tearDown();}}这是我为个税器写的部分单元测试代码,还在不断完善当中,要参考原项目,请自己去下载 1 楼 yugiohboy 2011-06-02 其实我一直很想知道这是什么一回事。假设我的activity1的view上有button1 button2 button1的onclick是点击会打开activity2,activity2上有个button3,假如测试时getActivity得到的是activity1,貌似直到该testcase结束这个getactivity一直都是activity1,如何测试activity2呢?button1.requestFouce(),button.performClick就会触发onClick事件,这时会跳到activity2
