`
qnlpkuge
  • 浏览: 44880 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

android 使用分层架构企业应用(一)

阅读更多
背景:在用android开发企业应用的时候,发现按照传统的模式开发的代码结构比较差,业务逻辑处理与Activity是放在一起处理的,结构不清晰,类与类之间的耦合度较高,类的功能复杂,导致单元测试也很难开展;所以就有办法保证这个版本的稳定性,于是我跟我的团队都没有信心。因为我压根不知道程序什么时候会无缘无故报出一个bug,我总结一下原因是对过程缺乏必要的跟踪,导致业务行为模糊。我需要用敏捷管理的思想解决这些问题,所以我就开始重构了。

重构的目标:
  • 采用分层架构思想将类解耦,使类遵循单一职责原则。
  • 加入单元测试以保证过程跟踪。
  • 加入自动化构建工具并集成代码检查工具。
  • 加入持续集成输入单元测试结果及代码覆盖率。


具体实现:
将业务逻辑处理单独分离出来,并与Context分离,使其成为与android无关的可独立运行的类如:
SessionManagerService.java

public interface SessionManagerService {
	// 用户登录
	public String login(User user)throws RequestError;
}



就这么一个接口它的职责非常单一,就提供一个登录操作的方法。
关于这个接口的实现类代码就不贴了,实现了这个接口后就可以用单元测试对这个方法进行验证。
SessionManagerServiceTest.java

public class SessionManagerServiceTest extends AndroidTestCase {

	private SessionManagerService sms;

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		sms = new SessionManagerServiceImpl();
	}

	/**
	 * 测试登录成功
	 * 
	 * @throws Exception
	 */
	@LargeTest
	public void testLoginSuccess() throws Exception {
		User user = new User();
		user.setUserName("qnlpkuge");
		user.setPassword("111111");
		String result = sms.login(user);
		assertEquals("true", result);

	}

	/**
	 * 测试用户名不存在
	 * 
	 * @throws Exception
	 */
	@LargeTest
	public void testUserNotExist() throws Exception {
		User user = new User();
		user.setUserName("qnlpkugedfswe");
		user.setPassword("111111sdf");
		String result = sms.login(user);
		assertTrue(!"true".equals(result));
		assertTrue(result.contains("用户名或密码错误"));
	}

	/**
	 * 测试密码错误
	 * 
	 * @throws Exception
	 */
	@LargeTest
	public void testPasswordError() throws Exception {
		User user = new User();
		user.setUserName("qnlpkuge");
		user.setPassword("111111sdfa");
		String result = sms.login(user);
		assertTrue(!"true".equals(result));
		assertTrue(result.contains("密码错误"));
	}
         /**
	 * 异常测试
	 */
	public void testValidate() {
		try {
			User user = new User();
			user.setUserName("qnlpkuge");
			sms.login(user);
			fail("Should raise an RequestError");
		} catch (RequestError e) {
			assertEquals("用户名或密码不能为空!",e.getError());
			assertTrue(true);
		}
	}
}



由于android的单元测试只支持JUnit3,所以没有发使用起来没有注解那么方便,异常测试也显得麻烦。
单元测试通过之后就可以在Activity里面直接调用这个接口,让Activity的职责只需处理数据的显示上,当然还有针对Activity的单元测试。对业务逻辑层的测试属于功能集成测试,对Activity的测试属于界面测试,所以它们的测试方法会有很大区别。我在这里使用了第三方框架robotium,

LoginActivityTest.java

public class LoginActivityTest extends
		ActivityInstrumentationTestCase2<LoginActivity> {

	private Solo solo;

	public LoginActivityTest() {
		super("com.goosun.view", LoginActivity.class);
	}

	public void setUp() throws Exception {
		solo = new Solo(getInstrumentation(), getActivity());
	}

	public void testLogin() throws Exception {
		solo.clearEditText(0);
		solo.enterText(0, "admin");
		solo.clearEditText(1);
		solo.enterText(1, "admin");
		getActivity().runOnUiThread(new Runnable() {
			@Override
			public void run() {
				ImageButton btn = (ImageButton) getActivity().findViewById(
						com.tianque.seed.R.id.login_option);
				btn.requestFocus();
			}
		});
		solo.clickOnImageButton(0);
		Activity f = getInstrumentation().waitForMonitorWithTimeout(
		 getInstrumentation().addMonitor(MainGrid.class.getName(), null,
		 false), 9);
		 assertNotNull(f);
		assertEquals(getActivity().getString(R.string.main_grid), solo
				.getCurrentActivity().getTitle().toString());
		Assert.assertTrue(solo.searchText("泡妞管理系统"));
	}

	@Override
	public void tearDown() throws Exception {
		getActivity().finish();
	}

}


总体的思路就是这样,其他没有涉及太多android太多知识,只是构建一个高质量产品的开发方法学。
后续将继续讲在android开发中使用ant与持续集成。
分享到:
评论

相关推荐

    大话企业级Android应用开发实战[王家林][程序源代码]

    1. **Android系统架构**:了解Android系统的分层结构,包括Linux内核、硬件抽象层、系统库、应用程序框架以及应用程序层,掌握各层之间的交互机制。 2. **Android开发环境搭建**:学习如何安装和配置Android Studio...

    企业级Android开发全套教程.zip

    《企业级Android开发全套教程》是一份针对专业开发者和学习者设计的综合教程,旨在提供全方位、实战化的Android应用开发知识。本教程深入浅出地介绍了Android开发的各个环节,结合真实的企业项目案例,帮助读者从...

    Google Android SDK开发范例大全(完整版)

    Android 是一个分层的环境,构建在 Linux 内核的基础上,它包括丰富的功能。UI 子系统包括: •窗口 •视图 •用于显示一些常见组件(例如编辑框、列表和下拉列表)的小部件 Android 包括一个构建在 WebKit 基础上...

    基于实战模式的Android课程教学模式研究.pdf

    Android系统采用分层架构,包括应用程序层、应用程序框架层、系统运行库层以及Linux核心层。应用程序层提供了核心应用,如电话、短信等;应用程序框架层则提供了组件重用和基本管理功能;系统运行库包含了各种函数库...

    android工程红色感叹号.pptx

    Android系统构架是安卓系统的体系结构,采用了分层的架构,共分为四层,从高到低分别是Android应用层、Android应用框架层、Android系统运行库层和Linux内核层。 四、Android软件开发 Android软件开发是Google于...

    Android概述与学习指南

    Android平台采用了分层架构,主要包括: - **应用层**:采用Java/Kotlin编写的应用程序和服务。 - **应用框架层**:为应用程序提供高级服务。 - **库层**:包含C/C++编写的系统库。 - **Linux内核层**:负责设备...

    A first look at Google Android

    ### 关于Google Android的初步了解 ...总之,Android不仅是一款功能强大、应用广泛的移动操作系统,也是推动整个移动互联网行业发展的重要力量。随着技术的进步和市场需求的变化,Android未来的发展空间仍然非常广阔。

    Android应用源码某国企安卓办公OA项目

    在移动办公领域,Android OA(Office Automation)应用已经成为企业提升效率的重要工具。本项目是某国企基于Android平台开发的安卓办公自动化系统源码,提供了丰富的功能,适用于学习和研究。在本文中,我们将深入...

    计算机科学与技术_基于Android的微企业人才管理系统的设计与实现.docx

    这种分层架构有助于保持代码的清晰度和可维护性。 2. **前端设计**:前端主要基于Android平台进行开发,使用XML布局文件和Java代码实现界面交互。此外,还采用了Material Design设计风格,确保用户界面友好且易于...

    Android嵌入式系统程序开发(基于Cortex-A8)

    1. **Android系统架构**:理解Android的分层结构,包括Linux内核、HAL(硬件抽象层)、系统库、应用程序框架以及应用程序本身。了解这些层次之间的交互关系对于在嵌入式设备上进行开发至关重要。 2. **Cortex-A8...

    Android系统外文翻译.docx

    Android的出现打破了这一局面,它为手机开发者提供了一个开放的平台,允许他们使用Java等高级语言编写应用,并通过丰富的API(应用程序接口)与操作系统和硬件进行交互。Android SDK(软件开发工具包)提供了全面的...

    Android最新开发教材

    - **架构**:Android系统采用分层结构,主要包括应用程序层、应用程序框架层、核心库层、Linux内核层等四个主要部分。 - **应用程序层**:包含一系列预装的应用程序,如电话簿、短信工具等。 - **应用程序框架...

    Java企业级应用开发5作业1

    综上所述,Java企业级应用开发中,结合JDBC和Servlet可以构建一个功能完善的员工管理系统,而Android客户端则提供了友好的用户界面。通过合理的分层架构和设计模式,可以确保代码的可读性和可扩展性,满足实际项目...

    android经典面试题大全

    - 深入理解Android的分层架构,包括Linux内核、系统库、运行时环境、应用程序框架和应用程序。 - 讨论Dalvik与ART的区别,以及它们在性能上的优劣。 2. **Activity生命周期**: - 描述各个状态(如启动、暂停、...

    QT210Android2.3手册.pdf

    - **Android架构**:Android系统基于Linux内核构建,具有分层结构,包括Linux Kernel、Android Runtime、Libraries、Application Framework和Applications等组成部分。 **1-3 支持的驱动** - **硬件驱动支持**:...

Global site tag (gtag.js) - Google Analytics