(原文)http://www.blogjava.net/BlueDavy/archive/2006/01/22/28976.html
既然测试是好的,那就把它发挥到极限。
测试是好的,这一点无可厚非,几乎做软件的人都是认可的,本篇只是谈谈测试中的单元测试部分,单元测试的目的是为了保证类中的方法是符合设计时的需求的,需求驱动似的类实现,^_^
单元测试的好处
1、保证类对于设计以及需求的符合
在没有单元测试的情况下,其实是很难保证类对于设计以及需求的符合的,很多情况往往会因为开发人员本身的因素将实现代码复杂化,并且编写出很多设计和需求根本不需要的东西。
2、降低调试的复杂性
想想在没有单元测试的情况下,调试通常是集成时才做的,这个时候要通过慢慢的跟踪来查找问题的原因,而在web系统中就更痛苦了,总是要重启,如果不想那么痛苦,就采用单元测试吧。
3、减少集成时出错的机率
单元测试可保证暴露给外部的API的正确性,减少要通过集成才发现错误的现象。
4、保证重构和简单设计的可行
想想,如果没有单元测试,怎么敢对代码做重构呢,如果没有单元测试,简单设计很难通过重构去演变成为将来更好的设计。
单元测试的实现
单元测试的实现采取的方法通常是xUnit,在Java界就是junit了,最重要的仍然不是工具,而是怎么去实现单元测试的方法,测试驱动开发无疑是最佳的编写测试的方法,首先根据设计或需求编写测试,根据测试编写代码,直到测试通过为止。
在代码出现bug时,一定要先把出现bug的情况补充到测试中去,接下来仍然是修改实现代码,直到测试通过。
单元测试编写的原则其实很简单,就是测试一定情况下类的执行是否符合预期。
还是举例来说:
假设需要编写一个根据用户名和密码验证用户的服务,按照TDD我们首先编写单元测试类,我们应该怎么来编写这个单元测试类呢,一般可按照一个这样的步骤:
1、分析类的输入。
这点通常是分析类依赖外部什么类,需要在测试类中提前注入。
以上面的服务来说,通常需要依赖的是用户的Dao类。
2、分析方法的输入造成的输出的影响。
这点通常是分析方法输入的参数对执行结果造成的影响。
以上面的服务来说,输入的参数为用户名和密码,这个时候会有几种情况会出现:
2.1 用户名或密码为null
在这种情况下,假设期待的输出为false
2.2 用户名和密码都为null
在这种情况下,假设期待的输出为false
2.3 输入的用户名和密码在系统中存在
在这种情况下,假设期待的输出为true
2.4 用户名或密码其中一项输入不正确,验证不通过
在这种情况下,假设期待的抛出AuthronizedException
在经过这样的分析后,就可以开始编写测试类了,编写的测试类如下(示例代码而已):
public class UserServiceTest extends TestCase {
private UserDao dao=null;
private UserService service=null;
private User user=null;
public static void main(String[] args) {
junit.textui.TestRunner.run(UserServiceTest.class);
}
protected void setUp() throws Exception {
super.setUp();
dao=new UserDaoImpl();
user=new User();
user.setName("TEST_BLUEDAVY");
user.setPass("JERRY");
dao.save(user);
service=new UserServiceImpl();
service.setDao(dao);
}
protected void tearDown() throws Exception {
super.tearDown();
dao.delete(user);
}
public void testWhenNameAndPassAreNull(){
assertEquals(false,service.login(user.getName(),user.getPass()));
}
public void testWhenNameOrPassIsNull(){
assertEquals(false,service.login(user.getName(),user.getPass()));
}
public void testWhenNameAndPassAreCorrect(){
assertEquals(true,service.login(user.getName(),user.getPass()));
}
public void testWhenNameOrPassIsError(){
try{
service.login(user.getName(),user.getPass());
}
catch(Exception e){
assertEquals(AuthronizedException.class,e.getClass());
}
}
}
在编写完测试类后就可以开始编写实现代码了,实现代码在编写的时候很简单,只要能够保证测试通过就完事,在测试通过后可以开始考虑重构的事,重构仍然只要保证测试通过即可,其实这个时候就可以看到,简单设计就变得可行了,因为可以通过重构来提升设计。
如果将来这段代码出现bug,就把bug中的输入情况也编写为一个测试方法进行测试,开始运行就应该和bug一样出现问题,这时只需去修正实现代码,直到测试通过为止,那么bug也就自然被修正了。
简单的单元测试的编写较为简单,复杂的单元测试则可能需要使用Mock来模拟一些环境,Mock方面的工具有很多,大家可以去参考相关的开源工具的网站。
经验总结
对
于单元测试通常很多人都有疑问,执行起来的时候经常是不够彻底,特别是在项目时间紧张的情况下,总是觉得编写测试是一种耽误时间的事,其实编写单元测试会
为你节省非常多的时间,想想我们大部分的项目都是在集成、修改bug和维护上消耗了大量的时间,既然单元测试这么好,那么我们就实现单元测试吧。
在单元测试中最重要的注意点就是不要依赖于正常的运行数据,所有的数据都要通过代码模拟出来,在测试完毕后清除,避免造成测试对于运行数据的依赖,同时也避免测试数据对于实际运行系统的影响。
分享到:
相关推荐
### 软件测试系列之单元测试 #### 单元测试概述 单元测试是软件测试的一个重要组成部分,它主要关注于软件系统中的最小可测试单元(通常为一个函数或方法)的功能验证。通过编写测试用例来确保这些单元在各种输入...
【描述】"〇极限-完全版 〇极限-完全版 〇极限-完全版 〇极限-完全版 〇极限-完全版〇极限-完全版 〇极限-完全版 〇极限-完全版"尽管重复,但暗示了这个资料包是全面且深入的,可能涵盖了所有相关的方面或所有级别的...
《单元测试之道Java版》这本书,正如它的标题所示,是一部关于如何进行Java单元测试的专业指南,它结合了丰富的实例和实际经验,旨在帮助开发者掌握单元测试的技巧,并在软件开发中应用这些技巧。 这本书的读者们,...
本资源包精心汇总了五类重要的软件测试文档模版,包括单元测试计划、单元测试报告、测试方案、功能测试报告以及性能测试报告,这些都是软件测试工作中不可或缺的部分。 1. **单元测试计划**: 单元测试计划是软件...
- **单元测试**:对单个模块进行独立测试。 - **集成测试**:测试不同模块之间的接口和交互。 - **系统测试**:对整个系统进行测试,确保所有组成部分协同工作。 #### 3. 性能测试 - **负载测试**:模拟大量用户...
【单元测试】是软件开发过程中的重要环节,主要目的是确保软件的基本...总结来说,单元测试是软件质量保证的重要手段,它通过对代码的深入验证,确保每个独立组件的正确性,为后续的集成测试和系统测试奠定坚实基础。
在电子行业中,电子控制单元(Electronic Control Unit,简称ECU)是至关重要的组成部分,它用于监控和调节各种设备和系统的运行。本系统主要是针对ECU的测试和验证,确保其性能稳定、功能完善。以下是对这种电子...
HP-Socket是一款高性能、易用且稳定的网络通信框架,它主要应用于服务器端的开发,尤其在需要处理大量并发连接和高吞吐量的场景下表现出色。本话题将聚焦于HP-Socket的压力测试及其易源代码,这对于我们理解和优化...
单元测试是软件开发过程中一个重要的环节,它通过对软件中的最小可测试单元进行检查和验证来确保代码的质量。一个有效的单元测试用例设计能够帮助开发者及时发现并修复缺陷,提高软件的可靠性和稳定性。本文将围绕...
测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发方法论,它提倡先编写自动化测试用例来定义待实现的功能,然后再编写满足这些测试的代码。这种方法的核心理念是"红-绿-重构",即先写一个失败的测试...
在软件开发过程中,软件测试是不可或缺的一环,它确保产品的质量与稳定性,为用户提供可靠的服务。本面试题集锦旨在帮助求职者准备软件测试相关的面试,涵盖了广泛的测试知识领域。以下是一些关键知识点的详细说明:...
JUnit作为一种强大的单元测试框架,在Java开发中发挥着至关重要的作用。它不仅帮助开发者提前发现并解决bug,还促进了高质量代码的编写。通过与构建工具的集成,JUnit能够使测试自动化,从而提高软件开发的效率和...
### JAVA单元测试JUnit的核心知识点详解 #### 一、JUnit概览与重要性 JUnit作为一款卓越的Java单元测试框架,自问世以来便以其强大的功能和易用性深受开发者喜爱。由软件大师Erich Gamma和Kent Beck共同打造,...
测试驱动开发(TDD)是以测试作为开发过程的中心,它坚持,在编写实际代码之前,先写好基于产品代码的测试代码。开发过程的目标就是首先使测试能够通过,然后再优化设计结构。测试驱动开发式是极限编程的重要组成部分...
描述中提到了“高数下册单元测试题及答案第二套-数学一”,这意味着除了第一套题目外,还有第二套单元测试题供考生练习。这样的练习资源对于考生来说是宝贵的,因为它们可以提供多样化的题型和解题思路,有助于考生...
### Delphi单元测试工具Dunit介绍 #### 一、Dunit概述 Dunit作为Xunit家族的一员,专门针对Delphi开发环境提供了强大的单元测试能力。它遵循了极限编程(XP)理念中的Xtreme Testing原则,旨在提高软件质量和可维护...
各国和国际组织都有相应的电池安全标准,例如联合国的UN38.3,以及IEC和UL的标准,这些都是测试装置需要遵循的框架。 "行业分类-电子政务-充电电池极限性能测试装置.pdf"这份资料可能详细介绍了这些测试方法、标准...