写在前面
正所谓“工欲善其事,必先利其器”,当项目越来越大的时候,项目管理和测试开始变得困难,借助成熟的工具是关键。
个人赞同,一开始创建项目或者编写代码时,就提倡内置项目管理,软件测试技术这种项目开发的思想,这是一种积极的思想,避免以后的混乱和返工。
这里对项目管理工具Maven和JUnit作一个了解和简单运用,不做细致探讨,细节问题留待以后实际工作中学习和解决。
Apache Maven由Apache软件基金会所提供,一个软件(特别是Java软件)项目管理及自动构建工具。
与之前的Ant管理工具相比,有了更大的改进。它能提供以下功能:
maven的安装,以及集成到eclipse环境可参考: 博客园 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中构造项目更方便快捷。
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
手工测试和自动化工具自动测试相比:
1)不由工具支持的手工测试
耗时且单调:测试由人执行,速度慢,且枯燥。
人力的较大支出:手动测试需要更多的测试员,投入较大
可行度降低:每次执行测试不可能都那么准确,难免出错
不可编制的:对于需要发现隐含问题的复杂测试用例难以编写
2)工具支持的自动测试
快速自动化执行测试用例,比人工快多了
自动化工具执行测试,不需要投入过多的人力了
自动化测试工具每次测试的结果相同且准确,更可信
测试员可编写复杂的测试用例用于发现隐含问题
JUnit具有以下特性:
这里假设需要编写一个程序,判断输入的三个整数是否能构成直角三角形。
为简化问题,这里假设输入的数字都是整数,则生成直角三角形规则如下:
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/ .