因为我是测试出身,刚转来做手机开发,写了几天代码,所以这几天总是蠢蠢欲动的想写的东西,考虑都老本行,所以决定写一篇如何做Android 单元测试,下来就开始我的第一个Android的测试工程:
- 一些资源:
- Google的开发文档,不过要FQ才能看的到,不过有很多地方都可以下载到离线的包。
- 剩下的就是Android的开发环境,请参考开发文档自己配置。
- 下面先建立一个Android的工程,里面按照正常的开发过程实现一些功能, 我有一个工程里面实现的Android联系的一些操作,因为我也需要验证我的这些操作是否真正的有效,开始我是在界面上添加了一个测试按钮,将一些调用方法写在这个按钮里,每测试完一个功能就把这个按钮里面的实现删掉,再写新的代码,这样做十分不方便,也破坏了原有的软件“功能”,反正都要测试,为什么不写真正的测试代码呢?而且写测试代码也是我的老本行,下面就开始真正的测试代码:
- 新建一个Test工程:点击菜单“File->New->Project”,然后选择Android Test Project如图
然后填入测试工程的名称,选择被测试的工程,就建好测试工程了。
- 建好测试工程后,可以看到测试工程的结构的一般的开发工程是差不多的,然后在测试工程的包下面新建一个JUnit Test Case, 写好测试案例的名称
这里我们选择New JUnit 3 Test, setUp()和tearDown()也打上勾,当然你也不打勾,后面直接在测试代码里写上就是了。
- 新建立的测试类是基于TestCase类的,但是我们测试过程中要用到软件的一些“功能”,所以我们要做一点点的修改如下:
1:
2: public class TestPersonCantact extends ActivityInstrumentationTestCase2<MainActivity> {
3:
4: private Context ctx;
5:
6: public TestPersonCantact(String pkg, Class<WebShare> activityClass) {
7: super("com.android.contaxt", WebShare.class);
8: // TODO Auto-generated constructor stub
9: }
10:
11: public TestPersonCantact() {
12: super("com.android.contact", WebShare.class);
13: }
14:
15: protected void setUp() throws Exception {
16: super.setUp();
17: ctx = getActivity();
18:
19: }
20:
21: protected void tearDown() throws Exception {
22: super.tearDown();
23: }
- 这里就完成了测试案例的准备工作了,记得这两个构造函数要写对了,不然会有问题。接下来就开始写我们的测试案例了,因为是第一次用JUnit, 发现它测试案例和Python的有点像,函数名格式为testXXXX()就可以了,而在Gtest里面是用一个宏来表示的,好了写一个方法如:
- 新建一个Test工程:点击菜单“File->New->Project”,然后选择Android Test Project如图
1: public void testDeletePersonContact() throws NoIdException {
2: ContactsHelperhelper = new ContactsHelper(ctx);
3: PersonContact one = PersonContact
4: .newPersonContact("TestPersonContact@gmail.com");
5: PersonName name = PersonName.newPersonName("FirstName", "LastName",
6: null, null, null);
7: TelephoneNumber tel = TelephoneNumber.newTelephoneNumber("123123123",
8: 3, null);
9: TelephoneNumber tel2 = TelephoneNumber.newTelephoneNumber("1231231230",
10: 1, null);
11:
12: one.name = name;
13: one.addTelephoneNumber(tel);
14: one.addTelephoneNumber(tel2);
15:
16: //... Email, ...
17: try {
18: helper.add(testGuy);
19: } catch (RemoteException e) {
20: // TODO Auto-generated catch block
21: e.printStackTrace();
22: } catch (OperationApplicationException e) {
23: // TODO Auto-generated catch block
24: e.printStackTrace();
25: }
26:
27: PersonContact pc = helper.getPersonContactById(one.id);
28:
29: try {
30: helper.delete(pc);
31: } catch (RemoteException e) {
32: // TODO Auto-generated catch block
33: e.printStackTrace();
34: } catch (OperationApplicationException e) {
35: // TODO Auto-generated catch block
36: e.printStackTrace();
37: }
38:
39: PersonContact pc1 = helper.getPersonContactById(pc.id);
40: this.assertEquals("telephoneNumbers after Delete Count Is:" + pc1.telephoneNumbers.size(), pc1.telephoneNumbers.size(), 0);
41: // ...
42: }
JUnit也提供了很多assertEquals, assertTrue之类的方法,可以让我们很快的完成测试案例代码的实现,我一口气写几个看看运行效果如下:
建立大家在写代码的时候,也养成写测试代码的习惯,可以把自己写的很多零散的测试代码很好的组织、归档,别人看了你的测试代码后就知道你的接口怎么调用,根本不用你再为别人讲一次这个接口需要如何如何用?这样不是很好么^_^