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

实践中的重构17_表驱动法

阅读更多
代码以及初始的单元测试见
http://zhang-xzhi-xjtu.iteye.com/blog/875986
由于测试的数量比较多,而且结构相似,因此,才用表驱动法也是一个不错的选择。

/**
 * 表驱动法。
 * */
public class TestUserQueryService2 {
	/**
	 * 每一个字符串代表一个测试数据。
	 * 
	 * <pre>
	 * 格式为
	 * 历史库生产库时间分隔点,历史库大小,生产库大小,查询的起始时间,查询的结束时间,
	 * 查询的页大小,查询的页码,查询结果的总项数,查询结果历史库的总项数,查询结果历史库的起始点,
	 * 查询结果生产库的总项数,查询结果生产库的起始点
	 * </pre>
	 * */
	private static List<String> testData;

	/**
	 * 初始化测试数据。
	 * */
	static {

		testData = new ArrayList<String>();

		// 只查历史库,满页
		testData.add("19820110,40,20,19820101,19820107,10,1,10,10,1,0,0");
		// 只查历史库,不满页
		testData.add("19820110,43,20,19820101,19820107,10,5,3,3,41,0,0");

		// 只查生产库,满页
		testData.add("19810804,40,20,19820101,19820107,10,2,10,0,0,10,11");
		// 只查生产库,不满页
		testData.add("19810801,43,23,19820101,19820107,10,3,3,0,0,3,21");

		// 跨库,满页
		testData.add("19820103,43,20,19820101,19820107,10,5,10,3,41,7,1");
		// 跨库,不满页
		testData.add("19820103,43,4,19820101,19820107,10,5,7,3,41,4,1");

		// 只查生产库,对齐满页
		testData.add("19820103,40,60,19820101,19820107,10,6,10,0,0,10,11");
		// 只查生产库,对齐不满页
		testData.add("19820103,40,17,19820101,19820107,10,6,7,0,0,7,11");

		// 只查生产库,不对齐满页
		testData.add("19820103,43,40,19820101,19820107,10,6,10,0,0,10,8");
		// 只查生产库,不对齐不满页
		testData.add("19820103,43,20,19820101,19820107,10,7,3,0,0,3,18");
	}

	/**
	 * 解析"yyyyMMdd"形式的字符串为日期。
	 * */
	private static Date parseDate(String dateStr) {
		Date date = null;
		try {
			DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
			date = dateFormat.parse(dateStr);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return date;
	}

	private UserQueryService queryService;
	private MockUserQueryManager mockUserQueryManager;

	/**
	 * 初始化测试环境。
	 * */
	private void setUpEnv(String hisDate, int hisSize, int prodSize) {
		queryService = new UserQueryService();
		mockUserQueryManager = new MockUserQueryManager(parseDate(hisDate),
				hisSize, prodSize);
		queryService.setManager(mockUserQueryManager);
	}

	/**
	 * 验证返回的结果。
	 * 
	 * @param userList
	 *            用户列表。
	 * @param size
	 *            总用户个数。
	 * @param hisSize
	 *            历史库返回的用户个数。
	 * @param hisFrom
	 *            历史库返回用户的起始index。
	 * @param prodSize
	 *            生产库返回的用户个数。
	 * @param prodFrom
	 *            生产库返回的用户起始index。
	 * 
	 * */
	public void assertUserList(List<User> userList, int size, int hisSize,
			int hisFrom, int prodSize, int prodFrom) {

		Assert.assertNotNull(userList);
		Assert.assertEquals(size, hisSize + prodSize);

		Assert.assertEquals(size, userList.size());

		for (int i = 0; i < hisSize; i++) {
			User user = userList.get(i);
			Assert.assertEquals("his_" + (hisFrom + i), user.getName());
		}

		for (int i = 0; i < prodSize; i++) {
			User user = userList.get(hisSize + i);
			Assert.assertEquals("prod_" + (prodFrom + i), user.getName());
		}
	}

	@Test
	public void testQuery() {
		for (String data : testData) {

			String[] parts = data.split(",");

			String hisDate = parts[0];
			int hisSize = Integer.valueOf(parts[1]);
			int prodSize = Integer.valueOf(parts[2]);
			setUpEnv(hisDate, hisSize, prodSize);

			String start = parts[3];
			String end = parts[4];
			int pageSize = Integer.valueOf(parts[5]);
			int pageNum = Integer.valueOf(parts[6]);
			List<User> userList = queryService.findUsers(parseDate(start),
					parseDate(end), pageSize, pageNum);

			int resultSize = Integer.valueOf(parts[7]);
			int resultHisSize = Integer.valueOf(parts[8]);
			int resultHisFrom = Integer.valueOf(parts[9]);
			int resultProdSize = Integer.valueOf(parts[10]);
			int resultProdFrom = Integer.valueOf(parts[11]);
			assertUserList(userList, resultSize, resultHisSize, resultHisFrom,
					resultProdSize, resultProdFrom);
		}
	}

}
分享到:
评论
1 楼 抛出异常的爱 2011-02-22  
DataMap dm = new DataMap("hissize=23","porsize=44"......);
自己实现一个DataMap放在测试的工具箱里很有用.

相关推荐

