java学习脚印:java工具早使用——Maven与Junit

java学习脚印:java工具早使用——Maven与Junit(敏捷版博客)


写在前面


              正所谓“工欲善其事,必先利其器”,当项目越来越大的时候,项目管理和测试开始变得困难,借助成熟的工具是关键。

             个人赞同,一开始创建项目或者编写代码时,就提倡内置项目管理,软件测试技术这种项目开发的思想,这是一种积极的思想,避免以后的混乱和返工。

             这里对项目管理工具Maven和JUnit作一个了解和简单运用,不做细致探讨,细节问题留待以后实际工作中学习和解决。

 


1.Maven在项目管理中的积极作用

1.1Maven能干什么

Apache Maven由Apache软件基金会所提供,一个软件(特别是Java软件)项目管理及自动构建工具。

与之前的Ant管理工具相比,有了更大的改进。它能提供以下功能:

  • Builds  编译工程的源代码,生成类文件,并提供程序打包等功能
  • Documentation  程序文档包括网站的自动生成
  • Reporting   生成报告
  • Dependencies  这是maven最大特色之一。它能较好的管理项目中包之间的依赖关系,尤其是jar包的嵌套依赖关系;同时多个项目的编译依赖也都能解决
  • SCMs
  • Releases
  • Distribution  
    关于maven的安装和初步入门教程可参见官方文档:  http://maven.apache.org/guides/getting-started/index.html 。

maven的安装,以及集成到eclipse环境可参考: 博客园   maven安装、配置及使用入门一文。




1.2 maven快速构造一个项目

可以使用终端执行mvn命令构造项目,这里利用maven-archetype-quickstart模板快速构造一个项目如下:

ubuntu终端中运行(windows中dos窗口运行命令类似):

wangdq@wangdq:~/MVN$ mvn archetype:generate -DgroupId=cn.edu.gdut  -DartifactId=MyApp -DarchetypeArifactId=maven-archetype-quickstart -DinteractiveMode=false

构造完成后,终端提示:...[INFO] BUILD SUCCESS
表示构造成功,查看文件目录,得到如下结构:

wangdq@wangdq:~/MVN$ tree MyApp/
MyApp/
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── cn
    │           └── edu
    │               └── gdut
    │                   └── App.java
    └── test
        └── java
            └── cn
                └── edu
                    └── gdut
                        └── AppTest.java

这样一个简单的java工程就构造完毕,构造完成后可通过pom.xml(maven的项目对象模型对应的配置文件)来管理项目中jar包的依赖关系,也可以用相应命令来打包应用

也可以利用集成的eclipse环境,构造maven工程,eclipse中构造项目更方便快捷。


2.Junit在测试中的积极作用

2.1 JUnit可以做什么

JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。

手工测试和自动化工具自动测试相比:

1)不由工具支持的手工测试

  • 耗时且单调:测试由人执行,速度慢,且枯燥。

  • 人力的较大支出:手动测试需要更多的测试员,投入较大

  • 可行度降低:每次执行测试不可能都那么准确,难免出错

  • 不可编制的:对于需要发现隐含问题的复杂测试用例难以编写

2)工具支持的自动测试

  • 快速自动化执行测试用例,比人工快多了

  • 自动化工具执行测试,不需要投入过多的人力了

  • 自动化测试工具每次测试的结果相同且准确,更可信

  • 测试员可编写复杂的测试用例用于发现隐含问题

可见,自动化测试确实比手工测试省时省力,且更可信。


JUnit具有以下特性:

  • 提供注释(Annotation)来标记需要测试的方法
  • 提供断言(Assertions)来判断测试结果
  • 提供suites测试,可以组合小的测试用例成为suites测试,一次执行多个测试用例
  • 提供参数化的测试,可以提供多个值的数组供测试


2.2Juint实例——关于判断直角三角形程序的测试

这里假设需要编写一个程序,判断输入的三个整数是否能构成直角三角形。

