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的安装,以及集成到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;
}
}
}
}
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/ .