    重构_重构_改善既有代码_

    《重构:改善既有代码设计》是一本由Martin Fowler所著的经典IT著作,它详细阐述了在软件开发过程中如何通过重构来提升代码质量、可读性和维护性。重构是一种系统性的方法,旨在不改变软件外在行为的前提下,改进其...

    重构pdf_chonggou

    在实践中,重构往往需要配合单元测试进行,确保每次修改都不会破坏现有的功能。通过TDD(Test-Driven Development,测试驱动开发)的方式,可以先编写测试,然后进行重构,最后确保所有测试都能通过,从而保证重构的...

    java并发重构ppt_转温 少

    【描述】提到的链接指向了一篇博客文章,尽管具体内容未提供,但我们可以推测这篇文章可能分享了作者对于Java并发重构的理解和实践经验,可能包括如何识别和改进并发代码中的问题,以及如何利用Java提供的并发工具和...

    重构_改善既有代码的设计 Java

    《重构:改善既有代码的设计》是一本在IT领域广受推崇的经典著作,专注于软件开发中的重构实践,尤其针对Java编程语言。重构是软件开发过程中的一个重要环节,它旨在提升代码的可读性、可维护性和整体质量,而不会...

    重构极限编程_XP的实践与反思(PDF).rar

    在实践中,XP强调结对编程,即两个开发者共享一个工作台,共同编写代码。这种方式可以提高代码质量,减少错误,同时促进知识共享和团队协作。此外,测试驱动开发(TDD)是XP的关键实践之一,要求开发者先写测试用例...

    AN1078_svpwm_foc_AN1078_电机驱动_无感_

    标题中的"AN1078_svpwm_foc_AN1078_电机驱动_无感_"揭示了本文档集合的核心主题,主要涉及的是AN1078芯片在无感电机驱动中的应用,特别是使用空间电压矢量脉宽调制(SVPWM)和磁场定向控制(FOC)技术。这是一套适用...

    重构_改善既有代码的设计.pdf

    《重构:改善既有代码的设计》是一本由Martin Fowler所著的经典IT著作,它深入探讨...无论你是初级开发者还是经验丰富的专业人士,这本书都将为你提供宝贵的指导,帮助你在实践中提升代码质量,实现软件的可持续发展。

    测试驱动开发及代码重构

    在文件名“测试驱动开发及代码重构”中,可能包含了关于TDD实践的案例分析、具体步骤、最佳实践以及如何在实际项目中实施TDD和代码重构的指导。这样的资源对于学习和理解TDD方法论及其在软件开发中的应用非常有价值...

    重构极限编程XP的实践与反思

    书中详细阐述了重构的重要性,指出在XP实践中,通过不断重构代码,可以保持设计的清晰度,减少bug的出现,同时提升团队的生产力。重构技术包括提取函数、移动函数、提取类等,这些技术能够帮助开发者更好地理解和...

    领域驱动设计与模式实践.pdf

    领域驱动设计(DDD)的中心内容是如何将业务领域概念映射到软件工件中。大部分关于此主题的著作和文章都以Eric Evans的书《领域驱动设计》为基础,主要从概念和设计的角度探讨领域建模和设计情况。这些著作讨论实体...

    重构_改善既有代码的设计(中文版)

    TDD(测试驱动开发)和ATDD(验收测试驱动开发)是重构实践中常见的方法,它们提倡先写测试,再编写满足测试的代码,以此确保重构的安全性。 《重构:改善既有代码的设计》不仅提供了大量重构模式和实践案例,还...

Global site tag (gtag.js) - Google Analytics