为简化问题,这里假设输入的数字都是整数,则生成直角三角形规则如下:

1)a,b.c是为都为正整数输入,若不是返回false;

2)a,b,c输入能否构成三角形,即满足基本条件:三角形两边之和大于第三边,若否则返回false;

3)a,b,c输入能否构成直角三角形,即满足:较大者的平方和等于另外两者的平方和,若否则返回false,若是则判断结束,返回true.

下面给出一个简单的示例版本,还有待改进。

清单2.2-1 RightTriangleChecker.java  用于判断是否为直角三角形的类

package com.learningjava;

import java.util.Arrays;
import java.util.Collections;
/**
 * check whether the input values can construct a right trangle
 * @author wangdq
 * 2014-3-2
 */
public class RightTriangleChecker {
	
	public static Boolean isRightTrangle(Integer [] edges) {
		if(edges.length != 3) {
			return false;
		} else if(edges[0] <= 0 || edges[1] <= 0 || edges[2] <= 0) {
			return false;
		}else if(edges[0]+edges[1] <= edges[2] || 
				edges[0]+edges[2] <= edges[1] || 
				edges[1]+edges[2] <= edges[0]){
			return false;
		}else {
			Collections.sort(Arrays.asList(edges));
			if(edges[0]*edges[0] + edges[1]*edges[1] 
					!= edges[2]*edges[2]) {
				return false;
			}else {
				return true;
			}
		}
	}
}

清单2.2-2 RightTriangleCheckerTest.java  测试 RightTriangleChecker类

package com.learningjava;

import static org.junit.Assert.assertEquals;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
/**
 * use more data to test the RightTriangleChecker
 * @author wangdq
 */
@RunWith(Parameterized.class)
public class RightTriangleCheckerTest {
	
	private Integer[] edges;
	private Boolean expectedResult;
	
	public RightTriangleCheckerTest(Integer[] edges,Boolean expectedResult) {
		this.edges = edges;
		this.expectedResult = expectedResult;
	}
	@Parameterized.Parameters
	public static Collection<?> prepareTestData() {
	return Arrays.asList(new Object[][] {
		{new Integer[]{-1,6,4}, false },
		{new Integer[]{5,0,4}, false },
		{new Integer[]{5}, false },
		{new Integer[]{2,4}, false },
		{new Integer[]{2,8,12,5}, false },
		{new Integer[]{3,4,7}, false },
		{new Integer[]{3,5,9}, false },
		{new Integer[]{3,3,3}, false },
		{new Integer[]{3,4,5}, true }
		});
	}
	// This test will run 9 times since we have 9 parameters defined 
	@Test
	public void testRightTrangleChecker() {
		System.out.print("input edges are: ");
		System.out.println(Arrays.asList(edges));
		assertEquals(expectedResult, RightTriangleChecker.isRightTrangle(edges));
	}
}


 
  

清单2.2-2 TestRunner.java  运行测试类的测试用例

package com.learningjava;


import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
/**
 * run unit test
 * @author wangdq
 */
public class TestRunner {
	public static void main(String[] args) {
		Result result = JUnitCore.runClasses(RightTriangleCheckerTest.class);
		for (Failure failure : result.getFailures()) {
			System.out.println(failure.toString());
		}
		System.out.println(result.wasSuccessful());
	}
}

运行结果:

input edges are: [-1, 6, 4]
input edges are: [5, 0, 4]
input edges are: [5]
input edges are: [2, 4]
input edges are: [2, 8, 12, 5]
input edges are: [3, 4, 7]
input edges are: [3, 5, 9]
input edges are: [3, 3, 3]
input edges are: [3, 4, 5]
true


关于maven的更多内容,可参考:http://www.tutorialspoint.com/maven/.

关于Junit的更多内容,可参考: http://www.tutorialspoint.com/junit/ .



你可能感兴趣的:(java学习脚印:java工具早使用——Maven与Junit)