软件工程第二次作业
上篇博文中写到了eclipse,它因强大的插件功能深受各个软件开发者的好评,不过根据RebelLabs今年6月的份的一份调查(《2016年Java工具和技术的调查》),Eclipse的使用比例下降至41%,已低于Intwllij IDEA的46%(这是我在一篇博文中看到的,其中原因大家可以自己查找相关资料,这里不再具体讨论),不过作为一名学生党,eclipse足够我们平时练习了,今天就已eclipse为例,介绍下如何安装配置,并进行单元测试。
-
安装配置
- 下载eclipse
俗话说要想最好的体验一款软件,就用最正宗的,使用eclipse也不例外,打开百度搜索eclipse进入官网
进入后页面如图1所示点击下载
图1
页面跳转到图2所示
图2
下载完成之后,你会得到一个.exe可执行文件,双击打开,打开后出现如图3所示页面,选择你想下载的eclipse类型进行下载
图3
之后会让你选择下载路径和是否产生快捷方式,按个人喜好选择即可,下载完成之后,就会看到eclipse的图标了。
- 下载JDK(Java 语言的软件开发工具包)
有了eclipse不过它还不能运行,因为缺少JAVA的运行环境,还需到官网下载与系统相配的JDK,继续百度搜索JDK,进入官网后,选择要下载的JDK的版本,如图4所示
图4
下载完成之后,你同样会得到一个.exe可执行文件,打开后,按照提示安装即可,需要注意的是你的安装路径,在接下来的操作中需要用到。
- 配置环境变量
什么是环境变量,大家可以参考百度百科,通俗的说就是系统所要运行某个程序时,需要寻找的程序地址等信息(我这么认为的,如有不对请指正)。配置环境变量的步骤具体如下,
右键计算机,选择属性选项,打开后页面如图5所示,点击高级属性设置。
图5
如图6所示选择环境变量
图6
在系统环境变量中找到path变量,将你的JDK安装路径下的bin文件路径拷贝粘贴的此处,如我的路径为E:\jdk\bin,效果如图7所示,你可以贴到最前,也可以贴到最后,贴到最前时别忘了在路径后加上英文的分号。
图7
点击确定即可完成环境变量的配置。
- 检测JDK配置
在dos命令窗口下输入java -version出现如图8所示结果即可表明配置正确。接下来你就可以使用eclipse了。
图8
-
单元测试
- 准备
开始测试之前,还要了解一些基本的测试方法
语句覆盖:使得程序中每个语句至少都能被执行一次。
判定覆盖:使得程序中每个判定至少为TRUE 或FALSE各一次。
条件覆盖:使得判定中的每个条件获得各种可能的结果。
判定/条件覆盖:同时满足判断覆盖和条件覆盖。
条件组合覆盖:使得每个判定中条件的各种可能组合都至少出现一次。
(摘自老师ppt)
首先写好求数组最大子序列的和的代码,如下所示
1 package demo;
2
3 import java.util.Scanner;
4
5 public class Maxsum {
6
7 public int setArry(int [] arry ) {
8 Scanner sc = new Scanner(System.in);
9 int num = sc.nextInt();
10
11 for(int i=0;i<num;i++){
12 arry[i]=sc.nextInt();
13 }
14
15 return num;
16 }
17
18 public int maxSum(int [] arry,int num){
19 int max=0,sum=0;
20
21 for(int i=0;i<num;i++){
22 sum+=arry[i];
23 if(max<sum){
24 max=sum;
25 }
26 if(sum<0){
27 sum=0;
28 }
29 }
30 return max;
31 }
32
33 public static void main(String[] args){
34 Maxsum maxsum = new Maxsum();
35 int max=0,num=0;
36 int [] arry = new int [100];
37
38 num=maxsum.setArry(arry);
39 max=maxsum.maxSum(arry,num);
40
41 System.out.println(max);
42
43 }
44
45 }
- 开始单元测试
找到要进行单元测试的Java类,鼠标移至新建,点击JUnit测试用例,如图9所示
图9
点击下一步如图10所示
图10
选择要进行的测试单元,点击完成,如图11所示
图11
接着会出现图12情况,点击确定,这样就创建好了一个测试类
图12
按图13所示,进行测试即可
图13
这里给出一个参考测试用例,代码如下
1 package p1;
2
3 import static org.junit.Assert.*;
4 import org.junit.Test;
5
6
7 public class MaxsumTest {
8
9 Maxsum maxsum = new Maxsum();
10
11 @Test
12 public void testMaxSum() {
13 int [] arry = new int[] {1,5,-5 ,6, 0, 9};
14
15 assertEquals(15, maxsum.maxSum(arry));
16 }
17
18 }
测试结果如图14所示
图14
- 单元输出结果
以下是我对之前求数组最大子序列的和代码进行单元测试的结果如表1所示
用例编号 |
用例描述 |
输入数据 |
预期输出数据 |
实际输出数据 |
通过/不通过 |
评价 |
1 |
语句覆盖 |
(1,-2,3 ,6,-9) |
9 |
9 |
通过 |
|
2 |
判定覆盖 |
(2,-4,-1,6) |
6 |
6 |
通过 |
|
3 |
条件覆盖 |
(3,-4,-2,0,3) |
3 |
3 |
通过 |
|
4 |
判定条件覆盖 |
(1,5,-5,6,0,9) |
16 |
16 |
通过 |
|
5 |
语句覆盖 |
(-1,-2,-3,-4,-5) |
-1 |
0 |
未通过 |
算法问题,未考虑全为负数的情况,算法待优化 |
表1
单元测试代码如下
1 package demo;
2
3 import static org.junit.Assert.*;
4
5 import org.junit.Test;
6
7 public class MaxsumTest {
8 Maxsum maxsum = new Maxsum();
9 @Test
10 //语句覆盖
11 public void testMaxSum() {
12 int [] arry = new int[] {1,-2,3 ,6,-9};
13 assertEquals(9, maxsum.maxSum(arry,5));
14 }
15 @Test
16 //判定覆盖
17 public void testMaxSum1() {
18 int [] arry = new int[] {2,-4,-1,6};
19 assertEquals(6, maxsum.maxSum(arry,4));
20 }
21 @Test
22 //条件覆盖
23 public void testMaxSum2() {
24 int [] arry = new int[] {3,-4,-2,3};
25 assertEquals(3, maxsum.maxSum(arry,4));
26 }
27 @Test
28 //判定条件覆盖
29 public void testMaxSum3() {
30 int [] arry = new int[] {1,5,-5 ,6, 0, 9};
31 assertEquals(16, maxsum.maxSum(arry,6));
32 }
33 @Test
34 //语句覆盖
35 public void testMaxSum4() {
36 int [] arry = new int[] {-1,-2,-3,-4,-5};
37 assertEquals(-1, maxsum.maxSum(arry,5));
38 }
39
40 }
单元测试截图如图15所示
图15
修改后的代码如下
1 package demo;
2
3 import java.util.Scanner;
4
5 public class Maxsum {
6
7 public int setArry(int [] arry ) {
8 Scanner sc = new Scanner(System.in);
9 int num = sc.nextInt();
10
11 for(int i=0;i<num;i++){
12 arry[i]=sc.nextInt();
13 }
14
15 return num;
16 }
17
18 public int maxSum(int [] arry,int num){
19 int max=-100,sum=0;
20
21 for(int i=0;i<num;i++){
22 sum+=arry[i];
23 if(max<sum){
24 max=sum;
25 }
26 if(sum<0){
27 sum=0;
28 }
29 }
30 return max;
31 }
32
33 public static void main(String[] args){
34 Maxsum maxsum = new Maxsum();
35 int max=0,num=0;
36 int [] arry = new int [100];
37
38 num=maxsum.setArry(arry);
39 max=maxsum.maxSum(arry,num);
40
41 System.out.println(max);
42
43 }
44
45 }
错误原因是当数组中元素全为负数时max初始化为0,执行完sum+=arry[i]后,max<sum为false,此时max仍为0,之后sum<0为true,sum=0.继续循环下去的话max始终为零,解决方法可让max初始值为适当的负数即可。
运行结果如图16所示
图16
Coding地址:https://git.coding.net/kanjian2016/demo1.git
-
总结
- 从下载安装并配置eclipse到使用eclipse进行简单的单元测试,看似简单的步骤,没准就会在哪个步骤中出现意想不到的结果,在这期间进行资料查询与汇总显得至关重要。
- 本次只是进行简单的单元测试,关于用Junit 进行单元测试,还有许多要学习的地方。